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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.11.2017, 10:33   #1
Shadownx
 
Регистрация: 16.11.2017
Сообщений: 5
По умолчанию Функция удаления элемента списка

Доброе время суток, писал ДЗ по программированию,задача была реализовать функцию удаления первого вхождения элемента, то есть вводит 3,он находит первый элемент с этим значением и удаляет его, я реализовал все случаи и для первого элемента и для последнего,все работает корректно без ошибок, но после проверки мне было сказано что в моей функции таится серьезная ошибка, как она проявляется мне не было сказано,единственная информация которую мне дали это проверить пограничные варианты,но на стадии тестирования никаких проблем выявлено не было и я даже представить не могу как найти то чего для меня по сути сейчас просто нет, помогите пожалуйста

Код:
void delete_element(Node **first,Node **last) {
	Node *current=*first;
	Node *prev=nullptr;
	int delete_element=0;
	cout<<"please enter element value"<<endl;
	cin>>delete_element;
	if(current->data==delete_element) {
		if(current==(*first)) {
			(*first)=(*first)->next;
			delete current;
			return;
		}
	}
	prev=current;
	current=current->next;
	while(current!=nullptr) {
		if(current->data==delete_element && current!=(*last)) {
			prev->next=current->next;
			delete current;
			return;
		} else if(current->data==delete_element && current==(*last)) {
			(*last)=prev;
			(*last)->next=nullptr;
			delete current;
			return;
		}
		prev=current;
		current=current->next;
	}
	cout<<"list don't have this element"<<endl;
}
Shadownx вне форума Ответить с цитированием
Старый 16.11.2017, 10:46   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

когда в списке всего один единственный элемент, first и last указывают на него?
Тогда, если этот единственный хотят удалить, first станет nullptr, а вот last будет указывать на мусор.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.11.2017, 10:54   #3
Shadownx
 
Регистрация: 16.11.2017
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
когда в списке всего один единственный элемент, first и last указывают на него?
Тогда, если этот единственный хотят удалить, first станет nullptr, а вот last будет указывать на мусор.
нужно рассмотреть отдельный случай? или можно это как-то в общем виде починить? просто у меня как вы видите написано я полагаю весьма неуклюже и как правильней решить данную проблему я не знаю
Shadownx вне форума Ответить с цитированием
Старый 16.11.2017, 11:08   #4
Shadownx
 
Регистрация: 16.11.2017
Сообщений: 5
По умолчанию

Вот так я полагаю!?

Код:
void delete_element(Node **first,Node **last) {
	Node *current=*first;
	Node *prev=nullptr;
	int delete_element=0;
	cin>>delete_element;
	if(current->data==delete_element) {
		if(current==(*first) && (*first)!=(*last)) {
			(*first)=(*first)->next;
			delete current;
			return ;
		}
		else if(current==(*first) && (*first)==(*last))
		{
			(*first)=nullptr;
			(*last)=(*first);
			delete current;
			return;
		}
	}
	while(current!=nullptr) {
		if(current->data==delete_element && current!=(*last)) {
			prev->next=current->next;
			delete current;
			return;
		} else if(current->data==delete_element && current==(*last)) {
			(*last)=prev;
			(*first)=(*last);
			(*last)->next=nullptr;
			delete current;
			return;
		}
		prev=current;
		current=current->next;
	}
	cout<<"list dont have this element"<<endl;
}
Shadownx вне форума Ответить с цитированием
Старый 16.11.2017, 11:30   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

я бы проще записал:
Код:
if(current->data==delete_element) {
		if(current==(*first)) {
			if ((*first)==(*last)){
				(*last)=nullptr;
			}
			(*first)=(*first)->next;
			delete current;
			return ;
		}
}
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.11.2017, 11:33   #6
Shadownx
 
Регистрация: 16.11.2017
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я бы проще записал:
Код:
if(current->data==delete_element) {
		if(current==(*first)) {
			if ((*first)==(*last)){
				(*last)=nullptr;
			}
			(*first)=(*first)->next;
			delete current;
			return ;
		}
}
спасибо вам огромное,за подсказку и помощь
Shadownx вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
После каждого элемента списка добавьте ту часть списка, которая была перед ним - Pascal ABC Panchess Паскаль, Turbo Pascal, PascalABC.NET 6 10.04.2017 11:12
c++ написать функцию удаления последнего элемента из списка scrinn Помощь студентам 0 04.06.2012 23:56
Программа удаления элемента из конца связанного списка. zeroakaking Помощь студентам 2 01.07.2011 13:18
Функция создания нового элемента списка C++ system_error Помощь студентам 5 03.05.2011 21:14
Удаление последнего элемента из списка и реверс этого списка. Goose Общие вопросы C/C++ 8 16.05.2010 16:12