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

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

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

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


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

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


Итак, всё замечательно теперь со всеми моими процедурами. За исключением одной детали. Pascal зацикливает, если попробовать удалить последний элемент.

Процедура удаления к-ого элемента:

 Procedure DeleteNode(var p:Dlist);
var q:dlist;
i,k:integer;
begin
if p=nil then writeln ('spisok pust')
else
begin
i:=1;
writeln ('vvedite k:');
readln (k);
if k>1 then begin
q:=p^.next;
while (q<>p) and (i<>k-1) do
begin
q:=q^.next;
inc(i);
end;
end
else begin
i:=0; q:=p;
end;
if i<>k-1 then
writeln ('uzel ne naiden')
else
if q^.next=q then
begin
p:=nil;
dispose(q);
end
else
begin
if q=p then
p:=p^.next;
q^.prev^.next:=q^.next;
q^.next^.prev:=q^.prev;
dispose (q);
end;
end;
end;


Процедура добавления элемента вслед за к-ым:

Procedure AddNewNode (var p:Dlist; info:integer);
var
newnode:Dlist;
q,pp:Dlist;
i,kk:integer;
begin
i:=1;
if (p = nil) then
begin
New(q);
writeln ('vvedite info:');
readln(info);
q^.info:=info;
q^.next:=q;
q^.prev:=q;
p:=q;
end
else begin
writeln ('vvedite k:');
readln (k);
q:=p^.next;
if p=q then dec(i);
while (q<>p) and (i<k-1) do
begin
q:=q^.next;
i:=i+1;
end;
if i<>k-1 then
writeln ('nepravilniy nomer')
else begin
new(pp);
writeln ('vvedite info:');
readln(info);
pp^.next:=q^.next;
pp^.next^.prev:=pp;
q^.next:=pp;
pp^.info:=info;
end;
end;
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Последний - имеется в виду, скажем 5-ый из пяти, который указывает на первый, или единственный, который указывает сам на себя?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

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


5-ый из 5. С единственным он нормально всё делает. Был элемент и нет его. А вот с "5-ым из 5" он глючит.

Причём, кстати, последний элемент, который включён вот этой процедурой (включение нового элемента в конец списка), всё нормально:

Procedure CreateNewNode (var p:Dlist; info:integer);
var
newnode:Dlist;
pos:Dlist;
begin
New (newnode);
newnode^.info:=info;
if (p = nil) then
begin {spisok pustoi}
newnode^.next:=newnode;
newnode^.prev:=newnode;
p:=newnode;
end;
newnode^.prev:=p^.prev;
newnode^.next:=p;
p^.prev^.next:=newnode;
p^.prev:=newnode;
end;


Сообщение отредактировано: volvo -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Ничего не глючит... Только что проверил на 5 элементах как раз - все нормально отработало...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

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


ээээээ.... blink.gif А у меня зацикливает...в чём же причина... blink.gif blink.gif blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Присоединяй полностью программу с файлами данных, потому что я делал добавление своей процедурой AddNewNode...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

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


Может быть в процедуре вывода на экран? Хотя за ней не было замечено ничего плохого до сих пор...

Procedure Showlist(p:Dlist);
var
pos:Dlist;
begin
if (p = nil) then exit;
pos:=p;
repeat
writeln (pos^.info);
pos:=pos^.next;
until (pos = p)
end;


Ну хорошо, я всё прикрепила...

Сообщение отредактировано: volvo -


Прикрепленные файлы
Прикрепленный файл  SPISKI1.PAS ( 5.45 килобайт ) Кол-во скачиваний: 164
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Ты неправильно делаешь кое-что в процедуре AddNewNode... Вот твой текст:

...
if i<>k-1 then
writeln ('nepravilniy nomer')
else begin
new(pp);
writeln ('vvedite info:');
readln(info);
pp^.next:=q^.next; { !!! Внимание - начиная отсюда !!! }
pp^.next^.prev:=pp;
q^.next:=pp;
pp^.info:=info;
end;
...

А теперь сравни это с тем, что я тебе показывал здесь: Двусвязный Кольцевой список

(в частности, обрати внимание - pp^.prev у тебя вообще не изменяется, хотя должно...)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Женский

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


Слушай точно. Я строчку пропустила! Я бы долго искала! unsure.gif Ну вот какой ты молодец! Теперь всё хорошо. Если бы не ты, то хана бы мне была от списков. Спасибо тебе большое. Какой замечательный и полезный форум! smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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