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

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

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

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

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

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

"head это не первый а второй элемент?"

наверно, имеется ввиду вот это: "head = one->next;".
Нет, head - это (всё-таки) первый элемент, - просто в предыдущем кучке кода (там, где выводил первоначальным массив) я "не до конца дошагал", а остановился на последнем элементе последовательности. И, соответственно, запись "head = one->next;" это скомпенсировало...

Основная идея программы. Назначаются три ссылки:

0.jpg

которые "шагают по списку". Ссылки "two" и "fre" реагируют на условия, а первая - перестраивает структуру списка ( если условие сработает).

Проблема возникает при последнем элементе. Рассмотрим пример:

0_1.jpg

Для учёта этого нужен флаг.
ura_111 вне форума Ответить с цитированием
Старый 12.03.2017, 15:00   #12
CortesGames
Пользователь
 
Аватар для CortesGames
 
Регистрация: 23.10.2016
Сообщений: 86
По умолчанию

Оно почему-то творит что-то совсем непонятное.

Цитата:
head = head;
Что это вообще значит? И почему вот это не в цикле?
Цитата:
if (two->key == 'p' && fre->key == 'a' && flag == false)
{
one->next = fre;
head = head;
}
else
head = fre;
Насылаю баги по фотографии

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

Последний раз редактировалось CortesGames; 12.03.2017 в 15:10.
CortesGames вне форума Ответить с цитированием
Старый 12.03.2017, 15:27   #13
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

1) Я думаю, что вот это "head = head;" можно удалить.
2) Я не уверен будет ли работать тот кусок кода в цикле.
3) а по твоей ситуации. Я советую, непосредственно перед выводом на экран, организовать цикл, который "прокрутит" весь список и "a" снова станет первой.
ura_111 вне форума Ответить с цитированием
Старый 15.03.2017, 11:19   #14
CortesGames
Пользователь
 
Аватар для CortesGames
 
Регистрация: 23.10.2016
Сообщений: 86
По умолчанию

"Прокрутит список"? Просто не могу нормально представить себе его, подскажите если не сложно.
Насылаю баги по фотографии

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

Последний раз редактировалось CortesGames; 15.03.2017 в 22:08.
CortesGames вне форума Ответить с цитированием
Старый 16.03.2017, 17:21   #15
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Продублирую.

Скорей всего ты влез туда, куда тебе не следовало влезать. Теперь надо компенсировать это влияние...

Я так понял у тебя отдельная функция для печати (вроде "Print(....)") в которую ты оправляешь ссылку на начало (я точно не уверен, но вроде "head"), т.е. что то вроде такого:
Код:
расчеты...
Print(head)
компенсация будет состоять в том, чтобы после расчётов переместить ссылку (для начала на одну позицию - а там посмотрим.):
Код:
расчеты...
head=head->next;
Print(head)
Пробуй.
ura_111 вне форума Ответить с цитированием
Старый 16.03.2017, 17:36   #16
CortesGames
Пользователь
 
Аватар для CortesGames
 
Регистрация: 23.10.2016
Сообщений: 86
По умолчанию

Ваш код почему-то не работает со списками из 3+элементов, он почему-то то не удаляет, то зацикливаться, так что я написал свой код, он работает исправно но когда я ставлю первой буквой "p" ,а второй "а" то он виснет, через дебаг я увидел что он просто попадает в цикл потому что условие "two->next != START" не перестаёт выполнятся. У меня уже голова кругом идёт из за этих списков, пожалуйста помогите найти ошибку.
Код:
#include <stdio.h>
#include <stdlib.h>
struct node{
    char data;
    struct node *next;
}*START=NULL;
void insertData(char);
void displayData(void);
void removeData(void);

int main(void){
    int ch;
    char let;
    do{
        printf("\n1. Add element");
        printf("\n2. Display list");
        printf("\n3. Delete all 'p' before 'a'");
        printf("\n4. Exit");
        printf("\nYour choice: ");
        scanf("%d",&ch);
        switch(ch){
            case 1:
                    printf("Enter any letter: ");
                    scanf("%s",&let);
                    insertData(let);
                    break;
            case 2:
                    displayData();
                    break;
            case 3:
                    removeData();
                    displayData();
                    break;
            case 4:
                    exit(0);
            default:
                    printf("Invalid Choice");
                    exit(0);
        }
        printf("------------------------------------------------------------------------\n");
    }while(1);
    return 1;
}

void insertData(char let){
    struct node *q,*temp;
    if(START==NULL){
        START=(struct node*)malloc(sizeof(struct node));
        START->data=let;
        START->next=START;
    }else{
        q=START;
        while(q->next!=START){
            q=q->next;
        }
        temp=(struct node*)malloc(sizeof(struct node));
        temp->data=let;
        temp->next=START;
        q->next=temp;
    }
}

void displayData(void){
    struct node *q=START;
    printf("List:\t");
    do{
        printf("|%c|\t",q->data);
        q=q->next;
    }while(q!=START);
    printf("\n");
}

void removeData(void){
    struct node *one = START;
	struct node *two = one->next;
	struct node *fre = two->next;
	struct node *last =one;
	while (two->next != START)
	{
	    if(one == START && one->data == 'p' && two->data=='a'){
	        while(last->next!=START){
	            last=last->next;
	        }
	        last->next=two;
	        one=one->next;
	        two=two->next;
	        fre=fre->next;
	    }
	    if(two->data == 'p' && fre->data == 'a'){
			one->next = fre;
			two = fre;
			fre = fre->next;
	    }else{
			one = one->next;
			two = two->next;
			fre = fre->next;
	    }
	}
}
Насылаю баги по фотографии

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

Последний раз редактировалось CortesGames; 16.03.2017 в 17:42. Причина: Исправление табуляции
CortesGames вне форума Ответить с цитированием
Старый 16.03.2017, 18:54   #17
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Когда работаешь с моим кодом следи за "n" и при изменении кол-во узлов и "n" должно меняться. Ты можешь сделать отдельную функцию для подсчёта "n". Вот, пример для 3-х узлов:
Код:
#include <stdio.h>

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

int main()
{
	list *head = new list;	head->key = 'p';
	list *h1 = new list;	h1->key = 'a';  head->next = h1;
	list *h2 = new list;	h2->key = 'p';    h1->next = h2;
	h2->next = head;

	int vuvod;
	int n = 2; // количество узлов

	// Вывод на экран первоначального массива
	vuvod = 0;
	while (vuvod < n)
	{
		printf("%c ", head->key);
		head = head->next;
		vuvod++;
	}
	printf("%c ", 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;
	}
	else
		head = fre;
	///////////////////////////////////////////////////
	vuvod = 0;
	while (head < head->next)
	{
		printf("%c ", head->key);
		head = head->next;
		vuvod++;
	}
	printf("%c ", head->key);
	printf("\n");

	int num;
	scanf("%d", &num); // чтобы консоль быстро не закрывалась
	return 0;
}
Если добавишь ещё один узел - увеличь "n"... Единственно ограничение, может быть, у алгоритма - это когда только 2-а узла...
Мой код отлаженный, поэтому ничего нового здесь не придумать...
Возьми мой код за основу и начни модифицировать под себя: добавь меню, отдельную функцию для печати, автоматический ввод узлов, удаление узлов....
НО (самое главное), на каждом шаге хорошенько тестируй программу при разных условиях. Когда я говорю при разных условиях - это значит реально при разных условиях... А не делай всю программу целиком (тем самым собираю на каждом шаге кучу ошибок), а потом ты не знаешь что делать...
Итак, начни с этого кода, что я привёл. Протестируй его и начни делать по кусочкам; тестирую на каждом шаге.
ura_111 вне форума Ответить с цитированием
Старый 16.03.2017, 19:22   #18
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

И ещё. Почему ты не удаляешь исключенные узлы, а оставляешь их в памяти?
По принципу:

10.jpg

второй узел остался в памяти компьютера, его нужно удалить (освободить память).
ura_111 вне форума Ответить с цитированием
Старый 16.03.2017, 19:42   #19
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

С вариантом с 3-мя ссылками уже ничего не сделать, но можешь попытаться сделать программу с 2-мя узлами (вроде должно получится что-то вроде "цикл в цикле"):

10.jpg

Только делай сначала на моём шаблоне.

Последний раз редактировалось ura_111; 16.03.2017 в 19:50.
ura_111 вне форума Ответить с цитированием
Старый 16.03.2017, 19:43   #20
CortesGames
Пользователь
 
Аватар для CortesGames
 
Регистрация: 23.10.2016
Сообщений: 86
По умолчанию

Есть ошибка, не знаю в чём заключается.
Если есть
Код:
while (head < head->next)
	{
		printf("%c ", head->key);
		head = head->next;
		vuvod++;
	}
То это выглядит вот так:
Без него вот так:
А должно быть a p a
Не могу добится нужного результата
Насылаю баги по фотографии

преимущественно себе
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