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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2017, 20:37   #1
ggjgj
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 83
По умолчанию [C++] Удалить из очереди все повторяющиеся слова, оставив только их первые вхождения.

Создать очередь, содержащую слова. Удалить из очереди все повторяющиеся
слова, оставив только их первые вхождения.
Например, если введены 5 1 2 1 5 3 4 5 1, то результат должен быть 5 1 2 3 4
ggjgj вне форума Ответить с цитированием
Старый 23.04.2017, 16:43   #2
ggjgj
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 83
По умолчанию

В чем ошибка???
Код:
#include <iostream>
using namespace std;
struct queue {
	int inf;
	queue *next;
};
void push(queue *&h, queue *&t, int x)
{
	queue *r = new queue;
	r->inf = x;
	r->next = NULL;
	if (!h && !t)
		h = t = r;
	else
	{
		t->next = r;
		t = r;
	}

}
int pop(queue *&h, queue *&t)
{
	queue *r = h;
	int i = r->inf;
	h = r->next;
	if (!h)
		t = NULL;
	delete r;
	return i;
}
void print(queue *&h, queue *&t)
{
	queue *r = h;
	{cout << r->inf << " ";
	r = r->next; }
	while (r);
	cout << '\n';
}
int main() {
	queue *h, *t;
	h = t = NULL;
	int n,x;
	cout << "n="; cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> x;
		push(h, t, x);
	}
	print(h, t);
	queue *head1, *tail1, *resh, *rest;
	head1 = tail1 = NULL;
	while (h&&t)
	{
		int	x = pop(h, t);
		push(resh, rest, x);
	}
		if (h)
		{
			int y = pop(h, t);
			if (y != x) push(head1, tail1, y);
			queue *tmp = h;h = head1;head1 = tmp;
			tmp = t;t = tail1;tail1 = tmp;
		}
	
}
ggjgj вне форума Ответить с цитированием
Старый 23.04.2017, 16:46   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В чем проявляется-то ошибка?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.04.2017, 17:19   #4
ggjgj
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 83
По умолчанию

Ошибок в принципе не выводит, ввожу данные и все , ничего не происходит,консоль зависает и все
ggjgj вне форума Ответить с цитированием
Старый 23.04.2017, 17:41   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вот, что сделай!
В разных местах программы поставь контрольные точки (т.е. просто вывод с разными номерами: cout << '1 \n'... )
типа такого (обрати внимание на разные "cout", которые я добавил):
Код:
	r = r->next; }
       cout << '54 \n';
	while (r);
       { 
        cout << '55 \n';
	cout << '\n';
        }
}
int main() {
        cout << '1 \n';
	queue *h, *t;
	h = t = NULL;
	int n,x;
	cout << 
        cout << '2 \n';
cout << '\n';
................................
.................................
После чего запусти программу. Покажи скриншоты (на фоне кода) для дальнейшего анализа.

p.s.1: по выводу контрольных точек, я сделаю вывод о том в каком месте идёт зацикливание (и сообщу тебе об этом).
p.s.2: (я не уверен) но ты же заешь, что если в цикле (условие "if") не один оператор, а больше, - то надо скобки ставить. Например было так:
Код:
	while (r);       
	cout << '\n';
стало так:
Код:
	while (r);
       { 
        cout << '55 \n';
	cout << '\n';
        }

Последний раз редактировалось ura_111; 23.04.2017 в 18:04.
ura_111 вне форума Ответить с цитированием
Старый 24.04.2017, 16:16   #6
ggjgj
Пользователь
 
Регистрация: 25.10.2016
Сообщений: 83
По умолчанию

////
Изображения
Тип файла: jpg rpX53aYsync.jpg (22.1 Кб, 22 просмотров)
Тип файла: jpg r6kNoC5RtXk.jpg (116.8 Кб, 124 просмотров)
Тип файла: jpg 5Vq9UDvdg4w.jpg (99.0 Кб, 130 просмотров)
Тип файла: jpg MNp0uA4lUK8.jpg (104.9 Кб, 132 просмотров)
ggjgj вне форума Ответить с цитированием
Старый 24.04.2017, 21:11   #7
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Я вообще хотел не в строчку, а в столбик вывод получить.
(наверно это связано с одинарными кавычками)

Ну ладно, вроде забацал:
Код:
#include <iostream>
using namespace std;

struct queue
{
	int inf;
	queue *next;
};

void push(queue *&head, int x)
{
	queue *temp = new queue;
	temp->inf = x;
	temp->next = NULL;

	if (head == NULL)
	{
		head = temp;
	}
	else
	{
		queue *t = head;
		while (t->next != NULL)
		{
			t = t->next;
		}
		t->next = temp;
	}
}

void print(queue *&head)
{
	cout << '\n';
	queue *t = head;
	while (t)
	{
		cout << t->inf << " ";
		t = t->next;
	}
	cout << '\n';
}

void delet(queue *&head)
{
	queue *t = head;
	queue *p1;
	queue *p2;

	while (t)
	{
		p1 = t;
		p2 = p1->next;
		while (p2)
		{
			if (t->inf == p2->inf)
			{				
				p1->next = p2->next;
				delete p2;
				p2 = p1->next;			
			}	
			else
			{
				p1 = p1->next;
				p2 = p2->next;
			}
		}
		t = t->next;
	}
}

int main()
{
	queue *head = NULL;

	int n, x;
	cout << "n="; cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> x;
		push(head, x);
	}
	print(head);
	delet(head);
	print(head);
	
	cin >> x; //чтобы консоль не закрывалась
	return 0;
}
хорошенько протестируй: и когда одно число, и когда на удаления подряд идущие узлы, и когда последний нужно удалить, и когда не нужно, и когда список пуст....
Иногда тестирование занимает больше времени, чем написание кода...

Последний раз редактировалось ura_111; 24.04.2017 в 21:14.
ura_111 вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить из сообщения все повторяющиеся слова (без учета регистра). Promi C# (си шарп) 9 27.10.2015 10:29
. Задана строка символов. состоящая из отдельных слов, разделенных пробелами. Преобразовать ее, оставив в ней только первые два Proskurina Паскаль, Turbo Pascal, PascalABC.NET 1 29.05.2012 19:35
. Задана строка символов. состоящая из отдельных слов, разделенных пробелами. Преобразовать ее, оставив в ней только первые два Proskurina Помощь студентам 1 29.05.2012 19:34
СИ. Удалить слова, которые содержат все повторяющиеся буквы первого слова nick23 Помощь студентам 7 01.11.2009 14:47
В введенном предложении удалить все повторяющиеся слова Алена Помощь студентам 5 21.11.2007 14:12