Wątek zablokowany 2011-10-09 18:00 przez madmike.

Dopisywanie danych do listy dwukierunkowej

0

Witam, mam problem z dopisywaniem danych do listy dwukierunkowej, otóż po wpisaniu kolejnych liczb program powinien je wpisać do listy w kolejności rosnącej, natomiast przy wyświetlaniu wypisuje jedynie jedną, ostatnią liczbę. Jest mi ktoś w stanie podpowiedzieć dlaczego tak się dzieje?

Type wsk=^elem;
     elem=record
      liczba,mnoznik:longint;
      pop,nast:wsk;
     end;

Type nodeList=^e;
     e=record
      first,last,tmp:wsk;
     end;

Var lista:nodeList;
    liczbaa:longint;

Procedure createList(var lista:nodelist);
 Begin
  lista^.first:=nil;
  lista^.last:=nil;
  lista^.tmp:=nil;
 End;

Procedure push(var lista:nodelist; dod:wsk; const ile:shortint);
 Var nowy:wsk;
     liczba:longint;
 Begin
  new(nowy);
  nowy^.liczba:=dod^.liczba;
  nowy^.mnoznik:=dod^.mnoznik;
  IF lista^.tmp=nil Then lista^.first:=nowy
                         Else
   Begin
    IF lista^.tmp^.nast<>nil Then
     Begin
      While lista^.tmp^.nast<>nil do
       Begin
       IF lista^.tmp^.liczba=nowy^.liczba Then
        Begin
         inc(lista^.tmp^.mnoznik,ile);
         IF lista^.tmp^.mnoznik=0 Then
          Begin
           lista^.tmp^.pop^.nast:=lista^.tmp^.nast;
           lista^.tmp^.nast^.pop:=lista^.tmp^.pop;
           dispose(lista^.tmp);
           Break;
          End;
        End;
       IF lista^.tmp^.liczba>nowy^.liczba Then
        Begin
         lista^.tmp^.pop^.nast:=nowy;
         nowy^.nast:=lista^.tmp;
         nowy^.pop:=lista^.tmp^.pop;
         lista^.tmp^.pop:=nowy;
        End;
       IF lista^.tmp^.liczba<nowy^.liczba Then
        Begin
         lista^.tmp^.nast:=nowy;
         nowy^.pop:=lista^.tmp;
        End;
       lista^.tmp:=lista^.tmp^.nast;
       End;
     End
      Else
     Begin
      IF lista^.tmp^.liczba>nowy^.liczba Then
       Begin
        lista^.tmp^.pop:=nowy;
        nowy^.nast:=lista^.tmp;
       End;
      IF lista^.tmp^.liczba<nowy^.liczba Then
       Begin
        lista^.tmp^.nast:=nowy;
        nowy^.pop:=lista^.tmp;
       End;
      IF lista^.tmp^.liczba=nowy^.liczba Then
       Begin
        inc(lista^.tmp^.mnoznik,ile);
        IF lista^.tmp^.mnoznik=0 Then
         Begin
          lista^.tmp^.pop^.nast:=lista^.tmp^.nast;
          lista^.tmp^.nast^.pop:=lista^.tmp^.pop;
         End;
       End;
     End;
   End;
 End;

Procedure readlist(var liste:wsk);
 Var tmpa:wsk;
 Begin
  tmpa:=liste;
  While tmpa<>nil do
   Begin
    WriteLn(' => ',tmpa^.liczba);
    tmpa:=tmpa^.nast;
   End;
 End;

Var i:byte;
    x:wsk;
    y:longint;

Begin
 New(lista);
 CreateList(lista);
 new(x);
 For i:=0 to 3 do
  Begin
   ReadLn(y);
   x^.liczba:=y;
   push(lista,x,1);
  End;
 readlist(lista^.first);
 Readln;
End.
1

takie pytanie - po co w liście jest tmp??

0

