Новосибирский Государственный Университет
Опубликован: 08.11.2006 | Доступ: свободный | Студентов: 1895 / 92 | Оценка: 4.27 / 4.09 | Длительность: 12:16:00
Специальности: Программист
Лекция 11:

Алгоритмы на абстрактных структурах данных

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >

Связанные списки

Связанный список представляет собой структуру данных, которая состоит из узлов (как правило, записей), содержащих указатели на следующий узел. Указатель, который ни на что не указывает, снабжается значением nil. Таким образом, в каждый элемент связанного списка добавляется указатель (звено связи).

Приведем основные базисные операции для работы с однонаправленным связанным списком.

  1. Включение элемента после элемента:
Link[q]:=link[p];
Link[p]:=q;

Здесь qиндекс элемента, который должен быть вставлен в список после элемента с индексом p.

  1. Исключение преемника элемента x:
If link[x]<>null then
Link[x]:=[link[x]]
else
\{Элемент x не имеет преемника\};

Отметим, что элемент, следующий в списке за элементом x, называется преемником элемента x, а элемент, pасположенный перед элементом x, называется предшественником элемента x. Если элемент x не имеет преемника, то содержащемуся в нем указателю присваивается значение nil.

  1. Включение элемента y перед элементом x:
Prev:=0;
While(link[prev]<>nil)and(link[prev]<>x)do
Prev:=link[prev];
If link[prev]=x then
Btgin link[prev]:=y; link[y]:=x end
Else
\{Элемент x не найден\};
Здесь link[0]является началом списка.

Отметим, что исключение последнего элемента из однонаправленного списка связано с просмотром всего списка.

В двунаправленном связанным списке каждый элемент имеет два указателя (succlink - описывает связь элемента с преемником, predlink - с предшественником).

Приведем основные базисные операции для работы с двунаправленным связанным списком.

Ответ 1 Включение y перед элементом x:

Succlink[y]:=x;
Predlink[y]:=predlink[x];
Succlink[predlink[x]]:=y;
Predlink[x]:=y;

Ответ 2 Включение элемента y после элемента x:

Succlink[y]:=succlink[x];
Predlink[y]:=x;
Predlink[succlink[x]]:=y;
Succlink[x]:=y;

Ответ 3 Исключение элемента x.

Predlink[succlink[x]]:=predlink[x];
Succlink[predlink[x]]:=succlink[x];

Программа 3.Список целых чисел.

{Создается список целых чисел. Числа выбираются  случайным образом 
из интервала 0..9999, затем он упорядочивается,
сначала - по возрастанию, затем - по убыванию.
Программа написана на языке программирования Turbo-Pascal}

uses crt;
type TLink=^Link;
     Link=record
      v : integer;
      p, n : TLink
     end;

var i : integer;
    p, q, w : TLink;
    s1,s2,rs : TLink;

procedure Sort( sp : TLink; t : integer );
 var temp : integer;
begin
q:=sp;
while q^.n<>nil do begin
 q:=q^.n;
 p:=sp;
 while p^.n<>nil do begin
  if (p^.v-p^.n^.v)*t>0 then begin
    temp:=p^.v;
    p^.v:=p^.n^.v;
    p^.n^.v:=temp;
  end;
  p:=p^.n;
 end;
end;
end;

function CreatRndSpis(deep : integer):TLink;
begin
new(q);
for i:=1 to deep do begin
 if i=1 then begin
  p:=q;q^.p:=nil;
 end;
 q^.v:=random(9999);
 new(q^.n);
 q^.n^.p:=q;
 q:=q^.n;
end;
q^.p^.n:=nil;
dispose(q);
CreatRndSpis:=p;
end;

function CreatSortDawnSpis(deep : integer):TLink;
begin
if deep<9999 then begin
 new(q);
 for i:=1 to deep do begin
  if i=1 then begin
   q^.p:=nil;p:=q;
  end;
  q^.v:=random(round(9999/deep))+round(9999*(1-i/deep));
  new(q^.n);
  q^.n^.p:=q;
  q:=q^.n;
 end;
 q^.p^.n:=nil;
 dispose(q);
end else p:=nil;
CreatSortDawnSpis:=p;
end;

procedure Show( s : TLink; sp: integer );
 var i : integer;
begin
 p:=s;
 i:=1;
 while p<>nil do begin
  gotoxy(sp,i);write(' ' : 5); gotoxy(sp,i);writeln(p^.v);
  p:=p^.n;
  inc(i);
 end;
end;

function min( c1, c2 : integer) : integer;
begin
case c1<c2 of
 true : min:=c1;
 false: min:=c2;
end;
end;

function CreatConcSortUpSpis( sp1, sp2 : TLink ) : TLink;
begin
 q:=sp1;while q^.n<>nil do q:=q^.n;
 w:=sp2;while w^.n<>nil do w:=w^.n;
 new(p);

CreatConcSortUpSpis:=p;
 p^.p:=nil;
 while(w<>nil)and(q<>nil)do begin
  if(w<>nil)and(q<>nil)then begin
   p^.v:=min(q^.v,w^.v);
   case p^.v=q^.v of
    true : q:=q^.p;
    false: w:=w^.p;
   end;
   new(p^.n);
   p^.n^.p:=p;
   p^.n^.n:=nil;
   p:=p^.n;
  end;
  if(w=nil)and(q<>nil)then begin
   while q<>nil do begin
    p^.v:=q^.v;q:=q^.p;
    new(p^.n);
    p^.n^.p:=p;
    p^.n^.n:=nil;
    p:=p^.n;
   end;
  end;
  if(w<>nil)and(q=nil)then begin
   while w<>nil do begin
    p^.v:=w^.v;w:=w^.p;
    new(p^.n);
    p^.n^.p:=p;
    p^.n^.n:=nil;
    p:=p^.n;
    end;
  end;
 end;
 p^.p^.n:=nil;
 dispose(p);
end;

begin
clrscr;
randomize;
s1:=CreatRndSpis(15);Sort(s1,-1);
s2:=CreatRndSpis( 5);Sort(s2,-1);
rs:=CreatConcSortUpSpis(s1,s2);
Show(s1,10);
Show(s2,20);
Show(rs,30);
Sort(rs,-1);
Show(rs,40);
readln;
end.
< Лекция 10 || Лекция 11: 1234 || Лекция 12 >