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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2010, 07:02   #1
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос Турбо Паскаль 7.0 Удаление из списка элемента

Подскажите пожалуйста, почему в этом цикле не удаляется последний элемент списка?
Код:
h:=first;
while h^.next<>nil do begin
                      first:=h^.next;
                      first^.pred:=nil;
                      dispose(h);
                      h:=first;
                      end;
first-первый элемент списка!
sir.andrey вне форума Ответить с цитированием
Старый 28.02.2010, 09:59   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

А почему он должен удалится? На последнем у вас условие цикла не выполнится.
p51x вне форума Ответить с цитированием
Старый 28.02.2010, 11:30   #3
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Восклицание

Ах да я просто в цитате забыл приписать
Цитата:
Код:
dispose(first)
и все равно не удаляется!
Остается последний элемент!

Последний раз редактировалось sir.andrey; 28.02.2010 в 11:35.
sir.andrey вне форума Ответить с цитированием
Старый 01.03.2010, 11:36   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а с чего Вы решили, что он не удалился?!
операция dispose - НЕ ИЗМЕНЯЕТ значение указателя!
добавьте после неё
Код:
  first := nil;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.03.2010, 02:28   #5
Codemaster_N1
Новичок
Джуниор
 
Регистрация: 01.03.2010
Сообщений: 18
Радость

Код:
h := first;
while h <> nil do
begin
    h2 := h^.next;
    dispose(h);
    h := h2;
end;
Codemaster_N1 вне форума Ответить с цитированием
Старый 02.03.2010, 11:32   #6
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Печаль

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а с чего Вы решили, что он не удалился?!
операция dispose - НЕ ИЗМЕНЯЕТ значение указателя!
добавьте после неё
Код:
  first := nil;
Все равно не удаляется!!!
sir.andrey вне форума Ответить с цитированием
Старый 02.03.2010, 12:37   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Все равно не удаляется!!!
А теперь с этого места поподробнее!
С чего Вы решили, что не удаляется?!
Давайте полностью пример кода, который подтверждает Ваши слова!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.03.2010, 13:08   #8
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Код:
program din_mas;
uses crt;
type
     adres=^adres_type;
     adres_type=record
     next,pred:adres;
     data:integer;
     end;
var h,first,last,buf,h_buf,pered,posle:adres;
    i,n:integer;
    slovo,slovo2:string;

{procedura vivoda na ekran}
procedure vivod;
begin
h:=first;
write ('spisok:');
while h^.next<>nil do begin
                      write (h^.data,' ');
                      h:=h^.next;
                      end;
write (h^.data,' ');
end;
{==========konec==========}

{procedura dobavleniya elementa}
procedure add(var n:integer);
var x:integer;
begin
writeln;
h:=first;
write ('noviy element postavim na mesto nomer:');
readln (x);
randomize;
if (h=first) and (x=1) then begin
                            new(h_buf);
                            h^.pred:=h_buf;
                            h_buf^.next:=h;
                            h_buf^.pred:=nil;
                            h_buf^.data:=random(100);
                            first:=h_buf;
                            end
                       else begin
                            if x=n+1 then begin
                                          new(h_buf);
                                          last^.next:=h_buf;
                                          h_buf^.pred:=last;
                                          h_buf^.data:=random(100);
                                          h_buf^.next:=nil;
                                          last:=h_buf;
                                          end;
                                    end;
if (x<>n+1) and (x<>1) then begin
                            for i:=1 to n do begin
                            if i=x-1 then pered:=h;
                            if i=x   then begin
                                          posle:=h;
                                          new (h_buf);
                                          pered^.next:=h_buf;
                                          posle^.pred:=h_buf;
                                          h_buf^.pred:=pered;
                                          h_buf^.data:=random(100);
                                          h_buf^.next:=posle;
                                          end;
                                             h:=h^.next;
                                             end;
end;
n:=n+1;
end;
{=============konec============}

{procedura ydaleniya elementa}
procedure del(var n:integer);
var x:integer;
begin
writeln;
write ('nomer ydalyaemogo elementa:');
readln(x);
h:=first;
if (x=1) and (h=first) then begin
                            h:=first^.next;
                            h^.pred:=nil;
                            dispose(first);
                            first:=h;
                            end;
if (x=n) then begin
              h:=last^.pred;
              h^.next:=nil;
              dispose(last);
              last:=h;
              end;
