18.11.2017, 07:44 [+3 UTC]
в нашей команде: 2 266 чел. | участники онлайн: 2 (рекорд: 21)

:: РЕГИСТРАЦИЯ

:: консультации

:: задать вопрос

:: все разделы

:: правила

:: новости

:: участники

:: доска почёта

:: форум

:: блоги

:: поиск

:: статистика

:: наш журнал

:: наши встречи

:: наша галерея

:: отзывы о нас

:: поддержка

:: руководство

Версия системы:
7.41 (25.02.2017)

Общие новости:
23.02.2017, 09:51

Форум:
15.11.2017, 20:36

Последний вопрос:
17.11.2017, 17:46

Последний ответ:
17.11.2017, 20:56

Последняя рассылка:
18.11.2017, 05:15

Писем в очереди:
0

Мы в соцсетях:

Наша кнопка:

RFpro.ru - здесь вам помогут!

Отзывы о нас:
26.05.2010, 23:38 »
Roman K.
Спасибо! Как понимаю это ссылки не на саму программу тренировок, но также почитаю! [вопрос № 178621, ответ № 261632]
19.04.2012, 04:07 »
Arman Muratuly
Короткий и ясный ответ. Спасибо. [вопрос № 185855, ответ № 270577]
26.09.2010, 16:39 »
Sergey V. Gornostaev
Спасибо! Оно одно к одному: что страховая компания, что автосалон. Это я понял позже (как и многие другие наверно). [вопрос № 180036, ответ № 263194]

РАЗДЕЛ • С / С++

Создание программ на языках C и C++.

[администратор рассылки: Андрей Кузнецов aka Dr_Andrew (Старший модератор)]

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

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 318
Лысков Игорь Витальевич
Статус: Старший модератор
Рейтинг: 146
CradleA
Статус: Профессионал
Рейтинг: 66

Перейти к консультации №:
 

Консультация онлайн # 190194
Раздел: • С / С++
Автор вопроса: ksenya241 (Посетитель)
Отправлена: 30.11.2016, 11:29
Поступило ответов: 1

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

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

Приложение:

Состояние: Консультация закрыта

Ответ # 274387 от Лысков Игорь Витальевич (Старший модератор)

Здравствуйте, 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

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 190194

Лысков Игорь Витальевич
Старший модератор

ID: 7438

# 1

= общий = | 03.12.2016, 15:03 | цитировать цитировать  | профиль профиль  |  отправить письмо в личную почту пейджер
ksenya241:

Давайте уточним постановку задачи:
Есть три вида списка - односвязный, двусвязный и двусвязный циклический с головой
Требуется создать каждый из этих списков из вводимых с консоли значений.
Затем требуется найти в каждом из этих списков уникальные элементы, т.е. такие, которые в единственном числе.
Что потом делаем с этими элементами? Просто выводим на экран? Или делаем из них новый список?
Я понял, что надо просто их найти и вывести на экран
Далее, в Ваших набросках смешалось все, "кони, люди" smile
Пишите или на С, или на С++. Одни куски процедурами, другие классами. При этом напрочь отсутствует main
Отсюда вопрос: так на С или на С++ должна быть программа?

=====
Каждый выбирает по себе -
Щит и латы, посох и заплаты.
Меру окончательной расплаты
Каждый выбирает для себя.

 

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Яндекс Rambler's Top100

главная страница | поддержка | задать вопрос

Время генерирования страницы: 0.15059 сек.

© 2001-2017, Портал RFPRO.RU, Россия
Авторское право: ООО "Мастер-Эксперт Про"
Калашников О.А.  |  Гладенюк А.Г.
Версия системы: 7.41 от 25.02.2017
Бесплатные консультации онлайн