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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

Код:
#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,815
Репутация: 6850
По умолчанию

Цитата:
*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
Сообщений: 133
Репутация: 8
По умолчанию

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

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

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

Цитата:
так как в однонаправленном линейном списке нет доступа к предыдущему элементу
Тьху ты...
Код:
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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление и добавление звена в линейном списке 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


08:33.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.