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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.02.2010, 12:03   #1
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос Динамический массив. Неверный вывод элементов.

Привет друзья!!!
Мне требуется ваша помощь.
При удалении из динамического списка элемента, распечатывается
полный бред...Подскажите пожалуйста как исправить?
Код:
program adresa;
type
     adres=^adres_type;
     adres_type=record
      next,pred:adres;
       data:integer;
	    end;
var next,pred,p,h,buf,one,pered,posle,k:adres;
    i,n,t,y,r:integer;
begin
randomize;
write('kol-vo elementov:');
readln (n);
buf:=nil;
new(h);
one:=h;
h^.pred:=nil;
h^.data:=random(100)+1;
h^.next:=nil;
buf:=h;
for i:=1 to n-1 do begin
new(h);
h^.pred:=buf;
h^.next:=nil;
h^.data:=random(100)+1;
buf^.next:=h;
buf:=h;
		   end;
{raspechatka}
h:=one;
write ('spisok: ');
while h^.next<>nil do begin
		write (h^.data,' ');
		h:=h^.next;
		      end;
write (h^.data,' ');
{dobavlenie elementa}
writeln ('na kakoe mesto vstavim noviy element?');
write ('na: ');
readln (t);
h:=one;
for i:=1 to n do begin
		 if i=t-1 then pered:=h;
		 if i=t then begin
                             posle:=h;
                             r:=r+1;
                             end;
		 h:=h^.next;
		 end;
new(k);
k^.data:=random(100)+1;
k^.pred:=pered;
pered^.next:=k;
posle^.pred:=k;
k^.next:=posle;
n:=n+r;
{raspechatka}
h:=one;
write ('spisok: ');
while h^.next<>nil do begin
		write (h^.data,' ');
		h:=h^.next;
		      end;
write (h^.data,' ');
{ydalenie elementa}
h:=one;
write ('ydalit element nomer: ');
readln (y);
for i:=1 to n do begin
                 if i=y-1 then pered:=h;
                 if i=y then k:=h;
                 if i=y+1 then posle:=h;
                 end;
pered^.next:=posle;
posle^.pred:=pered;
dispose (k);
{raspechatka}
h:=one;
write ('spisok: ');
while h^.next<>nil do begin
		write (h^.data,' ');
		h:=h^.next;
		      end;
write (h^.data,' ');





end.
sir.andrey вне форума Ответить с цитированием
Старый 24.02.2010, 13:09   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,689
По умолчанию

Чуть внимательности
Код:
  write ('ydalit element nomer: ');
  readln (y);
  for i:=1 to n do begin
    if i=y-1 then pered:=h;
    if i=y then k:=h;
    if i=y+1 then posle:=h;
    h:=h^.next;
  end;
Советую при замене и удалении обрабатывать концы (первый и последний элементы), так как перед первым и после последнего ничего нет, что вызывает ошибку
eoln вне форума Ответить с цитированием
Старый 24.02.2010, 13:21   #3
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Радость

Спасибо большое!!!
Прям выручил, сам не пойму как не заметил тупую ошибку!!!
sir.andrey вне форума Ответить с цитированием
Старый 24.02.2010, 18:02   #4
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Восклицание

Товарищи еше один замут!!!
Я не понимаю, почему цикл (красным выделен) работает только 1 раз?
Он же ведь должен работать пока я не нажму 'net'.
End и Begin вроде правильно расставил.
Проверьте пожалуйста!
Код:
program adresa;
uses crt;
type
     adres=^adres_type;
     adres_type=record
      next,pred:adres;
       data:integer;
	    end;
var next,pred,p,h,buf,one,pered,posle,k,close:adres;
    i,n,t,e,r,y:integer; bykva,bykva2:string;
{ydalenie elementa}
procedure del;
begin
writeln;
h:=one;
write ('ydalit element nomer: ');
readln (e);
if e=1 then begin
            h:=one^.next;
            h^.pred:=nil;
            dispose(one);
            one:=h;
            end
      else begin
           if y=n then begin
                       h:=close^.pred;
                       h^.next:=nil;
                       dispose(close);
                       close:=h;
                       end
                  else begin
                       for i:=1 to n do begin
                                        if i=e-1 then pered:=h;
                                        if i=e then k:=h;
                                        if i=e+1 then posle:=h;
                                        h:=h^.next;
                                        end;
                       end;
                       pered^.next:=posle;
                       posle^.pred:=pered;
                       dispose (k);
           end;
