Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 24.04.2013, 21:20   #1
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию Проблемы с удалением элемента в однонаправленном линейном списке.

Код:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

const int N =15;

struct List
{
int data;
List *next;
}; 

int main()

{
List *root,*p,*q,*fin;

root = new List;
root->data=(1 + rand() % 15)*10;
root->next=NULL;
fin=root;


srand(time(NULL));

for(int i=1;i<N;i++)
{
q=new List;
q->data=(1 + rand() % 15)*10;
q->next=root;
root=q;
}


q=root;

while(q)
{
printf("%i\n",q->data);
q=q->next;
}

p=root;

q=root->next;

while(q)
{
if((q->data)<(p->data)) p=q;
q=q->next;
}

printf("\n\nmin = %i\n\n",p->data);

q=p;
if(q!=fin)
{
	
*q=*q->next;
q=p->next;
delete q;
}

q=root;

while(q)
{
printf("%i\n",q->data);
q=q->next;
}
system("pause");
return 0;
}
Если закомменчиваю delete q всё нормально работает, в чём проблема?
ivan.tiran вне форума Ответить с цитированием
Старый 24.04.2013, 21:40   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
*q=*q->next;
Может так?:
Код:
q=q->next;
Зачем разименовываешь, в смысле?

Кстати, а текст ошибки то должен быть какой-нить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 24.04.2013, 21:46   #3
ivan.tiran
Форумчанин
 
Аватар для ivan.tiran
 
Регистрация: 24.08.2011
Сообщений: 138
По умолчанию

Там не текст ошибки, если прописываю delete q, то в последнем цикле вывода происходит зацикливание

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

Последний раз редактировалось Stilet; 24.04.2013 в 22:24.
ivan.tiran вне форума Ответить с цитированием
Старый 24.04.2013, 22:29   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
так как в однонаправленном линейном списке нет доступа к предыдущему элементу
Тьху ты...
Код:
for(List* i=root,p=i->next;i && p && p->data!=искомому;i=p,p=p->next);
if(p) {
 i->next=p->next; 
 delete p;
}
Вот как бы я удалял из списка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление и добавление звена в линейном списке Arantir# Помощь студентам 1 30.11.2012 07:40
Проблемы с удалением строк (VBA) WennY Microsoft Office Excel 8 23.02.2012 18:50
проблемы с удалением строки в таблице retede JavaScript, Ajax 2 15.01.2010 13:57
поиск в линейном списке Yura_n Общие вопросы C/C++ 9 23.07.2009 01:42


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS