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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2017, 20:39   #51
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Да нет, это не ошибка. Специально усложнялась программа, вводился флаг именно для этих целей:
последнее "р", нужно ли его удалять?

Ну, если бы это был не кольцевой список, тогда однозначно - нет.
Но, вот если, имеется кольцевой список, тогда появляются варианты. Правило удаления общее для всех элементов (не исключая и последнего): "р" перед "a". а что идёт после "последнего элемента"?
Первый?
Вернее не так, - это мы называем их первый, второй, последний..., но в кольцевом списке все элементы равноправны и связаны по кругу, а значит там нет таких понятий. А значит, чтобы определить нужно ли удалить последний элемент "р" нужно посмотреть на первый: он "а" или нет?
___________________________________ ______________
Но и это ещё не всё.
Бывает ситуация, когда первая буква "p" (т.е. не надо удалять последнее "р"), но после первого удаления - она становится "а"??? Например:
Код:
рa.....p
Итак, после первого шага получаем:
Код:
a.....p
А что буде когда дойдём до конца (последнее "р" придётся тоже удалять)?......
В коде (частично) и для таких ситуаций предусмотрен флаг.
ura_111 вне форума Ответить с цитированием
Старый 18.03.2017, 20:53   #52
CortesGames
Пользователь
 
Аватар для CortesGames
 
Регистрация: 23.10.2016
Сообщений: 86
По умолчанию

Я не это имел ввиду, если ты не заметил, то там в конце 3 буквы а, хотя должно быть 2. Оно если в конце р удаляет его, но вместо него ставит а. Почему-то.
Насылаю баги по фотографии

преимущественно себе

Последний раз редактировалось CortesGames; 18.03.2017 в 20:58.
CortesGames вне форума Ответить с цитированием
Старый 18.03.2017, 21:14   #53
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Это первая буква (т.е. "n" на единицу велико); чтобы от этого избавится добавь "n--;" в:
Код:
..........................................
		if (two->key == 'p' && fre->key == 'a' && flag == false)
		{
			one->next = fre;
			head = head;
			n--;
		}
..............................................
ura_111 вне форума Ответить с цитированием
Старый 18.03.2017, 21:29   #54
CortesGames
Пользователь
 
Аватар для CortesGames
 
Регистрация: 23.10.2016
Сообщений: 86
По умолчанию

Отлично, всё работает. Большое вам спасибо!
Если кому-то нужно, то вот код:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

struct list
{
	char key;
	list* next;
};

list *head, *temp;
int n = -1;

int main()
{
	bool empty = true;	
	char ch;
	printf("Please type elements: ");
	while ((ch = getchar()) != '\n')
	{
		list *var = (struct list*) malloc(1);
		var->key = ch;
		if (empty == true)
		{
			empty = false;
			head = var;
			temp = var;
		}
		else
		{
			temp->next = var;
			temp = var;
		}
		n++;
	}
	temp->next = head;
	
	if (n != -1)
	{
		printf("\n");
		int vuvod;
		vuvod = 0;
		printf("Your list:\t");
		while (vuvod < n)
		{
			printf("|%c|\t", head->key);
			head = head->next;
			vuvod++;
		}
		printf("|%c|\t", head->key);
		printf("\n");
		list *one = head;
		list *two = one->next;
		list *fre = two->next;
		head = one->next;
		int kol = n;
		bool flag = false;
		vuvod = 0;
		while (vuvod < kol)
		{
			if (two->key == 'p' && fre->key == 'a')
			{
				one->next = fre;
				two = one->next;
				fre = two->next;
				n--;
				if (vuvod == 0)
					flag = true;
			}
			else
			{
				one = one->next;
				two = two->next;
				fre = fre->next;
			}
			vuvod++;
		}
		if (two->key == 'p' && fre->key == 'a' && flag == false)
		{
			one->next = fre;
			head = head;
			n--;
		}
		else
			head = fre;
		vuvod = 0;
		printf("Processed list:\t");
		while (vuvod < n)
		{
			printf("|%c|\t", head->key);
			head = head->next;
			vuvod++;
		}
		printf("|%c|\t", head->key);
		head = head->next;
		printf("\n");
	}
	return 0;
}
Насылаю баги по фотографии

преимущественно себе
CortesGames вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
c++ удаление элемента списка NinjaNoob Помощь студентам 1 28.01.2013 04:01
Сортировка однонаправленого списка вставками. gvilon Паскаль, Turbo Pascal, PascalABC.NET 0 08.11.2011 23:39
Удаление элемента из списка bpystep Помощь студентам 4 09.07.2010 14:55
Удаление элемента из списка Ghost_gg Паскаль, Turbo Pascal, PascalABC.NET 2 30.05.2010 20:43
Удаление последнего элемента из списка и реверс этого списка. Goose Общие вопросы C/C++ 8 16.05.2010 16:12