end;

{dobavlenie elementa}
procedure plus (var n:integer);
begin
writeln;
writeln ('na kakoe mesto vstavim noviy element?');
write ('na: ');
readln (t);
h:=one;
if t=1 then begin
            new(k);
            h^.pred:=k;
            k^.next:=h;
            k^.pred:=nil;
            one:=k;
            end
       else begin
            if t=n+1 then begin
                          new(k);
                          close^.next:=k;
                          k^.pred:=close;
                          k^.next:=nil;
                          end
                     else begin
                          for i:=1 to n do begin
		                           if i=t-1 then pered:=h;
		                           if i=t then begin
                                                       posle:=h;
                                                       r:=r+1;
                                                       end;
		                           h:=h^.next;
		                           end;
                          end;
            end;
new(k);
k^.data:=random(100)+1;
k^.pred:=pered;
pered^.next:=k;
posle^.pred:=k;
k^.next:=posle;
n:=n+r;
end;
{vivod na ekran}
procedure vivod;
begin
write('spisok: ');
h:=one;
while h^.next<>nil do begin
                      write (h^.data,' ');
                      h:=h^.next;
                      end;
write (h^.data,' ');
end;

{ocnovnaya proga}
begin
clrscr;
randomize;
write('kol-vo elementov:');
readln (n);
buf:=nil;
new(h);
one:=h;
h^.pred:=nil;
h^.data:=random(100)+1;
h^.next:=nil;
buf:=h;
for i:=1 to n-1 do begin
new(h);
h^.pred:=buf;
h^.next:=nil;
h^.data:=random(100)+1;
buf^.next:=h;
buf:=h;
close:=h;
n:=n-r;
		   end;
vivod;    {vivod elementov}
bykva2:='da';
while bykva2='da' do begin
writeln;
writeln ('redaktirovat spisok? da/net: ');
readln(bykva2);
if bykva2='da' then begin
bykva:='da';
while bykva='da' do begin
clrscr;
vivod;
writeln;
write ('dobavlenie elementov da/net: ');
readln(bykva);
if bykva='da' then begin
                plus(n);  {dobavlenie elementa}
                clrscr;
                vivod;    {vivod elementov}
                end
end;
writeln;
bykva:='da';
clrscr;
vivod;
while bykva='da' do begin
writeln;
write ('ydalenie elementov da/net: ');
read (bykva);
if bykva='da' then begin
del;      {ydalenie elementa}
clrscr;
vivod;    {vivod elementov}
                end;
                 end;
                 end;
                 end;
end.
sir.andrey вне форума Ответить с цитированием
Старый 24.02.2010, 20:22   #5
Indian
Форумчанин
 
Регистрация: 23.02.2010
Сообщений: 107
По умолчанию

Лучше добавить функцию вопроса:
Код:
Function prompt(Const question:String):   boolean;
Var answer:   string;
Begin
    clrscr;
    vivod;
    writeln;
    writeln (question);
    readln(answer);
    If answer='da' Then
        prompt := true
    Else prompt := false;
End;

Код:
...
While prompt('redaktirovat spisok? da/net: ') Do
        Begin

            While prompt('dobavlenie elementov da/net: ') Do
                    plus(n); 
          
            While prompt('ydalenie elementov da/net: ') Do
	    del;  
               
        End;
Вложения
Тип файла: zip test.pas.zip (1.1 Кб, 12 просмотров)
Indian вне форума Ответить с цитированием
Старый 25.02.2010, 14:51   #6
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос

Код:
program adresa;
uses crt;
type
     adres=^adres_type;
     adres_type=record
      next,pred:adres;
       data:integer;
	    end;
var next,pred,p,h,buf,one,pered,posle,pered2,posle2,k,close:adres;
    i,n,t,r,y,M:integer; bykva,bykva2:string;
{ydaleni elementov menshe M}
procedure menshe_M(var n:integer);
begin
h:=one;
writeln ('vvedite M');
write ('M=');
readln (M);
for i:=1 to n do begin
                 if (h^.data<M) and (i=1) then begin
                                               h:=h^.next;
                                               h^.pred:=nil;
                                               dispose (one);
                                               one:=h;
                                               end;
                 if (h^.data<M) and (i=n) then begin
                                               h:=h^.pred;
                                               h^.next:=nil;
                                               dispose (close);
                                               close:=h;
                                               end
                                          else begin
                                               k:=h;
                                               pered2:=k^.pred;
                                               posle2:=k^.next;
                                               pered2^.next:=posle2;
                                               posle2^.pred:=pered2;
                                               dispose(k);
                                               end;
h:=h^.next;
end;
end;
{ydalenie elementa}
procedure del(var n:integer);
begin
r:=1;
writeln;
h:=one;
write ('ydalit element nomer: ');
readln (t);
if t=1 then begin
            h:=one^.next;
            h^.pred:=nil;
            dispose(one);
            one:=h;
            end
      else begin
           if y=n then begin
                       h:=close^.pred;
                       h^.next:=nil;
                       dispose(close);
                       close:=h;
                       end
                  else begin
                       for i:=1 to n do begin
                                        if i=t-1 then pered:=h;
                                        if i=t then k:=h;
                                        if i=t+1 then begin
                                                      posle:=h;
                                                      pered^.next:=posle;
                                                      posle^.pred:=pered;
                                                      dispose (k);
                                                      end;
                                        h:=h^.next;
                                        end;
                       end;
            end;
n:=n-r;
end;

{dobavlenie elementa}
procedure plus (var n:integer);
begin
r:=1;
writeln;
writeln ('na kakoe mesto vstavim noviy element?');
write ('na: ');
readln (t);
h:=one;
if t=1 then begin
            new(k);
            h^.pred:=k;
            k^.next:=h;
            k^.data:=random(100);
            k^.pred:=nil;
            one:=k;
            r:=r+1
           end
       else begin
            if t=n+1 then begin
                          new(k);
                          close^.next:=k;
                          k^.pred:=close;
                          k^.data:=random(100);
                          k^.next:=nil;
                          r:=r+1;
                          end
                     else begin
                          for i:=1 to n do begin
		                           if i=t-1 then pered:=h;
		                           if i=t then begin
                                                       posle:=h;
                                                       r:=r+1;
                                                       new(k);
                                                       k^.data:=random(100)+1;
                                                       k^.pred:=pered;
                                                       pered^.next:=k;
                                                       posle^.pred:=k;
                                                       k^.next:=posle;
                                                       end;
		                           h:=h^.next;
		                           end;
                          end;

            end;

n:=n+r;
end;
{vivod na ekran}
procedure vivod;
begin
write('spisok: ');
h:=one;
while h^.next<>nil do begin
                      write (h^.data,' ');
                      h:=h^.next;
                      end;
write (h^.data,' ');
end;

Последний раз редактировалось sir.andrey; 25.02.2010 в 14:53.
sir.andrey вне форума Ответить с цитированием
Старый 25.02.2010, 14:52   #7
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
Вопрос

продолжение
Код:
{ocnovnaya proga}
begin
clrscr;
randomize;
write('kol-vo elementov:');
readln (n);
clrscr;
buf:=nil;
new(h);
one:=h;
h^.pred:=nil;
h^.data:=random(100)+1;
h^.next:=nil;
buf:=h;
for i:=1 to n-1 do begin
                   new(h);
                   h^.pred:=buf;
                   h^.next:=nil;
                   h^.data:=random(100)+1;
                   buf^.next:=h;
                   buf:=h;
                   close:=h;
		   end;
vivod;
plus(n);
vivod;
del(n);
vivod;
menshe_M(n);
vivod;
end.
При запуске программы в строке (выделена красным) обнаруживается ошибка!
Я не понимаю почему...
Подскажите пожалуйста!

Последний раз редактировалось sir.andrey; 25.02.2010 в 14:56.
sir.andrey вне форума Ответить с цитированием
Старый 27.02.2010, 05:23   #8
sir.andrey
Форумчанин
 
Регистрация: 06.12.2009
Сообщений: 380
По умолчанию

Спасибо всем за помощь!!!
Программу я доделал!!!
sir.andrey вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамический массив элементов управления в VBA litvin44 Microsoft Office Excel 6 08.01.2022 22:36
Динамический список. Поиск и удаление элементов. Paulo Помощь студентам 2 01.05.2009 12:37
Дан массив из N элементов (чисел),определить количество элементов кратных 3. Woha Общие вопросы C/C++ 2 08.12.2008 13:12
Список элементов (Динамический массив) SeverBaP Помощь студентам 7 28.11.2008 15:21