Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.147.89.47] |
|
Сообщ.
#1
,
|
|
|
Ребят, у меня большая просьба. Может это кому-то покажется как нечего делать, но мне сложно разобраться в линейном списке. Я тут обложился книгами, но понял не много, вот написал программку, которая добавляет элементы в список и выводит, что-то не работает, и еще некоторые строчки не понятны и в книге не прокомментированы, объясните?
я учусь пока программировать..... program ochered; uses crt; type p=^item; item=record info: string[20]; next: p; end; var Po,PoE,PoB: p; i: integer; x: string[20]; begin clrscr; write('Введите значение: '); readln(x); new(Po); Po^.info:=x; Po^.next:=nil; {------------------------------} { << Как объяснить эти две строчки? } PoB:=Po; PoE:=Po; {------------------------------} i:=1; repeat write('Введите значение: '); readln(x); new(Po); Po^.info:=x; Po^.next:=nil; {------------------------------} { << Как объяснить эти две строчки? } PoE^.next:=Po; PoE:=Po; {------------------------------} until x='q'; {-------------------------------------------} {А это видимо совсем не правильно, т.к. без книг писал, сам неразобравшись... } PoE^.next:=nil; while PoE<>nil do begin writeln(Po^.info); Po:=Po^.next; end; {--------------------------------------------} end. |
Сообщ.
#2
,
|
|
|
PoB:=Po; PoE:=Po; * Это указатели на первый и последний элемнт в списке соответственно... Т.к. введено только одно значение, первый и последний элемент находится по выделенному адресу Po. PoE^.next:=Po; PoE:=Po; * Здесь ситуация такая: PoE (до исполнения этих строк) ещё указывает на первый элемент, так что первая строка просто заносит в next указатель на только что созданный элемент. А вторая строка присваивает PoE адрес последнего (только что созданного элемента). PoE^.next:=nil; while PoE<>nil do begin writeln(Po^.info); Po:=Po^.next; end; * Здесь так: PoE^.next уже имеет значение nil, т.к. было выполнено (последнее) Po^.next:=nil; . Подумай: PoE указывает на последний элемент, значит на последний созданный Po. * PoE у тебя не меняется внутри While, так что While у тебя будет бесконечным... * Попробуй так: Po := PoB; While Po <> nil do Begin WriteLn(Po^.info); Po := Po^.next End; |
Сообщ.
#3
,
|
|
|
В предыдущей программе я понял как создать добавление в список, но там реалезуется добавление с конца, а теперь я немного перестроил ее, так, чтобы добавление шло в начало списка, так вот что-то не работает, гляньте пожалуйста?
program ochered; uses crt; type p=^item; item=record info: string[20]; next: p; end; var Po,PoE,PoB: p; i: integer; x: string[20]; begin clrscr; write('Введите элемент: '); readln(x); new(Po); Po^.info:=x; Po^.next:=nil; PoB:=Po; PoE:=Po; repeat write('Введите элемент: '); readln(x); new(Po); Po^.info:=x; //Вот тут в новосозданный указатель помещяаю значение на предыдущий, так? (этот новый как бы перед предыдущим стоит, т.к. в начало добавление, а не в конец где nil присваиваем...) Po^.next:=PoE; //и тут PoB получает адресс только-что новосозданного элта, так? PoB:=Po; until x='q'; //Вот тут в начало как бы скачок идет, где лежит последнее введенное значение, так? Po:=PoB; while Po<>nil do begin //Так а чего он печатать начинает не так? (ну я вводил например q1 q2 q3 q4 q и по идее печатать должен q q4 q3 q2 q1 раз в начало добавляли, а он на q1 прерывается да еще и НАЧИНАЕТ с него печатать, вернее q q1 и все... а должен на q1 прирваться, когда все предыдущие распечатает.....) writeln(Po^.info); Po:=Po^.next; end; end. |
Сообщ.
#4
,
|
|
|
program ochered2; uses crt; type p=^item; item=record info: string[20]; next: p; end; var Po,PoE,PoB: p; i: integer; x: string[20]; begin clrscr; write('Введите элемент: '); readln(x); new(Po); Po^.info:=x; Po^.next:=nil; PoB:=Po; PoE:=Po; repeat write('Введите элемент: '); readln(x); new(Po); Po^.info:=x; Po^.next:=PoB;PoB:=Po; until x='q'; Po:=PoB; while Po<>nil do begin writeln(Po^.info); Po:=Po^.next; end; end. Как видишь поменялось немногое... |
Сообщ.
#5
,
|
|
|
Одно меня смущает... Если вы все равно смотрите в nil - то зачем вам переменные начала и конца списка? Разве неясно, что первый nil - начало, а второй - конец?
|
Сообщ.
#6
,
|
|
|
NOPIKу
Получается, что я лишний1 указатель чтоли ввел? да это в книжке так, я просто разбираться пытаюсь... |