if (x<>n) and (x<>1) then begin
                          for i:=1 to n do begin
                          if i=x-1 then pered:=h;
                          if i=x then h_buf:=h;
                          if i=x+1 then begin
                                        posle:=h;
                                        pered^.next:=posle;
                                        posle^.pred:=pered;
                                        dispose(h_buf);
                                        end;
                                           h:=h^.next;
                                           end;
                          end;
n:=n-1;
end;
{============konec===========}
sir.andrey вне форума Ответить с цитированием
Старый 02.03.2010, 13:09   #9
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Код:
{procedura ydaleniya vseh elementov menshe m}
procedure menshe_m(var n:integer);
var m:integer;
begin
h:=first;
h:=h^.next;
writeln;
write('chislo m=');
readln (m);
while h^.next<>nil do begin
if (h<>first) and (h<>last) and (h^.data<m) then begin
                                                 pered:=h^.pred;
                                                 posle:=h^.next;
                                                 pered^.next:=posle;
                                                 posle^.pred:=pered;
                                                 h_buf:=h;
                                                 h:=h^.next;
                                                 dispose(h_buf);
                                                 n:=n-1;
                                                 end
                                            else h:=h^.next;
                      end;
h:=first;
if (h=first) and (h^.data<m) then begin
                                  h:=first^.next;
                                  h^.pred:=nil;
                                  dispose(first);
                                  first:=h;
                                  n:=n-1;
                                  end;
h:=last;
if (h=last) and (h^.data<m) then begin
                                 h:=last^.pred;
                                 h^.next:=nil;
                                 dispose(last);
                                 last:=h;
                                 n:=n-1;
                                 end;
end;
{==================konec====================}


begin

{sozdanie slychaynogo dinamicheskogo massiva}
clrscr;
write ('kol-vo elmentov:');
readln(n);
randomize;
new(h);
h^.pred:=nil;
h^.data:=random(100);
h^.next:=nil;
first:=h;
buf:=h;
for i:=2 to n do begin
                 new(h);
                 buf^.next:=h;
                 h^.pred:=buf;
                 h^.data:=random(100);
                 h^.next:=nil;
                 last:=h;
                 buf:=h;
                 end;
{vivod dinamicheskogo massiva na ekran}
clrscr;
vivod;
slovo2:='da';
while slovo2='da' do begin
writeln;
write ('redaktirovat massiv?  da/net:');
readln(slovo2);
if slovo2='da' then begin
clrscr;
vivod;
slovo:='da';
{dobavlenie}
while slovo='da' do begin
writeln;
write ('dobavlenie elementov da/net:');
readln(slovo);
if slovo='da' then begin
                   clrscr;
                   vivod;
                   add(n);
                   clrscr;
                   vivod;
                   end;
                    end;
slovo:='da';
clrscr;
vivod;
{ydalenie}
while slovo='da' do begin
writeln;
write ('ydalenie elementov da/net:');
readln(slovo);
if slovo='da' then begin
                   clrscr;
                   vivod;
                   del(n);
                   clrscr;
                   vivod;
                   end;
                    end;
clrscr;
vivod;
slovo:='da';
{ydalenie elementov menshe m}
while slovo='da' do begin
writeln;
write ('ydalenie elementov menshe m da/net:');
readln(slovo);
if slovo='da' then begin
                   clrscr;
                   vivod;
                   menshe_m(n);
                   clrscr;
                   vivod;
                   end;
                    end;
                   end;
                    clrscr;
                    vivod;
                    end;
vivod;
h:=first;
while h^.next<>nil do begin
                       first:=h^.next;
                       first^.pred:=nil;
                       dispose(h);
                       h:=first;
                       end;
dispose(first);
first:=nil;
vivod;
end.
sir.andrey вне форума Ответить с цитированием
Старый 02.03.2010, 13:10   #10
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

При распечатке, выводит три левых числа!!!
Удаление в самом конце программы!!!
sir.andrey вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
удаление элемента из списка aurora_87 Общие вопросы C/C++ 1 18.06.2009 14:02
Удаление элемента из массива Ozerich PHP 10 14.02.2009 02:21
Ошибка при создании головного элемента двусвязного списка Дамир Помощь студентам 1 16.11.2008 16:09
Удаление элемента массива chiffa Общие вопросы Delphi 1 03.01.2008 19:24