Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 371
∙ повысить рейтинг »
Степанов Иван /REDDS
Статус: 3-й класс
Рейтинг: 139
∙ повысить рейтинг »
solowey
Статус: 3-й класс
Рейтинг: 109
∙ повысить рейтинг »

∙ С / С++

Номер выпуска:1892
Дата выхода:11.12.2016, 00:15
Администратор рассылки:Андрей Кузнецов aka Dr_Andrew (Старший модератор)
Подписчиков / экспертов:23 / 16
Вопросов / ответов:1 / 1

Консультация # 190194: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Написать программу для получения из односвязного, двусвязного и двусвязного списка с головой циклического списка уникальных элементов. Oписаны структуры данных, для каждой написан метод поиска уникальных элементов, но работает он не правильно. В этом главная проблема. Не знаю правильно ...

Консультация # 190194:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Написать программу для получения из односвязного, двусвязного и двусвязного списка с головой циклического списка уникальных элементов.
Oписаны структуры данных, для каждой написан метод поиска уникальных элементов, но работает он не правильно. В этом главная проблема. Не знаю правильно ли я поняла и описала двусвязный и двусвязный список с головой
Еще вызывает затруднения создания самого списка уникальных элементов.
Код местами корявый и запутанный, а может и не местами smile

Дата отправки: 30.11.2016, 11:29
Вопрос задал: ksenya241 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, ksenya241!
Посмотрите, как я сделал

#include <stdlib.h>
#include <iostream.h>
 
struct Node1			//Узел однонаправленного списка
{
	int x;
	Node1 *Next;		//Указатель на адрес следующего элемента списка
};

struct Node2			//Узел двунаправленного и двунаправленного циклического списка
{
	int x;
	Node2 *Next,*Prev;	//Указатели на адреса следующего и предыдущего элементов списка
};

//Однонаправленный список
class List1
{
	Node1 *Head;		//Указатель на началь списка
public:
	List1():Head(NULL){}; //Инициализируем адрес как пустой
	~List1();			//Деструктор
	void Show();		//Функция отображения списка на экране
	void Add(int x);	//Функция добавления элементов в список
	void Unique();		//Функция поиска и вывода уникальных элементов
};
 
List1::~List1()			//Деструктор
{
	Node1 *temp;
	while (Head)		//Пока по адресу на начало списка что-то есть
	{
		temp=Head->Next;//Резервная копия адреса следующего узла списка
		delete Head;	//Очистка памяти от узла, адресуемого Head
		Head=temp;		//Смена адреса на следующий элемент
	}
 }
 
 void List1::Add(int x)	//добавление элемента в конец однонаправленного списка
 {
	Node1 *temp;
	Node1 *newnode=new Node1;	//Выделение памяти под новый узел
	newnode->Next=NULL;			//Указываем, что изначально по следующему адресу пусто
	newnode->x=x;				//Записываем значение в структуру
 
	if (Head!=NULL)			//Если список не пуст
	{						//найдем последний узел списка
		for(temp=Head;temp->Next;temp=temp->Next);	//пока не найдем такой, у которого адрес Next == NULL
		temp->Next=newnode;	//Указываем, что новый становится за найденным
	}
	else //Если список пустой
		Head=newnode;		//новый становится первым
}
 
void List1::Show()			//вывод всех узлов списка
{
	Node1 *temp;
							
	temp=Head;				//начинаем с адреса первого элемента
	while (temp!=NULL)		//Пока не встретим пустое значение
	{
		cout<<temp->x<<" "; //Выводим поле х на экран
		temp=temp->Next;	//Смена адреса на адрес следующего узла
	}
	cout<<"\n";				//перевод строки в конце вывода
}

void List1::Unique()		//поиск и вывод уникальных элементов
{
	Node1	*temp1, *temp2;

	for(temp1=Head; temp1; temp1=temp1->Next)	//по всем узлам списка
	{
		for(temp2=Head; temp2; temp2=temp2->Next)	//и опять по всем узлам списка
		{
			if ((temp1 != temp2) && (temp1->x == temp2->x))	//если у разных узлов одинаковые поля х
				break;										//то прерываем поиск
		}
		if (temp2 == NULL)	//если temp2=NULL, то просмотрели весь список и равных temp1->x не нашли
			cout << temp1->x << " ";	//значит, значение temp1->x - уникальное, выведем его!
	}
	cout << endl;
}
 
//двунаправленный поиск
class List2
{
	Node2 *Head,*Tail; //Указатели на адреса начала списка и его конца
public:
	List2():Head(NULL),Tail(NULL){}; //Инициализируем адреса как пустые
	~List2();		//Деструктор
	void Show();	//Функция отображения списка на экране
	void Add(int x);//Функция добавления узлов в конец списка
	void Unique();	//поиск и вывод уникальных элементов
};
 
