[Pascal] Listy jednokierunkowe-problem

Humanista123
Użytkownik
Użytkownik
Posty: 54
Rejestracja: 1 sty 2017, o 20:32
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 17 razy

[Pascal] Listy jednokierunkowe-problem

Post autor: Humanista123 »

Witajcie Mam problem z listami jednokierunkowymi.
Bo nie rozumiem takiej prostej procedury.
W zeszycie mam taką procedurę napisaną, która odwraca listę jednokierunkową.

Na bazie typu:

Kod: Zaznacz cały

type lista=^element;
element=record
pole: integer;
next :lista
end;
Kod:

Kod: Zaznacz cały

procedure odwroc (var h:lista);
var
l,u:lista;
begin
l:=nil;
while h<>nil do begin
   u:=h;
   h:=h^.next;
   u^.next:=l;
   l:=u;
   end;
h:=l;
end.
I nie wiem, czym jest ten typ lista. Bo w pętli while pracujemy i przypisujemy do u,l elementy tej list. A po pętli while przy linijce h:=l robimy tak jakbyśmy przypisywali całą tą listę, a nie tylko element jednej. Jak to jest? Proszę o pomoc
karakuku
Użytkownik
Użytkownik
Posty: 226
Rejestracja: 14 sie 2016, o 17:31
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 20 razy
Pomógł: 60 razy

Re: [Pascal] Listy jednokierunkowe-problem

Post autor: karakuku »

Gdy robimy dla x,y:lista:

Kod: Zaznacz cały

x:=y
to dzieje się to:

Kod: Zaznacz cały

x^.pole:=y^.pole
x^.next:=y^.next
Rysunek poglądowy:
Ukryta treść:    
Humanista123
Użytkownik
Użytkownik
Posty: 54
Rejestracja: 1 sty 2017, o 20:32
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 17 razy

Re: [Pascal] Listy jednokierunkowe-problem

Post autor: Humanista123 »

Dziękuję Ale linijka h:=l sugeruje, że przypisujemy całą listę.
SlotaWoj
Użytkownik
Użytkownik
Posty: 4211
Rejestracja: 25 maja 2012, o 21:33
Płeć: Mężczyzna
Lokalizacja: Kraków PL
Podziękował: 2 razy
Pomógł: 758 razy

Re: [Pascal] Listy jednokierunkowe-problem

Post autor: SlotaWoj »

Humanista123 pisze:

Kod: Zaznacz cały

type lista=^element;
element=record
pole: integer;
next :lista
end;
Błędy składni. Powinno być:

Kod: Zaznacz cały

type lista   : ^element;
type element : record
                 pole : integer;
                 next : lista
               end;
  • h := l;
Zmiennej h typu lista wskazującego zmienną typu element przypisywana jest wartość zmiennej l, również typu lista.

W terminologii Pascala wartość zmiennej wskazującej nazywamy wskazaniem.

Wartościami zmiennych h i l nie są listy (jako struktury danych). ale wskazania elementów list.

W Twoim kodzie należy odróżniać słowo lista jako identyfikator typu od słowa lista jako nazwa struktury danych.
Humanista123
Użytkownik
Użytkownik
Posty: 54
Rejestracja: 1 sty 2017, o 20:32
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 17 razy

Re: [Pascal] Listy jednokierunkowe-problem

Post autor: Humanista123 »

Ale w takim razie to wynikiem procedury jest tylko jeden element listy, na który wskazuje l?-- 21 sie 2017, o 23:47 --Problem jest taki, że to nie jest mój kod, tylko profesora, u którego mam zdawać egzamin i się staram go zrozumieć
SlotaWoj
Użytkownik
Użytkownik
Posty: 4211
Rejestracja: 25 maja 2012, o 21:33
Płeć: Mężczyzna
Lokalizacja: Kraków PL
Podziękował: 2 razy
Pomógł: 758 razy

Re: [Pascal] Listy jednokierunkowe-problem

Post autor: SlotaWoj »

Po wykonaniu procedury jej argument h wskazuje początek listy odwróconej, czyli koniec listy pierwotnej, przy czym jednocześnie w każdym elemencie przetwarzanej listy dodatkowo następuje (w trakcie wykonania procedury) nadanie nowej wartości polu next takiej, że nowym wskazaniem następnika elementu jest jego dotychczasowy poprzednik lub NIL dla pierwszego elementu listy pierwotnej.
Humanista123
Użytkownik
Użytkownik
Posty: 54
Rejestracja: 1 sty 2017, o 20:32
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 17 razy

Re: [Pascal] Listy jednokierunkowe-problem

Post autor: Humanista123 »

Czyli rozumiem, że w tej procedurze (var h:lista), to jest to wskaźnik na pierwszy element listy, tak?
SlotaWoj
Użytkownik
Użytkownik
Posty: 4211
Rejestracja: 25 maja 2012, o 21:33
Płeć: Mężczyzna
Lokalizacja: Kraków PL
Podziękował: 2 razy
Pomógł: 758 razy

Re: [Pascal] Listy jednokierunkowe-problem

Post autor: SlotaWoj »

Tak!

Ale (terminologicznie) wskaźniki są w języku C. W terminologii Paskala polskiemu słowu wskaźnik odpowiada angielski flag, a słowom wskazanie i wskazującypointer.

W Pascalu w ww. procedurze zapis var h : lista; definiuje (po zastosowaniu definicji typu lista) zmienną typu wskazującego zmienną typu element i jej wartością są wskazania.
Humanista123
Użytkownik
Użytkownik
Posty: 54
Rejestracja: 1 sty 2017, o 20:32
Płeć: Mężczyzna
Lokalizacja: Polska
Podziękował: 17 razy

Re: [Pascal] Listy jednokierunkowe-problem

Post autor: Humanista123 »

Dzięki wielkie
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6908
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

Re: [Pascal] Listy jednokierunkowe-problem

Post autor: Mariusz M »

Procedura znaleziona w sieci

Kod: Zaznacz cały

procedure odwroc(var h:lista);
var p,q,r:lista;
begin
    p:=nil;
    q:=h;
    r:=nil;
    if not(q=nil)then
        r:=q^.next;
    while not(q=nil)do
    begin
        q^.next:=p;
         p:=q;
         if not(r=nil)then
            r:=r^.next;
    end;
    h:=p;
end;
ODPOWIEDZ