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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2015, 00:22   #1
Kir94
Новичок
Джуниор
 
Регистрация: 16.10.2015
Сообщений: 5
По умолчанию Удаление элементов списка

Помогите исправить процедуру удаления элементов.
Код:
{программа организации списка динамическими переменными}
uses crt;
{создаем тип динамической переменной}
type DinPer=^item;
item=record
inf: string;
next: DinPer;
end;
{описываем переменные head – голова списка, указывает на первый элемент,
p – динамическая переменная, используется для работы со списком}
var head,p:DinPer;
n,i,k:integer;
x: string;

Procedure Add(x: string);
var tmp: DinPer;
begin
   new(p);    {получаем указатель на новый элемент}
   p^.inf:=x;  {Заполняем элемент значением}
   p^.next:=nil; {элемент добавляется в хвост}
   if head = nil then {список пуст}
      head:=p {созданный элемент - первый элемент списка}
   else     {список не пуст}
   begin
      tmp:=head;
      while tmp^.next <> nil do {переходим в конец списка}
          tmp:=tmp^.next;
      tmp^.next:=p;  {Добавляем элемент в хвост}
   end;
end;
{удаление первого элемента в списке}
procedure pop;
begin
p:=head;
head:=head^.next;
dispose(p);
end;

{вывод на экран элементов списка}
procedure print;
begin
writeln('элементы списка: ');
p:=head;
while p<>nil do
begin
writeln(p^.inf);
p:=p^.next;
end;
end;
begin
clrscr;
{голова списка не ссылается ни на какую область памяти (переменную)}
head:=nil;
writeln('введите количество элементов');
readln(n);
writeln('Список: ');
for i:=1 to n do begin
readln(x);
add(x);
end;
{просмотр всех элементов списка}
Print;
{удаление всех элементов списка}
for i:=1 to n+1 do pop;
Print;
end.
не могу понять в чем проблема,сама процедура работает хорошо если удалять один элемент, но если процедуру поместить в цикл чтобы все элементы удалялись, то тут уже проблема, хотя цикл на удаление вроде верно составлен.
Когда запуская на выполнение то когда программа доходит до удаления элементов вылезает ошибка. Пишет что проблема в этой строке: head:=head^.next;
Помогите исправить
Kir94 вне форума Ответить с цитированием
Старый 17.10.2015, 07:40   #2
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Догадка. Возможно Вы пытаетесь удалить не существующий элемент. Обычно чтобы избежать подобных ошибок в цикле for используют не to, а downto.
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 17.10.2015, 12:00   #3
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Ещё можно поставить защиту в pop
Код:
{удаление первого элемента в списке}
procedure pop;
begin
  if head=nil then
    Exit;
p:=head;
head:=head^.next;
dispose(p);
end;
Да и сама очистка обычно реализуется не через for
Код:
  while head<>nil do
    pop;
Ещё, вы, видимо, торопились и не заметили - заполнение списка
for i:=1 to n,
а очистка
for i:=1 to n+1

Последний раз редактировалось FPaul; 17.10.2015 в 12:05.
FPaul вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление из линейного списка элементов kalosha-stepa Паскаль, Turbo Pascal, PascalABC.NET 3 08.11.2012 21:16
Pascal - Удаление одинаковых элементов списка assasko Помощь студентам 0 23.05.2011 10:33
С++ Строки - списки. Удаление элементов списка. Daramos Помощь студентам 0 16.12.2010 09:05
Удаление элементов из списка. grave123 Общие вопросы C/C++ 0 10.03.2010 15:33
Удаление элементов из списка Wi1D Помощь студентам 0 18.05.2009 00:23