List2::~List2() //Деструктор
{	
	while (Head) //Пока по адресу на начало списка что-то есть
	{
		Tail=Head->Next;
		delete Head;
		Head=Tail;
	}
 }
 
 void List2::Add(int x)		//добавление элемента в конец двунаправленного списка
 {
	Node2 *temp=new Node2;	//Выделение памяти под новый узел списка
	temp->Next=NULL;		//Указываем, что изначально по следующему адресу пусто
	temp->x=x;				//Записываем значение в структуру
 
	if (Head!=NULL)			//Если список не пуст
	{
		temp->Prev=Tail;	//предыдущий нового будет равен хвосту
		Tail->Next=temp;	//следующий хвоста будет равен новому
		Tail=temp;			//новый будет новым хвостом
	}
	else //Если список пустой
	{
		temp->Prev=NULL;	//Предыдущий элемент указывает в пустоту
		Head=Tail=temp;		//Голова=Хвост=тот элемент, что сейчас добавили
	}
}
 
void List2::Show()			//выводим на экран
{
	Node2 *temp;

	temp=Head;				//начинаем с адреса первого элемента
	while (temp!=NULL)		//Пока не встретим пустое значение
	{
		cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
		temp=temp->Next;	//Смена адреса на адрес следующего элемента
	}
	cout<<"\n";
}

void List2::Unique()		//поиск уникальных
{							//аналогично
	Node2	*temp1, *temp2;

	for(temp1=Head; temp1; temp1=temp1->Next)
	{
		for(temp2=Head; temp2; temp2=temp2->Next)
		{
			if ((temp1 != temp2) && (temp1->x == temp2->x))
				break;
		}
		if (temp2 == NULL)
			cout << temp1->x << " ";
	}
	cout << endl;
}

//двунаправленный циклический список с головой
class List3
{
	Node2 *Head;			//Указатель на адреса начала списка
public:
	List3():Head(NULL){};	//Инициализируем адреса как пустые
	~List3();				//Деструктор
	void Show();			//Функция отображения списка на экране
	void Add(int x);		//Функция добавления элементов в список
	void Unique();			//поиск и вывод уникальных
};
 
List3::~List3()				//Деструктор
{	
	Node2 *temp1, *temp2;
	if (Head != NULL)		//есть ли вообще?
	{
		temp1=Head;			//адрес, кого будем удалять
		do
		{
			temp2=temp1->Next;	//адрес следующего
			delete temp1;		//удаляем
			temp1=temp2;		//на адрес следующего
		}while (temp1!=Head);	//пока не получим адрес бывшего первого
	}
 }
 
 void List3::Add(int x)		//добавление в конец списка
 {
	Node2 *temp=new Node2;	//Выделение памяти под новый узел списка
	temp->x=x;				//Записываем значение в структуру
 
	if (Head!=NULL)			//Если список не пуст
	{
		temp->Prev=Head->Prev;	//адрес предыдущего нового будет равен адресу последнего
		temp->Next=Head;		//адрес следующего за новым будет равен голове
		Head->Prev->Next=temp;	//следующий за последнеим будет равет адресу нового
		Head->Prev=temp;		//предыдущий головы будет равен адресу нового
	}
	else //Если список пустой
	{
		temp->Prev=temp;		//предыдущий и следующий нового будут ссылаться на себя
		temp->Next=temp;
		Head=temp;				//новый будет головой
	}
}
 
void List3::Show()			//вывод на экран
{
	Node2 *temp;

	if (Head)				//есть ли вообще?
	{
		temp=Head;				//начинаем с адреса первого элемента
		do
		{
			cout<<temp->x<<" "; //Выводим каждое считанное значение на экран
			temp=temp->Next;	//Смена адреса на адрес следующего элемента
		}while (temp!=Head);
		cout<<"\n";
	}
}

void List3::Unique()		//поиск уникальных
{
	Node2	*temp1, *temp2;

	if (Head)				//есть ли вообще?
	{
		temp1=Head;			//начинаем с первого
		do
		{
			temp2=Head;		//для каждого просмотрим еще раз весь список
			do
			{
				if (temp1 != temp2)	//смотрим только на разные
				{
					if (temp1->x == temp2->x)	//для одинаковых значений
						break;					//прерываем поиск
				}
				temp2=temp2->Next;				//на следующий
			}while (temp2!=Head);				//пока не встретим первого
			if (temp2==Head)					//просмотрели до конца?
				cout << temp1->x << " ";		//да - уникальный - выводим
			temp1=temp1->Next;		//ищем следующий
		}while (temp1!=Head);		//по всем
		cout << endl;
	}
}
 
int main ()
{
	cout << "List1" << endl;
	List1 lst1;				//Однонаправленный список
	lst1.Add(100);			//Добавляем в список элементы
	lst1.Add(200);
	lst1.Add(900);
	lst1.Add(888);
	lst1.Add(200);
 
	lst1.Show();			//Отображаем список на экране
	cout << "Unique: ";
	lst1.Unique();			//выводим уникальные

	cout << "List2" << endl;
	List2 lst2;				//двунаправленный список
	lst2.Add(100);
	lst2.Add(200);
	lst2.Add(900);
	lst2.Add(888);
	lst2.Add(200);
 
	lst2.Show();
	cout << "Unique: ";
	lst2.Unique();

	cout << "List3" << endl;
	List3 lst3;				//двунаправленный циклический список
	lst3.Add(100);
	lst3.Add(200);
	lst3.Add(900);
	lst3.Add(888);
	lst3.Add(200);
 
	lst3.Show();
	cout << "Unique: ";
	lst3.Unique();

	return 0;
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 05.12.2016, 14:56
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное