Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] линейные однонаправленные списки


Автор: zavrrrrik 5.9.2007, 16:53
имееются линейные однонаправленные списки:
type 
p=^item;
item=record
data:real;
reference:p;
end;
написать программу, которая переносит в конец непустого списка l его превый элемент

Автор: volvo877 5.9.2007, 19:53
Вот так примерно:
Код

type
  p = ^item;
  item = record
    data: real;
    reference: p;
  end;

procedure add(var list: p; X: real);
var pt, new_p: p;
begin
  pt := list;
  while (pt <> nil) and (pt^.reference <> nil) do
    pt := pt^.reference;

  new(new_p);
  new_p^.data := X;
  new_p^.reference := nil;

  if pt <> nil then pt^.reference := new_p
  else list := new_p;
end;

procedure print(list: p);
var pt: p;
begin
  pt := list;
  while pt <> nil do begin
    write(pt^.data:5:2, ' ');
    pt := pt^.reference;
  end;
  writeln;
end;

var
  L, T: p;
  i: integer;

begin
  L := nil;
  { Заполняем список }
  for i := 1 to 10 do add(L, i);
  { Проверяем, что получилось }
  print(L);

  { Собственно, добавляем первый элемент в конец списка }
  add(L, L^.data);
  T := L;
  L := L^.reference;
  Dispose(T); { <--- Это чтобы избежать memory leak-а }

  { Ну, и опять смотрим... }
  print(L);
end.

Здесь есть одно НО: в программе память под элементы выделяется, но не возвращается (вернее, возвращается не везде)... Соответственно, получаем "утечку памяти", что очень сильно не любят преподаватели... Чтобы этого избежать, пробегай по всему списку и возвращай память, отданную под каждый элемент через Dispose...

Автор: zavrrrrik 5.9.2007, 20:13
Спасибо тебе большое.)))) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)