Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_po_PAYa_2-y_semestr.doc
Скачиваний:
5
Добавлен:
27.10.2018
Размер:
453.12 Кб
Скачать

Объявление списочной структуры в Паскале.

Type T={базовый тип, компонента списка}

component=record

info:T;

next:^component;

end;

Определение такого типа недопустимо в синтаксисе Паскаля, но возможно описание следующего вида:

type T={ };

pComponent=^tComponent;

tComponent=record

info:T;

next:pComponent;

end;

Базовое правило «тип можно определять лишь в терминах уже описанных типов» имеет единственное исключение – ссылку на тип можно определять раньше, чем сам тип. Это единственная форма рекурсивного определения, допустимая в Паскале.

Реализация стеков.

Procedure Push(top:pComponent;x:T);

{Стек задаётся списком, top, в свою очередь, - ссылкой на первый элемент (голову списка)}

top

nil

var p:pComponent;

begin

new(p);

p^.info:=x;

top:=p;

end;

procedure Pop(var top:pComponent;var x:T);

var p:pComponent;

begin

p:=top;

x:=top^.info;

top:=top^.next;

dispose(p);

end;

function Empty(top:pComponent):boolean;

begin

empty:=top=nil;

end;

{Соответствует инициализации в случае, когда стек ещё не существует и уже существует}

procedure Create(var top:pComponent);

{Создать пустой стек}

begin

top:=nil;

end;

procedure Destroy(var top:pComponent);

begin

while top<>nil do

begin

p:=top^.next;

dispose(top);

top:=p;

end;

end;

Реализация очередей.

{Дан член последовательности, который надо исключить и сама последовательность}

procedure Put(a:T;с:pComponent);

var p:pComponent;

begin

new(p);

p^.info:=a;

p^.next:=nil;

c^.next:=p;

с:=p;

end;

procedure Create(b,c:pComponent);

{Указатели на начало и конец очереди}

var p:pComponent;

begin

new(p);

p^.info:=zero; {zero=const – нулевой элемент}

p^.next:=nil;

b:=p;

c:=p;

end;

procedure Get(a:T;var b:pComponent);

{Ссылка на «болванчик»}

var first:pComponent;

{Ссылка на первый элемент}

begin

first:=b^.next; {по моему здесь должно быть b, т.е. first:=b}

a:=first^.info;

b^.next:=first^.next;{b:=first^.next}

dispose(first);

end;

function Empty(b:pComponent):boolean;

begin

empty:=b^.next=nil;

end;

Основные операции над списками.

Операции:

  1. Конкатенация списка;

  2. Вставка компоненты после, до или вместо заданной;

  3. Выделение подсписка.

Во всех случаях списки задаются ссылкой на начало и конец.

firsta lasta

 

firstb lastb

concat

lasta^.next:=firstb;

Вставка после:

firsta vstavka lasta

  



firstb lastb

 

lastb^.next:=vstavka^.next;

vstavka^.next:=firstb;

Вставка до:

lastb^.next:=vstavka^.next;

vstavka^.next:=firstb^.next;

x:=vstavka^.info; вставка вместо

vstavka^.info:=firstb^.info;

firstb^.info:=x;

firstb^.next:=lastb^.next;

lastb^.next:=firstb;

Упражнение. Выделение и включение подсписка, если задана ссылка на конец подсписка и

а) голову (первый компонент);

б) стоящий перед ним.

В этих задачах удобнее считать, что у каждой компоненты, хранящей члены последовательности, есть следующая и предыдущая.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]