Hmm.. A ten kod jak się prezentuje? :P

Type wsk=^elem;
     elem=record
      liczba,mnoznik:longint;
      pop,nast:wsk;
     end;

Type nodeList=^e;
     e=record
      first,last:wsk;
     end;

Var lista:nodeList;
    liczbaa:longint;
    head:wsk;

Procedure createList(var lista:nodelist);
 Begin
  lista^.first:=nil;
  lista^.last:=nil;
 End;

Procedure push(var lista:nodelist; dod:wsk; const ile:shortint);
 Var nowy,rob:wsk;
     liczba:longint;
 Begin
  new(nowy); 
  nowy^.liczba:=dod^.liczba;
  nowy^.mnoznik:=dod^.mnoznik;
  IF head=nil Then head:=dod
                         Else
   Begin
    rob:=head;
    IF rob^.nast<>nil Then
     Begin
      While rob^.nast<>nil do
       Begin
       IF rob^.liczba=nowy^.liczba Then
        Begin
         inc(rob^.mnoznik,ile);
         IF rob^.mnoznik=0 Then
          Begin
           rob^.pop^.nast:=rob^.nast;
           rob^.nast^.pop:=rob^.pop;
           dispose(rob);
           Break;
          End;
        End;
       IF rob^.liczba>nowy^.liczba Then
        Begin
         rob^.pop^.nast:=nowy;
         nowy^.nast:=rob;
         nowy^.pop:=rob^.pop;
         rob^.pop:=nowy;
        End;
       IF rob^.liczba<nowy^.liczba Then
        Begin
         rob^.nast:=nowy;
         nowy^.pop:=rob;
        End;
       rob:=rob^.nast;
       End;
     End
      Else
     Begin
      IF rob^.liczba>nowy^.liczba Then
       Begin
        rob^.pop:=nowy;
        nowy^.nast:=rob;
       End;
      IF rob^.liczba<nowy^.liczba Then
       Begin
        rob^.nast:=nowy;
        nowy^.pop:=rob;
       End;
      IF rob^.liczba=nowy^.liczba Then
       Begin
        inc(rob^.mnoznik,ile);
        IF rob^.mnoznik=0 Then
         Begin
          rob^.pop^.nast:=rob^.nast;
          rob^.nast^.pop:=rob^.pop;
          dispose(rob);
         End;
       End;
     End;
   End;
 End;

Procedure readlist(var liste:wsk);
 Var tmpa:wsk;
 Begin
  tmpa:=liste;
  While tmpa<>nil do
   Begin
    WriteLn(' => ',tmpa^.liczba);
    tmpa:=tmpa^.nast;
   End;
 End;

Var i:byte;
    x:wsk;
    y:longint;

Begin
 New(lista);
 CreateList(lista);
 new(head);
 head:=nil;
 new(x);
 For i:=0 to 3 do
  Begin
   ReadLn(y);
   x^.liczba:=y;
   push(lista,x,1);
  End;
 readlist(head);
 Readln;
End.
0

a działa poprawnie?

0

Ten kod który wkleiłem, troszeczkę przerobiłem usuwając typ "nodeList" i wyświetla teraz poprawnie ilość liczb (tj. jak wprowadzę 4 to 4 wyświetli) ale są one zmienione. Tj zamiast 3 wypisuje mi po odczytaniu z listy np. -15580 i podobne do tego wartości :/ Będę musiał jeszcze trochę pokombinować.

0

Kod przekształciłem jeszcze raz. Teraz wygląda tak:

program dwukierunkowa;
uses crt;

type wskLista = ^element;
     element = record
     dane,ile: longint;
     pop : wskLista;
     nast : wskLista;
     end;

type nodeList = ^e;
     e = record
      first : wskLista;
      last: wskLista;
     end;

var
   lista: nodeList;
   wartosc : longint;
   co: char;

procedure createList(var lista : nodeList);
begin
lista^.first := nil;
lista^.last := nil;
end;

