IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Двусвязные и односвязные списки, удаление из списка
сообщение
Сообщение #1


Гость






Доброго всем времени суток! Помогите пожалста, а то у меня такая беда 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^.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®;
end;
until not found;

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



Вот а ошибка такая-когда последний элемент вводится отрицательный, то и его выдает тоже (а не надо)...Как с этим быть? И еще хотела спросить вот он выписывает исходный список и получившийся в обратном порядке...а это можно изменить (что бы выписывалось так, как вводилось), если да то как...?
Подскажите пожалуйста кто-нибудь, если можно и не сложно... give_rose.gif .....
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


а, простите, в каком месте он двусвязный?
 point = ^item;
item = record
numer: integer;{численное значение - информационное поле}
next: point;{указатель на следующий элемент}
end;


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Ну я же говорила что в этом ничего не понимаю...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


последний элемент не удаляется, потому что на самом деле он первый.
то есть ни для какого 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;
...



Сообщение отредактировано: мисс_граффити -


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






smile.gif Спасибо огромное...
...а вы не могли бы еще помочь.... rolleyes.gif
вот чтобы сделать тоже самое двусвязным списком надо в VARе написать еще указатель например "prev" такого же типа как и "next", да? А дальше? Помогите пожалуйста smile.gif ...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


ну, не в VARе, а в TYPE....
а вот зачем оно тебе - подумай... куда применить вторую связь? что она даст? как изменится алгоритм?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






blink.gif А может еще одну процедуру добавить...занесения элемента в список, вот там и вторую связь как-нибудь вставить...Ну я там счас ошибок понаделаю и все сразу как всегда работать перестанет...Ну я попробую, а потом сюда напишу...Если что исправить поможете...? smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






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^.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®;
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;


Или так будет не правильно? Подскажите пожалуйста....
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






...я сейчас чуть-чуть исправила... (может так лучше - я не знаю)....но оно по крайней мере стало запускаться правда потом ошибку выдавать №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^.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®;
end;
until not found;

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

 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.10.2021 2:36
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name