Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Здесь нужно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 06.11.2012, 10:29   #1
NinaSSS
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 34
По умолчанию Двунаправленный динамический список

Прошу помощи!Сразу прошу прощения недавно начала работу с динамической памятью, поэтому не все понимаю. Задача стоит так нужно организовать двунаправленный список и чтобы при вводе все элементы упорядочивались по возрастанию. Вот код но при сортировки выдает ошибку попытка разыменовать нулевой указатель. Заранее спасибо
Код:
program Project1;

type
  //Типы для описания списка.

  //Тип, описывающий элемент списка.
  TPElem = ^TElem;
  TElem = record
    Data : Integer;
    PNext, PPrev : TPElem;
  end;
  //Тип, описывающий список.
  TList = record
    PFirst : TPElem;
    PLast : TPElem;
  end;

//Добавление элемента в конец списка.
procedure AddL(var aList : TList; const aPElem : TPElem);
begin
  if aPElem = nil then Exit;

  aPElem^.PNext := nil;
  aPElem^.PPrev := nil;
  if aList.PFirst = nil then begin
    aList.PFirst := aPElem;
  end else begin
    aList.PLast^.PNext := aPElem;
    aPElem^.PPrev := aList.PLast;
  end;
  aList.PLast := aPElem;
end;


//Распечатка элементов списка.
procedure Print(const aList : TList);
var
  PElem : TPElem;
begin
  PElem := aList.PFirst;
  while PElem <> nil do begin
    if PElem <> aList.PFirst then Write(#9);
    Write(PElem^.Data);
    PElem := PElem^.PNext;
  end;
  Writeln;
end;
  procedure SortBubbleAsc(const aList : TList);
var
  P1, P2, P : TPElem;
  Data : integer;
  F : Boolean;
begin
  if aList.PFirst = aList.PLast then Exit;

  P := aList.PLast;
  repeat
    F := False;

    P2 := aList.PFirst;
    repeat
      P1 := P2;
      P2 := P1^.PNext;
      if P1^.Data > P2^.Data then begin
        Data := P1^.Data;
        P1^.Data := P2^.Data;
        P2^.Data := Data;
        F := True;
      end;
    until P2 = P;

    P := P^.PPrev;
  until not F
end;
var
  List : TList;
  PElem, PDel : TPElem;
  Num : integer; //Num : Integer;
  S : String;
begin
  //Начальная инициализация списка.
  List.PFirst := nil;
  List.PLast := nil;

  repeat
    Writeln('Задайте список целых чисел через пробел и нажмите Enter:');
    repeat
      New(PElem);
      Read(PElem^.Data);
      AddL(List, PElem);
    until PElem^.Data=0;
    Readln;

    //Распечатка элементов списка.
    Writeln('Составлен динамический список. Элементы списка:');
    Print(List);

    SortBubbleAsc(List);


    //Распечатка элементов списка.
    Writeln('Список после удаления элементов, больших чем заданный:');
    Print(List);


    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.
NinaSSS вне форума   Ответить с цитированием
Старый 06.11.2012, 11:32   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Код:
  procedure SortBubbleAsc(const aList : TList);
var
  P1, P2 : TPElem;
  Data : integer;
  F : Boolean;
begin
  if aList.PFirst = aList.PLast then Exit;
  p1:=aList.PFirst;
  while p1<>aList.PLast do begin
   p2:=p1;
   while p2<>aList.PLast do begin
    if p1^.Data<p2^.Data then begin
      Data:=p2^.Data;
      p2^.Data:=p1^.Data;
      p1^.Data:=Data;
    end;
    p2:=p2^.PNext;
   end;
   p1:=p1^.PNext;
  end;
end;
И никаких лишних изворотов.
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 06.11.2012, 13:23   #3
NinaSSS
Пользователь
 
Регистрация: 30.10.2012
Сообщений: 34
По умолчанию

Stilet огромное Вам СПАСИБО!
NinaSSS вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двунаправленный список Вельвет Помощь студентам 1 10.01.2012 14:14
двунаправленный список triple56 Общие вопросы C/C++ 0 18.12.2011 19:33
двунаправленный список Максикок Помощь студентам 3 02.05.2011 10:34
Двунаправленный динамический список mata Помощь студентам 1 05.10.2010 21:15
Двунаправленный список Chudo4258 Помощь студентам 6 09.05.2009 07:16


14:47.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.