Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Односвязный список

Автор: nikita182 24.05.2007 22:11

файл исходных данных содержит:

D9 372
A7 8633 8634
H5 4107 4108
E6 1525

список имеет вид:
Прикрепленное изображение


собственно, мне не понятно как такой список сформировать..
натолкните, пожалуйста на мысль..


Эскизы прикрепленных изображений
Прикрепленное изображение

Автор: volvo 24.05.2007 23:18

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

Автор: nikita182 25.05.2007 0:26

Цитата(volvo @ 24.05.2007 20:18) *

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


вот, нашел только это:
http://forum.pascal.net.ru/index.php?showtopic=8340&hl=%EC%F3%EB%FC%F2%E8%F1%EF%E8%F1%EE%EA

взял оттуда ту программу, которую ты написал и попробовал вывести на экран массив:
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 25.05.2007 0:41

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

{ немного меняем тип 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 25.05.2007 0:52

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


child: plist;


Автор: volvo 25.05.2007 0:54

Я добавил указатель на дочерний список.