Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2012, 20:22   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию Удаление записи из списка

Доброе время суток. Нужен совет опытных специалистов.

begin - начало связного списка
end - конец связного списка
*p -указатель на двусвязный список
pnext, pprev - указатели на предыдущий и следующий элементы списка

У меня организовано меню.
При выборе элемента меню, он сразу не заходит в меню удаления, только после второго нажатия. И при удалении последнего элемента программа зависает и вылетает. Подскажите как можно построить код.
Код:
void DelGoods(Spis *p)
{
	Spis	*temp;
	char	tmp[SIZE];
	
	printf("\n Введите название удаляемого товара: ");
	gets(tmp);
	
	p = begin;
	
	while(p != NULL)
	{
		if(strcmp((p->title), tmp) == 0)
		{
			if(p == begin)
			{
				begin = p->pnext;
				begin->pprev = NULL;
				free(p);
				p = begin;
			}
			else if(p == end)
			{
				end = p->pprev;
				end->pnext = NULL;
				free(p);
				p = end;
			}
			else
			{
				p->pnext->pprev = p->pprev;
				p->pprev->pnext = p->pnext;
				temp = p;
				p = p->pnext;
				free(temp);
			}
		}
		else
			p = p->pnext;
	}
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Stilet; 01.11.2012 в 23:04.
Bugrimov вне форума Ответить с цитированием
Старый 01.11.2012, 23:11   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
else if(p == end)
Точно end указывает на последний элемент?
Так по этой части кода я не вижу проблемных мест.
Хотя я бы на всякий случай сделал вот так:
Код:
while(p != NULL)
	{
		if(strcmp((p->title), tmp) == 0)
		{
                     Тут твои ифы
                     break // Дабы выйти из цикла, раз уж найден элемент
                 }
         }
А то ведь после удаления по идее цикл начнет с последнего элемента проход.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.11.2012, 20:35   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Смысл кода тот же, только удаление по номеру, что-то не получается.
В функцию передаю адрес начала списка &list
Тип поменял на DoubleList
PrintList(begin); - печатает таблицу что бы видно было что удалять.
Пока не могу решить эту задачу. Подскажите советом, идеей....
Код:
void DeleteItem(DoubleList *p)
{
	int i;
	int num;
	DoubleList	*ptr;
	DoubleList	*Current = p;

	PrintList(begin);
	printf("\n Введите номер товара для удаления: ");
	scanf("%d", &num);

	for(i = 1; i < num && Current != NULL; i++)
		Current = Current->pnext;
	if(Current != NULL)
	{
		if(Current->pprev == NULL)
		{
			p = p->pnext;
			free(Current);
			p->pprev = NULL;
			Current = p;
		}
		else 
			if(Current->pnext == NULL)
			{
				Current->pprev->pnext = NULL;
				free(Current);
				Current = p;
			}
		else
		{
			ptr = Current->pnext;
			Current->pprev->pnext = Current->pnext;
			Current->pnext->pprev = Current->pprev;
			free(Current);
			Current = ptr;
		}
	}
}
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Stilet; 05.11.2012 в 21:27.
Bugrimov вне форума Ответить с цитированием
Старый 05.11.2012, 21:23   #4
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

В функцию ничего не передаю. Вместо p - begin. Удалять удаляет, но после такого удаления при добавлении вылетает программа.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 05.11.2012, 21:45   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что именно не получается? Отладчиком проходил?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.11.2012, 21:53   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Дважды приходится нажимать ENTER чтобы подтвердить выбор нужной таблицы.Вылетает при удалении последнего элемента.
Код:
void DeleteItem(void)
{
	int i;
	int num;
	DoubleList	*temp;
	DoubleList	*Current;
	
	Current = begin;

	PrintList(begin);
	printf("\n Введите номер товара для удаления: ");
	scanf("%d", &num);

	for(i = 1; i <= num && Current != NULL; i++)
		Current = Current->pnext;
		if(Current != NULL)
		{
			if(Current == begin)
			{
				begin = Current->pnext;
				begin->pprev = NULL;
				free(Current);
				Current = begin;
			}
			else if(Current == end)
			{
				end = Current->pprev;
				end->pnext = NULL;
				free(Current);
				Current = end;
			}
			else
			{
				Current->pnext->pprev = Current->pprev;
				Current->pprev->pnext = Current->pnext;
				temp = Current;
				Current = Current->pnext;
				free(temp);
			}
}}
From Stilet: У нас принято хотя бы из уважения выделять код спецтегом по кнопке # в панели инструментов окна поста. Попрошу этим пользоваться!

Не таблицы, а элемента в таблице
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Stilet; 05.11.2012 в 22:37.
Bugrimov вне форума Ответить с цитированием
Старый 05.11.2012, 22:01   #7
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

С двойным нажатием разобрался........

Не удаляется последний элемент.
Подскажите пожалуйста еще такой момент, если указать не существующий элемент, т.е. строку которой нет, как это можно реализовать.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Stilet; 05.11.2012 в 22:39.
Bugrimov вне форума Ответить с цитированием
Старый 05.11.2012, 22:44   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Не удаляется последний элемент.
Ошибку бьет? На какой строке?
Цитата:
если указать не существующий элемент, т.е. строку которой нет, как это можно реализовать.
Всмысле номер строки? Так у тебя же защита против такого уже описана - цикл дойдет до конца списка и выскочит из процедуры
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 05.11.2012, 22:54   #9
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Код:
if(Current == begin)
			{
				begin = Current->pnext;
				begin->pprev = NULL;
				free(Current);
				Current = begin;
Вот в этом куске кода...

Код:
begin->pprev = NULL;
Отладчик останавливается
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Stilet; 05.11.2012 в 23:01.
Bugrimov вне форума Ответить с цитированием
Старый 05.11.2012, 22:57   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну так получается у тебя begin указывает на последний элемент?
или это у тебя стэк?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элемента списка igoldyrev Помощь студентам 2 06.03.2011 14:24
удаление из списка(си) zhenya.ya Помощь студентам 0 31.05.2010 19:36
Удаление последнего элемента из списка и реверс этого списка. Goose Общие вопросы C/C++ 8 16.05.2010 16:12
удаление элемента из списка yagluboko Помощь студентам 1 10.04.2010 14:54
Удаление элементов из списка Wi1D Помощь студентам 0 18.05.2009 00:23