Другие языки программирования и технологии

Pascal, структура данных двусвязанный список

1. Написать программу для работы со структурой данных "Двусвязный список".
2. Структура данных должна быть реализована на основе статической памяти.
3. Работа со структурой должна осуществляться с помощью case-меню. Предусмотреть
наглядную визуализацию содержимого структуры.
Только слепо не копируй, перепиши сам изменив под себя, а то препод нагуглит откуда ты это взял:
 program DoublyLinkedList; 

type
Node = record
Data: integer;
Next: ^Node;
Prev: ^Node;
end;
List = ^Node;

var
Head, Tail, NewNode: List;
Choice: integer;

procedure AddNode(var Head, Tail, NewNode: List);
begin
NewNode := new(List);
Write('Enter Data: ');
Readln(NewNode^.Data);
if Head = nil then begin
Head := NewNode;
Tail := NewNode;
NewNode^.Prev := nil;
end else begin
Tail^.Next := NewNode;
NewNode^.Prev := Tail;
Tail := NewNode;
end;
NewNode^.Next := nil;
end;

procedure DeleteNode(var Head, Tail: List; var DelNode: List);
var
Current: List;
begin
if DelNode^.Prev = nil then begin
Head := DelNode^.Next;
Head^.Prev := nil;
end else if DelNode^.Next = nil then begin
Tail := DelNode^.Prev;
Tail^.Next := nil;
end else begin
Current := DelNode^.Prev;
Current^.Next := DelNode^.Next;
Current := DelNode^.Next;
Current^.Prev := DelNode^.Prev;
end;
Dispose(DelNode);
end;

procedure ViewList(var Head: List);
var
Current: List;
begin
Current := Head;
while Current nil do begin
Writeln(Current^.Data);
Current := Current^.Next;
end;
end;

begin
Head := nil;
Tail := nil;
repeat
Writeln('1. Add Node');
Writeln('2. Delete Node');
Writeln('3. View List');
Writeln('4. Exit');
Writeln('Enter your choice: ');
Readln(Choice);
case Choice of
1: AddNode(Head, Tail, NewNode);
2: begin
Writeln('Enter node to be deleted: ');
Readln(NewNode^.Data);
DelNode := Head;
while DelNode^.Data NewNode^.Data do
DelNode := DelNode^.Next;
DeleteNode(Head, Tail, DelNode);
end;
3: ViewList(Head);
4: ;
end;
until Choice = 4;
end.
Владимир Фаерман
Владимир Фаерман
51 364
Лучший ответ
Двусвязный список в СТАТИЧЕСКОЙ памяти реализуется примерно так:
 type list = record
head: integer; {индекс первого элемента списка в nodes}
tail: integer; {индекс последнего элемента списка в nodes}
current: integer; {индекс текущего элемента списка в nodes}
empty: integer; {индекс начала списка незанятых элементов в nodes}
nodes: array [1..1000] of record {массив элементов списка}
data: integer; {значение элемента списка}
next: integer; {индекс следующего элемента списка в nodes}
prev: integer; {индекс предыдущего элемента списка в nodes}
end
end;
Вместо указателей - индексы в массиве nodes. В данном случае максимальная длина списка ограничена 1000 элементов.

Фактически, в данной структуре два списка: двусвязный рабочий список, и односвязный список незанятых элементов (который надо инициализировать в начале работы). При добавлении в список берём первый элемент из списка незанятых и вставляем его в рабочий список. При удалении из списка удаляемый элемент вставляем в начало списка незанятых.
Фока
Фока
91 529