procedure readList(var lista : wskLista);
var
tmp : wskLista;
begin
writeln('Zawartosc Listy');
tmp := lista;

while tmp <> nil do
begin
write(' => ',tmp^.dane);
tmp := tmp^.nast;
end;
writeln;
end;

procedure push(var lista: nodeList; wart:wskLista);
var
nowy: wskLista;
rob:wskLista;
begin
new(nowy);
nowy^.dane := wart^.dane;
nowy^.ile:=wart^.ile;
if lista^.first<>nil then
 begin
  rob:=lista^.first;
  IF rob^.nast<>nil then
   begin
    while rob^.nast<>nil do
     begin
      if rob^.dane=nowy^.dane then
       begin
        rob^.ile:=rob^.ile+nowy^.ile;
        IF rob^.ile=0 Then
         Begin
          rob^.pop^.nast:=rob^.nast;
          rob^.nast^.pop:=rob^.pop;
          dispose(rob);
         End;
         Break;
       end;
      IF rob^.dane>nowy^.dane Then
       begin
        rob^.pop^.nast:=nowy;
        nowy^.nast:=rob;
        nowy^.pop:=rob^.pop;
        rob^.pop:=nowy;
        break;
       end;
      rob:=rob^.nast;
     end;
    IF rob^.dane<nowy^.dane Then
     begin
      rob^.nast:=nowy;
      nowy^.pop:=rob;
     end;
   end
    else
   begin
    if rob^.dane>nowy^.dane then
     begin
      lista^.first:=nowy;
      rob^.pop:=nowy;
      nowy^.nast:=rob;
     end;
    if rob^.dane<nowy^.dane then
     begin
      rob^.nast:=nowy;
      nowy^.pop:=rob;
     end;
    if rob^.dane=nowy^.dane then
     begin
      rob^.ile:=rob^.ile+nowy^.ile;
      if rob^.ile=0 Then
       begin
        rob^.pop^.nast:=rob^.nast;
        rob^.nast^.pop:=rob^.pop;
        dispose(rob);
       end;
   end;
   end;
 end
 else
  lista^.first:=nowy;
 end;

var x:wskLista;

begin
 new(lista);
 createList(lista);
 new(x);
 repeat
  clrscr;
  writeln('d - dodaj do listy');
  writeln('w - wypisz liste');
  writeln('q - koniec');
  co:=readkey;
  case co of
   'd': begin write('podaj warosc: '); read(wartosc); x^.dane:=wartosc; x^.ile:=1; push(lista, x); end;
   'w': begin readList(lista^.first); co:=readkey; end;
  end;
 until co='q';
end.

Problem w tym, że nie działa:

  1. dopisywanie elementu na pierwsze miejsce, gdy jest większa niż 1 liczba elementów
    przykład. dodaje do listy 10, następnie próbuję dodać do listy 5 i program wyłącza się z errorem. Skorzystałem z opcji "trace into" i wyszło, że błąd w takim przypadku jest przy rob.pop.nast:=nowy; niestety nie wiem jak go naprawić :/
  2. dopisywanie elementu na przedostatnie miejsce
    przykład. dodaje do listy 10, następnie 15 i potem 20, wszystko jak na razie działa pięknie, mogę dodać kolejne liczby np. 11, 14 i także będą działać, ale jeśli np. chcę dodać 16 albo 18 to liczby te po prostu się do listy nie dodają (żadnego błędu nie ma, po prostu jakby je program pomijał) i też nie za bardzo wiem jak to poprawić :/

Może ktoś pomóc? Bardzo proszę o pomoc ;)

0

Dobra, udało mi się rozwiązać te problemy ;p Usuwam kody źródłowe, temat może być zamknięty, usunięty jak kto woli :P

0

Wątek zablokowany z powodu usuwania treści postów :/

1 użytkowników online, w tym zalogowanych: 0, gości: 1