110 likes | 232 Views
Реализация на свързан списък. 1. Декларации определящи свързан списък ( синтаксис ). Type T=integer; List=^DBox; DBox=record inf:T; addr:List end; Var P:List;. 2. Семантика на декларацията. Задава се свързан списък Р с базов тип Т, представен с една връзка.
E N D
1. Декларации определящи свързан списък (синтаксис) Type T=integer; List=^DBox; DBox=record inf:T; addr:List end; Var P:List;
2. Семантика на декларацията • Задава се свързан списък Р с базов тип Т, представен с една връзка. • Променливата Р е указател към запис от тип DBox с две полета: • Inf- съдържа стойността на компонентата на списъка; • addr- съдържа адреса на следващата компонента на списъка. • Графична илюстрация: P^: DBox Р P^.inf:T P^.addr:List
3. Операции със свързан списък • Създаване на празен свързан списък: Procedure Create_Empty_List(var p:List); Begin p:=nil end; • Проверка за празен свързан списък: function Empty_List(p:List):boolean; begin Empty_List:=p=nil end; • Извличане на стойността на първата компонента: function First(p:List):T; begin if not Empty_List(p) then First:=p^.inf end;
Достъп до следващата компонента: Function Next(p:List):List; begin if not Empty_List(p) then Next:=p^.addr end; • Добавяне на елемент пред първия елемент на свързан списък: procedure Insert1(var p:List; elem:T); var r:List; begin new(r); r^.inf:=elem; r^.addr:=p; p:=r end;
Добавяне на елемент след указан елемент: procedure Insert2(var p:List; q:List; elem:T); var r:List; begin new(r); r^.inf:=elem; r^.addr:=q^.addr; q^.addr:=r end;
Добавяне на елемент пред указан елемент: procedure Insert3(var p:List; q:List; elem:T); var r:List; begin if q=p then Insert1(p,elem) else begin r:=p; while r^.addr<>q do r:=r^.addr; Insert2(p,r,elem) end end;
Отстраняване на първия елемент: procedure Delete1(var p:List; var elem:T); var s:List; begin if not Empty_List(p) then begin s:=p; elem:=p^.inf; p:=p^addr; dispose(s) end end;
Отстраняване на елемент след указан елемент: procedure Delete2(var p:List; q:List; var elem:T); var s:List; begin if q^.addr<>nil then begin s:=q^.addr; elem:=s^.inf; q^.addr:=s^.addr; dispose(s) end end;
Отстраняване на елемент сочен от даден указател: procedure Delete(var p:List; q:List; var elem:T); var r:List; begin if q=p then Delete1(p,elem) else begin r:=p; while r^.addr<>q do r:=r^.addr; Delete2(p,r,elem) end end;
4. Задачи върху свързани списъци • Задача 1: да се напише функция, която намира дължината на свързан списък: function Size(p:List):integer; var i:integer; begin i:=0 while not Empty_List(p) do begin i:=i+1; p:=Next(p) end; Size:=i end;