Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2010, 15:41   #1
apkoc
Новичок
Джуниор
 
Регистрация: 23.06.2010
Сообщений: 1
По умолчанию Задача на динамические списки (pascal)

Подскажите: что дописать чтобы все работало правильно? тому кто подскажет как решить задачу будет вознаграждение...
{задача: Описать процедуру, которая вставляет:
а)новый элемент D после первого элемента непустого спис-
ка L.
б) в непустой список L пару новых элементов Е1 и Е2 перед
его последним элементом. }
type
{ элемент списка }
PListItem = ^TListItem;
TListItem = record
value: integer;
pNext: PListItem;
pPrev: PListItem;
end;
const
{ размер списка }
LIST_SIZE = 10;
{ максимальное значение в списке }
RND_MAX = 5;
{ что ищем }
E = 2;
{ Ищет хвост списка }
function listGetTail(list: PListItem): PListItem;
begin
if list <> nil then while(list^.pNext <> nil) do list := list^.pNext;
listGetTail := list;
end;
{ Ищет голову списка }
function listGetHead(list: PListItem): PListItem;
begin
if list <> nil then while(list^.pPrev <> nil) do list := list^.pNext;
listGetHead := list;
end;
function listInitElement(var el: PListItem): PListItem;
begin
New(el);
el^.pPrev := nil;
el^.pNext := nil;
listInitElement := el;
end;
{ Добавление значения после указанного элемента. Автоматически создаёт список если его не было }
function listAppendAfter(var after: PListItem; value: integer): PListItem;
var tmp, tmp2: PListItem;
begin
if after = nil then begin
tmp := listInitElement(after);
end else begin
if after^.pNext = nil then begin
{ следующего элемента нет, просто создаём новый }
tmp := listInitElement(after^.pNext)
end else begin
{ нашёлся линк, надо изменять }
tmp2 := after^.pNext;
tmp := listInitElement(after^.pNext);
tmp^.pNext := tmp2;
tmp^.pPrev := after;
tmp2^.pPrev := tmp;
end;
end;
{ устанавливаем значение }
tmp^.value := value;
listAppendAfter := tmp;
end;
{ Добавление значения перед указанным элементом. Автоматически создаёт список если его не было }
function listAppendBefore(var before: PListItem; value: integer): PListItem;
var tmp, tmp2: PListItem;
begin
if before = nil then begin
tmp := listInitElement(before);
end else begin
if before^.pPrev = nil then begin
{ предыдущего элемента нет, просто создаём новый }
tmp := listInitElement(before^.pPrev)
end else begin
{ нашёлся линк, надо изменять }
tmp2 := before^.pPrev;
tmp := listInitElement(before^.pPrev);
tmp^.pPrev := tmp2;
tmp^.pNext := before;
tmp2^.pNext := tmp;
end;
end;
{ устанавливаем значение }
tmp^.value := value;
listAppendBefore := tmp;
end;
{ Копирует содержимое list2 в конец списка list. Создаёт список list, если он пуст }
procedure listAppendList(var list: PListItem; list2: PListItem);
var pos: PListItem;
begin
pos := list; while(list2 <> nil) do begin pos := listAppendAfter(pos, list2^.value); list2 := list2^.pNext; end;
end;
{ Ищет вхождение элемента E }
function listSearchItem(list: PListItem; e: integer): PListItem;
begin
while(list <> nil) do begin
if list^.value = e then break;
list := list^.pNext;
end;
listSearchItem := list;
end;
{ Освобождение занятой списком памяти }
procedure listDispose(var list: PListItem);
var tmp: PListItem;
begin
while(list <> nil) do begin tmp := list^.pNext; Dispose(list); list := tmp; end;
end;
{ Заполняет список случайными значениями. Если список не пуст - значения добавляются в конец. }
procedure listFillRandom(var list: PListItem);
var i: integer;
begin
for i := 1 to LIST_SIZE do listAppendAfter(list, random(RND_MAX));
end;
{ Выводит содержимое списка на экран }
procedure listPrint(list: PListItem);
begin
write(': ');
if list = nil then
write('пустой!')
else
while(list <> nil) do begin write(list^.value, ', '); list := list^.pNext; end;
writeLn();
end;
var
pList1: PListItem;
pList2: PListItem;
tail: PListItem;
begin
randomize;
{ Заполняем первый массив и выводим его на экран }
listFillRandom(pList1);
write('List1'); listPrint(pList1);
{ Заполняем второй массив и выводим его на экран }
listFillRandom(pList2);
write('List2'); listPrint(pList2);
{ Добавляем содержимое второго списка в первый и выводим результат}
tail := listGetTail(pList1);
listAppendList(tail, pList2);
write('List3'); listPrint(pList1);
{ Создаём новый второй список }
listDispose(pList2);
listFillRandom(pList2);
write('List2New'); listPrint(pList2);
{ Ищем элемент E }
tail := listSearchItem(pList1, E);
if tail = nil then writeLn('E(', E, ') не найдено!')
else listAppendList(tail, pList2);
{ Список 2 уже не нужен, освобождаем память }
listDispose(pList2);
{ Выводим массив на экран }
write('List3Out'); listPrint(pList1);
{ Чистим память под списком 1 }
listDispose(pList1);
end.
apkoc вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамические списки! Pascal! sir.andrey Помощь студентам 5 25.02.2010 17:09
Динамические списки! Pascal! sir.andrey Помощь студентам 2 18.02.2010 14:24
Задача на динамические списки Mаximus Помощь студентам 1 13.01.2010 17:11
Динамические списки Saawa Помощь студентам 4 02.12.2009 18:35