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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2008, 23:22   #1
Вилен
 
Регистрация: 09.10.2007
Сообщений: 4
По умолчанию Списки

Существует список. Необходимо написать функцию, которая оставляет в списке только первые вхождения одинаковых элементов.
Код:
template <class T>
void List<T>::only_first(node<T>*p1)
{
	node<T>* a=p1;
	node<T>* b=p1;
	node<T>* c=p1;
	while(a->next)
	{
		while(b->next)
		{
			if(a->item==b->next->item) 
			{
				 if(a->next->item!=b->next->next->item) //это условие очень нехорошее
				{
				c=b->next->next;
				delete b->next;
				b->next=c;
			}
			}
			b=b->next;
		}
		a=a->next;
		b=p1;
	}
}
Проблема заключается в том, что идут операции над одним и тем же элементом списка и в результате получаются неприятности. Необходимо какое-то приличное условие, исключающее работу над одним и тем же узлом.
А вот еще одна есть трудность: Сортировка вставками как реализовать в списке, работая только с указателями и не переписывания в массив?
Вилен вне форума Ответить с цитированием
Старый 21.05.2008, 23:50   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Код:

	while( a->next)
	{
		while(a->next != NULL && a->item == (a->next)->item)
		{
			b = a->next;
			a->next = a->next->next;
			delete b;
		}
		a = a->next;
	}
А сортировка вставками... это ведь, дай Бог памяти, та, в которой нужно сдвигать массив, а потом менять местами начало и конец диапазона?.. Так ведь списки и двигать не нужно, просто перевесить узел из конца в начало...
B_N вне форума Ответить с цитированием
Старый 22.05.2008, 00:17   #3
Вилен
 
Регистрация: 09.10.2007
Сообщений: 4
По умолчанию

Этот алгоритм справедлив только если повторяющиеся элементы идут подряд? А если повторяющиеся элементы находятся в разных концах списка?
Вилен вне форума Ответить с цитированием
Старый 22.05.2008, 00:40   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Вилен Посмотреть сообщение
Этот алгоритм справедлив только если повторяющиеся элементы идут подряд? А если повторяющиеся элементы находятся в разных концах списка?
Ну так я понял условие, выходит.

Код:
	while( a->next)
	{
		b = a->next;
		while(b)
		{
			if(a->item == b->item)
			{
				c = b->next;
				delete b;
				b = c;
			}
		}
		a = a->next;
	}
Ну а про то, что пустые ссылки должны быть NULL, думаю, напоминать не стоит.....
B_N вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На списки... Neznau Паскаль, Turbo Pascal, PascalABC.NET 1 02.07.2008 19:49
списки Влдислаав3911 Паскаль, Turbo Pascal, PascalABC.NET 5 10.05.2008 17:35
Списки... Arkuz Компоненты Delphi 2 19.04.2008 22:58
Списки AVer Паскаль, Turbo Pascal, PascalABC.NET 6 06.12.2006 23:05