Помощь - Поиск - Пользователи - Календарь
Полная версия: Односвязный список
Форум «Всё о Паскале» > 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
Я добавил указатель на дочерний список.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.