|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
06.07.2013, 20:00 | #1 |
Регистрация: 26.12.2012
Сообщений: 8
|
объясните функцию удаления
есть код:
Код:
Код:
Последний раз редактировалось Pomogi; 06.07.2013 в 20:02. |
07.07.2013, 05:27 | #2 |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,603
|
Какой задача была изначально? Возможно, создание элемента структуры ошибка, так как указатель меняет адрес и память не освобождается (происходит утечка памяти)
Не делается проверки next на 0 что будет вызывать падение программы, если в списке только один элемент. Если n <= 1 то список становится несвязным, и теряется все после head. d->next указывает на деревню дедушке, то есть в никуда. Если n = 2 то выполнение будет состоять из следующих операторов: d=new node; p=head; p=p->next; // переход на следующий элемент списка d=p->next;// переход на следующий элемент списка p->next=d->next;// переход на следующий элемент списка delete d; head - это, наверное, указатель на начало списка. Если это не так, то поведение функции непредсказуемо, и неизвестен результат выполнения операторов. Будем предполагать, что head все-таки указывает на начало списка и в списке не один элемент. Так как если элемент один, произойдет падение программы на операторе p=p->next; так как следующего элемента попросту нет. Если в списке 2 элемента, то у нового p нет последующего элемента, и снова произойдет падение программы на операторе d=p->next;. При этом то на что указывает d при создании нового элемент списка d=new node теоряется в пустоту и происходит утечка памяти Если в списке 3 элемента, то у нового d нет последующего элемента, и падление программы произойдет на операторе p->next=d->next. Если в списке 4 и более элементов то выполнение куска кода будет успешным. p=head; // p указывает на первый элемент списка p=p->next; // p указывает на второй элемент списка d=p->next; // d указывает на третий элемент списка p->next=d->next; // p->next указывает на четвертый элемент списка delete d; // удаляется третий элемент списка Таким образом, в случае n = 2 программа может удалить третий элемент списка Если n = 3 то выполнение будет состоять из следующих операторов: node *d; d=new node; p=head; // p указывает на первый элемент списка p=p->next; // p указывает на второй элемент списка d=p->next; // d указывает на третий элемент списка p=p->next; // p указывает на третий элемент списка d=p->next; // d указывает на четвертый элемент списка p->next=d->next; // p->next указывает на пятый элемент списка delete d; // удаляется четвертый элемент списка
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
|
07.07.2013, 12:42 | #3 |
Регистрация: 26.12.2012
Сообщений: 8
|
вот вся программа:
Код:
|
07.07.2013, 14:41 | #4 |
Участник клуба
Регистрация: 30.07.2008
Сообщений: 1,603
|
После del(y); нужно уменьшить n на единицу оператором n--, так как далее в цикле for считается по старому и на p=p->next происходит падение.
Функцию del можно переписать в следующем виде: Код:
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
c++ написать функцию удаления последнего элемента из списка | scrinn | Помощь студентам | 0 | 04.06.2012 23:56 |
Объясните функцию c_str | PotatoCaptain | Общие вопросы C/C++ | 2 | 21.12.2011 14:44 |
Описать функцию нахождения расстояния между 2-мя точками на плоскости, заданными своими координатами, и функцию .... | zzz6 | Помощь студентам | 2 | 06.07.2011 08:24 |
Сумма ряда с точностью Е=10-4, Сформировать обномерный массив, написать функцию для удаления строки... | Dasha M | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 06.05.2011 18:33 |