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

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

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

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


Новичок
*

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

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


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

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


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


a.k.a. volvo877
*****

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

Репутация: -  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

 



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