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

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

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

> динам. списки. Стандартные операции, Неккоректная процедура удаления эл-та.
сообщение
Сообщение #1


Новичок
*

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

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


идея задачи в том: что бы произвести со списком различные действия. Проблема в удалении элемента списка по имени. Пробовал различные условия и составление процедуры/ процедур, но что бы полноценно из любого места удалял эл-т не выходит. Как пр: "если ввожу 3 эл-та и удаляю последний - все хорошо. но если следом удаляю 2 то он впринцепи прогоняет и выводит ответ: но вмете с тем и вылетает." . Косяк, я предполагаю, в неккоректных условиях, т.е. выходит за пределы списка.
опишите подробней пожалуйста мои ошибки.

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


Прикрепленные файлы
Прикрепленный файл  _______________________.rar ( 33.18 килобайт ) Кол-во скачиваний: 227
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Цитата
Косяк, я предполагаю, в неккоректных условиях, т.е. выходит за пределы списка.
Правильно предполагаешь:

Цитата
if (p^.mName=dName) then
begin
writeln;
writeln('данные найдены в картотеке.Удаляем');
Q:=p;
p:=Q^.mNext; // <--- Угу...
Q^.mNext:=p^.mNext;
p^.mNext:=nil;
dispose(p);
writeln;
writeln('информация о ',dName ,' удалена');
end

... безоговорочное действие, правда? В P записать Q^.mNext, чего ж проще? А ничего, что этот самый Q^.mNext может быть nil? Значит, и P = nil после отмеченной строки? Стоп, а что ж дальше ты делаешь? Ух ты... Разыменовываешь p... Как интересно, особенно в случае когда p = nil. Программе ничего не остается кроме как вылететь...

На самом деле мне не понятно, во-первых, в чем тут преимущество списка с заглавным звеном. Объяснишь? Вот я лично в этом ничего, кроме неудобства (надо сдвигаться на 1 элемент прежде чем начать работать собственно со списком) не вижу. Зачем надо выделять лишнюю память?

Во-вторых, даже если с заглавным. К чему 2 ветки if then ... else ... ? Что, вот так:
procedure delete_person (var L: PPerson);
var
p, Q : PPerson;
dName: string;
begin
if Empty(L)= true then
writeln('извините, но список пуст')
else
begin
writeln('введите имя удаляемого клиента');
readln(dName);
LowCase(dName); // переводим введенное имя в нижний регистр
p := L;
while Assigned(p^.mNext) do
begin
if p^.mNext^.mName = dName then
begin
Q := p^.mNext;
p^.mNext := Q^.mNext;
dispose(Q);
writeln('информация о ',dName ,' удалена');
end
else
p := p^.mNext;
end;
end;
end;

- это слишком просто? smile.gif Ну, добавить еще проверку, что никто не был найден, и не был удален...

Дальше, по недочетам: удаление заглавного звена (да и вообще списка) где? При выходе из программы FPC выдает сообщение об утечке памяти, именно из-за этого злосчастного звена.

Печать пустого списка. Какое-то сообщение можно написать? Или достаточно молча, ничего не говоря, выйти из процедуры?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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