Помощь - Поиск - Пользователи - Календарь
Полная версия: Односвязный список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
nikita182
файл исходных данных содержит:

D9 372
A7 8633 8634
H5 4107 4108
E6 1525

список имеет вид:
Нажмите для просмотра прикрепленного файла


собственно, мне не понятно как такой список сформировать..
натолкните, пожалуйста на мысль..
volvo
Попробуй поиск по слову "мультисписок"... Я как-то выкладывал нечто подобное.
nikita182
Цитата(volvo @ 24.05.2007 20:18) *

Попробуй поиск по слову "мультисписок"... Я как-то выкладывал нечто подобное.


вот, нашел только это:
мультисписок

взял оттуда ту программу, которую ты написал и попробовал вывести на экран массив:
1 2 3
4 5 6
7 8 9

но напечаталась только последняя строка. либо я неправильно вывожу на печать, либо еще что-то..

вот текст программы:


uses crt;

type
plist = ^tlist;
tlist = record
col_num, value: integer;
next: plist;
end;

pvector = ^tvector;
tvector = record
row_num: integer;
next: pvector;
end;

var
f: text;
pl, pl_first, pl_last: plist;
pv, pv_first, pv_last: pvector;

i, j, X: integer;

begin
clrscr;
assign(f, '---.txt');
reset(f);

pv_first := nil; pv_last := nil;

i := 1;
while not seekeof(f) do begin

j := 1; pl_first := nil; pl_last := nil;

while not seekeoln(f) do begin

read(f, X);

if X <> 0 then begin

new(pl);
pl^.value := x;
pl^.col_num := j;
pl^.next := nil;

if pl_first = nil then pl_first := pl
else pl_last^.next := pl;
pl_last := pl;

inc(j);
end;

end;
readln(f);

if pl_first <> nil then begin
new(pv);
pv^.row_num := i;
pv^.next := nil;

if pv_first = nil then pv_first := pv
else pv_last^.next := pv;
pv_last := pv;
end;

inc(i);
end;

close(f);



pl := pl_first; pv := pv_first;
while pv <> nil do begin
while pl <> nil do begin
write (pl^.value);
pl := pl^.next; {собственно, добавил только этот кусок}
end;
writeln;
pv := pv^.next;
end;



readkey;
end.


volvo
Я ж написал, что это - только набросок... Вот так работает:

{ немного меняем тип TVector ... }

pvector = ^tvector;
tvector = record
row_num: integer;
child: plist;
next: pvector;
end;

{ ... и саму программу: }
...

{ до этого - все правильно }

if pl_first <> nil then begin
new(pv);
pv^.row_num := i;
pv^.next := nil;

if pv_first = nil then pv_first := pv
else pv_last^.next := pv;
pv_last := pv;

pv_last^.child := pl_first; { <--- Вот этого не хватало !!! }
end;

inc(i);
end;
close(f);


{ Ну, и печать, естественно тоже корректируем: }
pv := pv_first;
while pv <> nil do begin

pl := pv^.child;
while pl <> nil do begin

write (pl^.value:5);
pl := pl^.next;

end;
writeln;

pv := pv^.next;
end;
...


nikita182
т.е. ты добавил указатель на следующую строку?


child: plist;

volvo
Я добавил указатель на дочерний список.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.