Помощь - Поиск - Пользователи - Календарь
Полная версия: Динамические структуры
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Akella
Вот условие:
Создать в динамической памяти односвязный линейный список(цепочка) из n элементов. Заполнение информационных полей элементов списка(в моей проге это data) можно провести генератором случ. чисел. Реализировать процедуры: добавления элемента в любую точку списка, удаление, вывода на экран полученной в куче числ. посл-ти.
И еще одна процедура по пребразованию последовательности из x1,x2,x3,...xn надо получить (x1-xn),(x2-xn),...(xn-1 -xn) воть!

Теперь что у меня не работает:
1. выводит на экран на 1 элемент меньше (не знаю почечу)
2. процедура вставки некоректно работает при замене 1-го элемента
3. процедура удаления также не работает при удалении 1-го элемента
4. процедура преобразования отнимает не последний элемент, а какой попадется=(( вот... кто-чем сможет - помогите!!! rolleyes.gif

 program lab_12_1;
uses crt;

type
  point=^element;
  element=record
    Data:integer;
    Next:point;
  end;

var
  P,H,PBegin:point;
  i,n:integer;
  MemBegin:longint;
  Simvol:char;

procedure Vivod(P:point);
 begin
   writeln('Tekushaya posledivatelnost:');
   repeat
     write(P^.data,' ');
     P:=P^.Next;
   until
     P^.Next=Nil;
end;

procedure Vstavka(var Pred:point; Nomer,Chislo:integer);
 var
   i:integer;
   Vst:point;
begin
  if Nomer=1 then begin
    New(Vst);
    Vst^.Data:=Chislo;
    Vst^.Next:=Pred;
    Pred:=Vst;
  end
  else for i:=1 to Nomer-2 do begin
     Pred:=Pred^.Next;
   end;
   New(Vst);
   Vst^.Data:=Chislo;
   Vst^.Next:=Pred^.Next;
   Pred^.Next:=Vst;
end;

procedure Udalenie(var Pred:point; Nomer:integer);
 var
   i,Chislo:integer;
   Ud:point;
begin
  if Nomer=1 then begin
    Ud:=Pred;
    Pred:=Pred^.Next;
    Chislo:=Ud^.data;
    Dispose(Ud);
  end
  else for i:=1 to Nomer-2 do begin
     Pred:=Pred^.Next;
   end;
 Ud:=Pred^.Next;
 Pred^.Next:=Pred^.Next^.Next;
 Chislo:=Ud^.Data;
 Dispose(Ud);
end;

procedure NovPosl(var P:point);
 var
   PBegin:point;
   Chislo:integer;
begin
  PBegin:=P;
  while  P^.Next <> Nil do begin
  P:=P^.Next
  end;
  Chislo:=P^.Data;
  P:=PBegin;
  while P^.Next <> Nil do begin
    P^.Data:=P^.Data-Chislo;
    P:=P^.Next;
  end;
end;



begin  {----------------------------}
  clrscr;
  randomize;

  New(P);
  PBegin:=P;
  MemBegin:=MemAvail;

  write('Vvedite kol-vo elementov: '); readln(N);

  for i:=1 to n do begin
    P^.Data:=random(100);
    P^.Next:=Nil;
   if i<n then begin
    H:=P;
    New(P);
    H^.Next:=P;
   end;
  end;
  p:=PBegin;
  Vivod(PBegin);
  N:=0;
  writeln;
  writeln;

  repeat begin
   writeln('Najmit:');
   writeln('D - udalit element');
   writeln('A - dobavit element');
   writeln('F - preobrazovanie');
   writeln('E - vihod');
   Simvol:=readkey;
   case Simvol of
    'd': begin
	   write('Vvedite poziciu elementa: ');
	   read(N);
	   P:=PBegin;
	   Udalenie(P,N)
	 end;
    'a': begin
	   write('Vvedite poziciu novogo elementa: ');
	   read(n);
	   P:=PBegin;
	   Vstavka(P,N,0)
	 end;
    'f': begin
	   P:=PBegin;
	   NovPosl(P);
	 end;
    end;
    clrscr;
    P:=PBegin;
    Vivod(P);
    end;
    until Simvol='e';
end.



если что спрашивайте, постараюсь ответить... однако не так быстро..
volvo
Цитата
1. выводит на экран на 1 элемент меньше (не знаю почечу)
Потому, что выводишь неправильно. Сравни то, что было у тебя с этим:
procedure Vivod(P:point);
begin
  writeln('Tekushaya posledivatelnost:');
  while p <> nil do begin
    write(P^.data,' ');
    P:=P^.Next;
  end;
end;

. Внутри NovPosl - то же самое, ты не обрабатываешь последний элемент. Почему тебя все время тянет сделать while p^.next = nil ? А последний (тот, у которого p^.next нулевой) ты обрабатывать не собираешься? Цикл же закончится как только ты с предпоследнего элемента переместишься к последнему, еще ДО обработки data...

Цитата
4. процедура преобразования отнимает не последний элемент, а какой попадется
3 раза запускал, все прекрасно с этим. Это ты просто последнего не видел (выше написано, почему), но он как раз отнимается.

Подозреваю, что и 2, 3 пункты тоже сбоят по схожей причине, проверь все циклы...
Akella
сеодня на паре подумаю над 2 и 3...
Akella
все.... нашел ошибки... в условных операторах не хватало begin'а
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.