Помощь - Поиск - Пользователи - Календарь
Полная версия: Двусвязные и односвязные списки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
КСЮШОК
Доброго всем времени суток! Помогите пожалста, а то у меня такая беда wacko.gif ....не получается ничего со списками, а надо (очень) решить одну и ту же задачу двумя способами: односвязным и двусвязным списком....
Я FAQ почитала и натворила сама не знаю что (но вроде похоже на двусвязный список), но оно все работает только с маленькой ошибкой, а как в односвязный переделать я совсем не знаю.... mega_chok.gif Задачка вот такая: Составить программу, которая удаляет из списка L все отрицательные элементы. Вот. программа моя....

Program laba_13;
 uses crt;
type
 point = ^item;
 item = record
  numer: integer;
  next: point;
 end;


 procedure print(first: point);
 var r: point;
 begin
   r:=first;
   while r<>nil do begin
    writeln('   ', r^.Numer);
    r:=r^.next;
   end;
 end;



 var
   p, r, first: point;
   found: boolean;
   n, E: integer;
 begin
   clrscr;
   first:=nil;
   write('Первый элемент : ');
   readln(n);
   while n<>0 do begin
   new(r);
   r^.next:=first;
   r^.Numer:=n;
   first:=r;
   write('Следующий элемент (0 для выхода)  : ');
   readln(n);
 end;
 writeln;
 write('Исходный список : ');
 writeln;
 print(first); 

 repeat
 found:=false;
 p:=first;
 while not found and (p^.Next<>nil) do
   if p^.next^.numer<0 then found:=true
   else p:=p^.next;

 if found then begin
 r:=p^.next;
 p^.next:=r^.next;
 dispose(r);
 end;
 until not found;

 writeln;
 write('Получившийся список : ');
 writeln;
 print(first);
 readln;
 end.



Вот а ошибка такая-когда последний элемент вводится отрицательный, то и его выдает тоже (а не надо)...Как с этим быть? И еще хотела спросить вот он выписывает исходный список и получившийся в обратном порядке...а это можно изменить (что бы выписывалось так, как вводилось), если да то как...?
Подскажите пожалуйста кто-нибудь, если можно и не сложно... give_rose.gif .....
мисс_граффити
а, простите, в каком месте он двусвязный?
 point = ^item;
 item = record 
  numer: integer;{численное значение - информационное поле}
  next: point;{указатель на следующий элемент}
 end;
Гость
Ну я же говорила что в этом ничего не понимаю...
мисс_граффити
последний элемент не удаляется, потому что на самом деле он первый.
то есть ни для какого p указатель на него не будет храниться в p^.next (а ты анализируешь именно такие элементы:
 if p^.next^.numer<0 then
)

можно исправить вот так, например:

...
repeat
 found:=false;
 if first^.numer<0 then
   begin
   r:=first;
   first:=first^.next;
   dispose( r );
   end;
 p:=first;
 while not found and (p^.next<>nil) do
   if p^.next^.numer<0 then found:=true
   else p:=p^.next;
...

КСЮШОК
smile.gif Спасибо огромное...
...а вы не могли бы еще помочь.... rolleyes.gif
вот чтобы сделать тоже самое двусвязным списком надо в VARе написать еще указатель например "prev" такого же типа как и "next", да? А дальше? Помогите пожалуйста smile.gif ...
мисс_граффити
ну, не в VARе, а в TYPE....
а вот зачем оно тебе - подумай... куда применить вторую связь? что она даст? как изменится алгоритм?
КСЮШОК
blink.gif А может еще одну процедуру добавить...занесения элемента в список, вот там и вторую связь как-нибудь вставить...Ну я там счас ошибок понаделаю и все сразу как всегда работать перестанет...Ну я попробую, а потом сюда напишу...Если что исправить поможете...? smile.gif
КСЮШОК
mega_chok.gif Вот беда.... Никак не могу процедуру добавление к своей задачке приладить... blink.gif Помогите пожалста... !help.gif Я так пока написала...

Program laba_13;
 uses crt;
type
 point = ^item;
 item = record
  numer: integer;
  next: point;
 end;

 procedure Dobavlenie(var elem1, elem2: item);
 begin
   elem2.next:=elem1.next;
   elem1.next:=@elem2;
 end;

 procedure print(first: point);
 var r: point;
 begin
   r:=first;
   while r<>nil do begin
    writeln('   ', r^.Numer);
    r:=r^.next;
   end;
 end;



 var
   p, r, first: point;
   found: boolean;
   n, E: integer;
 begin
   clrscr;
   writeln('Введите элементы списка после каждого из которых нажимайте  ENTER: ');
   writeln('Для выхода из набора списка жмите "0"  ');
   writeln;
   while n<>0 do begin
   new(r);
   r^.next:=first;
   r^.Numer:=n;
   first:=r;
   dobavlenie(first, n);
   
 end;
 writeln;
 write('Исходный список : ');
 writeln;
 print(first); 

 repeat

 found:=false;
 p:=first;
 while not found and (p^.Next<>nil) do
   if p^.next^.numer<0 then found:=true
   else p:=p^.next;

   
 if found then begin
 r:=p^.next;
 p^.next:=r^.next;
 dispose(r);
 end;
 until not found; 
 
 writeln;
 write('Получившийся список : ');
 writeln;
 print(first);
 readln;
 end.



Я хочу добавить такую процедуру, что бы в двусвязном списке оставить все так же а процедуру переделать вот так....

procedure Dobavlenie(var elem1, elem2: item);
 begin
   elem2.next:=elem1.next;
   elem1.next:=@elem2;
   elem2.prev:=@elem1;
  if elem2.next<> nil then
   elem2.next^.prev:=@elem2;
 end;


Или так будет не правильно? Подскажите пожалуйста....
КСЮШОК
...я сейчас чуть-чуть исправила... (может так лучше - я не знаю)....но оно по крайней мере стало запускаться правда потом ошибку выдавать №204...Помогите как-нибудь это исправить...ПАЖАЛАСТА smile.gif ...

Program laba_13;
 uses crt;
type
 point = ^item;
 item = record
  numer: integer;
  next: point;
 end;

 procedure Dobavlenie(var elem1, elem2: item);
 begin
   elem2.next:=elem1.next;
   elem1.next:=@elem2;
 end;

 procedure print(first: point);
 var r: point;
 begin
   r:=first;
   while r<>nil do begin
    writeln('   ', r^.Numer);
    r:=r^.next;
   end;
 end;



 var
   p, r, first: point;
   found: boolean;
   n, E: integer;
 begin
   clrscr;
   writeln('Введите элементы списка после каждого из которых нажимайте  ENTER: ');
   writeln('Для выхода из набора списка жмите "0"  ');
   writeln;
   while true do begin
   readln(n);
   if n=0 then break;
   new(r);
   r^.next:=first;
   r^.Numer:=n;
   Dobavlenie(first^, r^);
   first:=r;
   
 end;
 writeln;
 write('Исходный список : ');
 writeln;
 print(first); 

 repeat

 found:=false;
 p:=first;
 while not found and (p^.Next<>nil) do
   if p^.next^.numer<0 then found:=true
   else p:=p^.next;

   
 if found then begin
 r:=p^.next;
 p^.next:=r^.next;
 dispose(r);
 end;
 until not found; 
 
 writeln;
 write('Получившийся список : ');
 writeln;
 print(first);
 readln;
 end.

Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.