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

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

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

 
 Ответить  Открыть новую тему 
> Двусвязные и односвязные списки, удаление из списка
КСЮШОК
сообщение 4.12.2006 18:13
Сообщение #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 .....
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 4.12.2006 19:48
Сообщение #2


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

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

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


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


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


Гость






Ну я же говорила что в этом ничего не понимаю...
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 4.12.2006 20:57
Сообщение #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;
...



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


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


Гость






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


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

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

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


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


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


Гость






blink.gif А может еще одну процедуру добавить...занесения элемента в список, вот там и вторую связь как-нибудь вставить...Ну я там счас ошибок понаделаю и все сразу как всегда работать перестанет...Ну я попробую, а потом сюда напишу...Если что исправить поможете...? smile.gif
 К началу страницы 
+ Ответить 
КСЮШОК
сообщение 5.12.2006 16:33
Сообщение #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;


Или так будет не правильно? Подскажите пожалуйста....
 К началу страницы 
+ Ответить 
КСЮШОК
сообщение 5.12.2006 17:02
Сообщение #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

 



- Текстовая версия 25.06.2025 11:15
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"