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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2014, 09:01   #1
RedWhiteCasual
Новичок
Джуниор
 
Регистрация: 31.01.2014
Сообщений: 2
По умолчанию Двусвязные списки

1. Протестировать модуль управления двусвязными списками, обнаружить и исправить ошибки. Решить следующие задачи, используя функции обновленного модуля.
2. Заполнить со стандартного потока ввода двусвязный список числовых значений. Заполнение завершить, когда будет введено нечисловое значение. Используя функцию listAction, вывести список в прямом и обратном порядке.
3. Заполнить со стандартного потока ввода двусвязный список числовых значений. Заполнение завершить, когда будет введено нечисловое значение. Вывести полученный список. Перенести каждый второй элемент исходного списка в новый список с помощью функций удаления и добавления элементов. Вывести оба полученных списка.

При решении задач запрещается изменять ключевые значения элементов списка по окончании процесса заполнения.
Код:
{$mode objfpc}
unit u2list; // аИбаПаОаЛбŒаЗаОаВаАб‚бŒ аОб‚аДаЕаЛбŒаНаО аОб‚ ulist
interface

type
	P2list=^T2list;
	T2list=record
		key:integer;
		pprev:p2list;
		pnext:p2list;
	end;

function createElement(key:integer):p2list;
procedure addfirstelement(var PH:p2list; p:p2list);
procedure addlastelement(var PH:p2list; p:p2list);
procedure InsertElementBefore(var El:p2list; p:p2list);
procedure InsertElementAfter(var El:p2list; p:p2list);

function deleteElement(var El:p2list):p2list;
procedure disposeList(var pH:p2list);
function countElements(pH:p2list):integer;

type
 TlistAction=procedure(key:integer);
procedure listAction(p:p2list; proc:TListAction; 
					 backward:boolean=false); 

implementation

function createElement(key:integer):p2list;
begin
new(result);
result^.key:=key;
result^.pnext:=nil;
result^.pprev:=nil;
end;



procedure addfirstelement(var PH:p2list; p:p2list);
begin
{
 p^.pnext:=PH;
 if ph<>nil then ph^.pprev:=p;
 PH:=p;
}
 if ph=nil then begin
  ph:=p;
  exit;
 end;
 p^.pnext:=PH;
 ph^.pprev:=p;
 PH:=p;
end;


procedure addlastelement(var PH:p2list; p:p2list);
var c:p2list;
begin
 if PH = nil then begin 
  PH:=p;
  exit;
 end;
 c:=PH;
 while c^.pnext <>nil do c:=c^.pnext;
 c^.pnext:=p;
 p^.pprev:=c;
end;


procedure InsertElementBefore(var El:p2list; p:p2list);
begin
 if (El=nil) or (El^.pprev=nil) then begin
  addfirstelement(el,p);
  exit;
 end;
 insertElementAfter(El^.pprev,p);
end;

procedure InsertElementAfter(var El:p2list; p:p2list);
begin
 if El=nil then begin
  addfirstelement(el,p);
  exit;
 end;
 if El^.pnext=nil then begin
  addlastelement(el,p);
  exit;
 end;
 p^.pnext:=El^.pnext;
 El^.pnext:=p;
 p^.pprev:=El;
 p^.pnext^.pprev:=p; 
end;



function deleteElement(var El:p2list):p2list;
begin
result:=El;
if El=nil then exit;

if (el^.pprev=nil)and(el^.pnext=nil) then begin
 // аЕаДаИаНбб‚аВаЕаНаНб‹аЙ баЛаЕаМаЕаНб‚
 el:=nil;
 exit;
end;

if el^.pnext=nil then begin
 // аПаОбаЛаЕаДаНаИаЙ баЛаЕаМаЕаНб‚
 el^.pprev^.pnext:=nil;
 el^.pprev:=nil;
 exit; 
end;

if el^.pprev=nil then begin
 // аПаЕб€аВб‹аЙ баЛаЕаМаЕаНб‚
 el^.pnext^.pprev:=nil;
 el:=el^.pnext;
 result^.pnext:=nil;
 exit; 
end;

// аВ баЕб€аЕаДаИаНаЕ баПаИбаКаА
el^.pprev^.pnext:=el^.pnext;
el^.pnext^.pprev:=el^.pprev;
el^.pprev:=nil;
el^.pnext:=nil;
end;




procedure disposeList(var pH:p2list);
begin
 if pH=nil then exit;
 disposeList(pH^.pnext);
 dispose(pH);
 pH:=nil;
end;


function countElements(pH:plist):integer;
 var c:plist;
begin
 c:=pH;
 result:=0;
 while c <>nil do begin
  c:=c^.pnext;
  inc(result);
 end;
end;


procedure listAction(p:p2list; proc:TListAction;
					 backward:boolean=false); 
var c:p2list;
begin
 c:=p;
 while c<>nil do begin 
  proc(c^.key); 
  if backward then c:=c^.pprev else c:=c^.pnext; 
 end;
end;

end.
Был бы премного благодарен любой помощи)
Сам пока к работе не приступал, по ходу что то добавлю в тему.

Последний раз редактировалось RedWhiteCasual; 06.02.2014 в 09:03.
RedWhiteCasual вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двусвязные списки на Си Kastiel94 Помощь студентам 9 22.05.2013 21:20
Двусвязные списки vlados007 Общие вопросы C/C++ 5 13.02.2012 18:12
Двусвязные списки aidar9012 Помощь студентам 6 28.06.2010 02:05
Двусвязные списки vimeo Общие вопросы C/C++ 2 03.05.2010 19:31