Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ADT-Liste Listenelement anhaengen (https://www.delphipraxis.net/111671-adt-liste-listenelement-anhaengen.html)

ajaxson 7. Apr 2008 16:48


ADT-Liste Listenelement anhaengen
 
hy

ich hab eine ADT-Liste erstellt und hab nun ein Problem mit der Listenoperation element_anhaengen...
Delphi-Quellcode:
procedure anhaengen(element:integer;var liste:TRIngliste);
var neues:TZeiger;
begin
 NEW(neues);
 neues^.inhalt:=element;
 neues^.naechster:=ringliste.erstes;
 if not (leer(liste)) then begin
                      ringliste.letzte^.naechster:=neues;
                      ringliste.letzte:=neues;
                      ringliste.aktuelles:=neues;
                     end
               else begin
                      Ringliste.erstes:=neues;
                      Ringliste.aktuelles:=neues;
                      Ringliste.letzte:=neues;
                    end;
end;
es werden irgendwie keine listen elemente angehängt

kann mir einner helfen?

shmia 7. Apr 2008 17:08

Re: ADT-Liste Listenelement anhaengen
 
Wieso hast du einen Übergabeparameter namens liste, wenn du doch auf der wohl globalen Variable ringliste rumreitest ?
Und wieso programmierst du eine ganz gewöhnliche procedure anhaengen anstatt aus TRIngliste eine Klasse zu machen ?

ajaxson 7. Apr 2008 17:15

Re: ADT-Liste Listenelement anhaengen
 
mh ok hat sich erledigt...lag am hauptprogramm und nicht an der unit adtliste..
die unit dürfte funktionieren..ich poste mal das ganze ding..

Delphi-Quellcode:
unit ADTRIngliste;

interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type TInhalt=integer;
     TZeiger=^TElement;
     TElement=Record
               inhalt:TInhalt;
               naechster:TZeiger;
              end;

     TRingliste = Record
               erstes,aktuelles,letzte:TZeiger;
             end;

procedure erzeugen(var liste:TRIngliste);
procedure gehe_naechstes(var liste:TRIngliste);
procedure anhaengen(element:integer;var liste:TRIngliste);
procedure loeschen(var liste:TRIngliste);
function leer(liste:TRIngliste):boolean;
procedure gehe_erstes(var liste:TRIngliste);
function hole(liste:TRIngliste):TInhalt;
procedure SchreibeEintrag(var liste:TRingliste;inhalt:TInhalt);

var Ringliste:TRingliste;


implementation

procedure erzeugen(var liste:TRIngliste);
begin
  Ringliste.erstes:=NIL;
  Ringliste.aktuelles:=NIL;
  Ringliste.letzte:=NIL;
end;

function leer(liste:TRIngliste):boolean;
begin
 if Ringliste.erstes=NIL then result:=true
                         else result:=false;
end;

procedure gehe_erstes(var liste:TRIngliste);
begin
if not leer(liste) then Ringliste.aktuelles:=Ringliste.erstes
              else showmessage('Liste Leer');
end;

Procedure gehe_naechstes(var liste:TRIngliste);
begin
 if not (leer(liste)) then
                RIngliste.aktuelles:=Ringliste.aktuelles^.naechster
               else
                showmessage('Liste Leer');
end;

function hole(liste:TRIngliste):TInhalt;
begin
  if not (leer(liste)) then result:=ringliste.aktuelles^.inhalt
               else
                showmessage('Liste Leer');
end;

procedure anhaengen(element:integer;var liste:TRIngliste);
var neues:TZeiger;
begin
 NEW(neues);
 neues^.inhalt:=element;
 neues^.naechster:=ringliste.erstes;
 if not (leer(liste)) then begin
                      ringliste.letzte^.naechster:=neues;
                      ringliste.letzte:=neues;
                      ringliste.aktuelles:=neues;
                     end
               else begin
                      Ringliste.erstes:=neues;
                      Ringliste.aktuelles:=neues;
                      Ringliste.letzte:=neues;
                    end;
end;

function davor(liste:TRingliste):TZeiger;
var zeiger:TZeiger;
begin
    if liste.aktuelles=liste.erstes then result:=NIL
    else begin
        zeiger:=liste.erstes;
        while zeiger^.naechster <> liste.aktuelles do zeiger:=zeiger^.naechster;
    end;
   result:=zeiger;
end;

procedure SchreibeEintrag(var liste:TRingliste;inhalt:TInhalt);
begin
 if not(leer(liste)) then
  ringliste.aktuelles^.inhalt:=inhalt;
end;

procedure loeschen(var liste:TRingliste);
var voraktuelles,blub:TZeiger;
begin
    if not(leer(liste)) then
    begin
        if liste.erstes=liste.letzte then
        begin
            dispose(liste.aktuelles);
            liste.aktuelles:=NIL;
            liste.letzte:=NIL;
            liste.erstes:=NIL;
        end
        else if liste.aktuelles=liste.letzte then
        begin
            voraktuelles:=davor(liste);
            dispose(liste.letzte);
            liste.letzte:=voraktuelles;
            liste.letzte^.naechster:=liste.erstes;
            liste.aktuelles:=liste.erstes;
        end
        else if liste.aktuelles=liste.erstes then
        begin
            liste.aktuelles:=liste.aktuelles^.naechster;
            dispose(liste.erstes);
            liste.erstes:=liste.aktuelles;
            liste.aktuelles:=liste.erstes;
        end
        else begin
            voraktuelles:=davor(liste);
            blub:=liste.aktuelles^.naechster;
            dispose(liste.aktuelles);
            liste.aktuelles:=blub;
            voraktuelles^.naechster:=liste.aktuelles;
        end;
    end;
end;

end.

shmia 7. Apr 2008 17:20

Re: ADT-Liste Listenelement anhaengen
 
Zitat:

Zitat von ajaxson
mh ok hat sich erledigt...lag am hauptprogramm und nicht an der unit adtliste..
die unit dürfte funktionieren..ich poste mal das ganze ding..

Das ist trotzdem noch schlecht programmiert. :warn:
Alle deine Funktionen haben einen Übergabeparameter var liste:TRIngliste.
Aber du benützt den Übergabeparameter nicht. :(
Stattdessen verwendest du immer die globale Variable Ringliste.

ajaxson 7. Apr 2008 17:31

Re: ADT-Liste Listenelement anhaengen
 
und wie wär es besser? soll ich var:liste etc.. rauslassen?

ich verwende ja die unit in meinem hauptprogramm..müssen sich da die proceduren nicht auf die liste beziehen...

shmia 7. Apr 2008 18:19

Re: ADT-Liste Listenelement anhaengen
 
Zitat:

Zitat von ajaxson
und wie wär es besser? soll ich var:liste etc.. rauslassen?

ich verwende ja die unit in meinem hauptprogramm..müssen sich da die proceduren nicht auf die liste beziehen...

Du solltest schon etwas mitdenken.
Angenommen du willst zwei Listen haben.
Du würdest also schreiben:
Delphi-Quellcode:
var
  ListeA, ListeB : TRIngliste;

...
  erzeugen(ListeA);
  erzeugen(ListeB);
  anhaengen(42, ListeA);
  anhaengen(66, ListeB);
So und jetzt schau dir mal deine Prozeduren an!
Delphi-Quellcode:
procedure erzeugen(var liste:TRIngliste);
begin
  { FALSCH
  Ringliste.erstes:=NIL;
  Ringliste.aktuelles:=NIL;
  Ringliste.letzte:=NIL;
  }
  // Richtig
  liste.erstes:=NIL;
  liste.aktuelles:=NIL;
  liste.letzte:=NIL;
end;
Und das gilt nicht nur für "erzeugen", sondern für alle deine Prozeduren.
Du solltest deine globale Variable Ringliste auskommentieren.

ajaxson 9. Apr 2008 16:59

Re: ADT-Liste Listenelement anhaengen
 
achso..gut jetzt hats klick gemacht...ich werds überarbeiten..

danke für deine hilfe :thumb: :thumb: :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz