mayashah Ответов: 3

Обратный круговой связанный список fucntion идет не так ! !


я пытаюсь написать функцию для реверсии кругового вида связанного списка !! я прочитал кое-что , и я понимаю, используя 3 указателя, и я нахожу это особенно трудным и не работающим, поэтому любая альтернатива с использованием только "последнего" или я имею в виду не используя 3 указателя и все еще обращая вспять !!!

Что я уже пробовал:

struct node
{
	int data;
	struct node *next;
}*last = NULL, *p, *q, *rear = NULL, *x;

// Обратная функция, трудная для понимания и все же не дающая результатов
void circular_llist::reverse()
{
	x = last->next;
	p = last;
	last->next = NULL;
	while (x)
	{
		q = x->next;
		x->next = p;
		last = x;
		p = x;
		x = q;
	}

}

//Главный
int main()
{
	circular_llist cl;
      cl.reverse();
}

3 Ответов

Рейтинг:
2

CPallini

Предположим, у вас есть p,q,r, указывая на три последовательных узла, а именно

q = p->next;
r = q->next;

то реверс-и-обновление шаг-это тогда
q->next = p; // reverse
// update
p = q; 
q = r;
r = r->next;


Условие останова q быть равным главе списка.


mayashah

что такое п, Что Р ??
обновление вышеперечисленные функции для удобства спасибо

CPallini

Извините, я обновил свой ответ. "н" было ошибкой для "следующего". "r" вместе с " p " и " q " является вспомогательным указателем.

Рейтинг:
1

OriginalGriff

Используйте отладчик. Это часть того, для чего он существует.
Поставьте точку останова в начале функции и шаг за шагом внимательно посмотрите на то, что происходит.
Что может помочь вам понять, так это то, что вы сначала нарисуете на бумаге, как выглядит список - установите простой список, скажем, с 4 узлами, - а затем отметьте его тем, как он должен выглядеть, когда вы закончите. Поскольку он изменяется во время выполнения кода в отладчике, отметьте свой чертеж, чтобы показать новое состояние. Если это должно быть достаточно очевидно, как только вы войдете в него, что происходит и почему все идет не так.


Рейтинг:
1

Patrice T

Цитата:
// Обратная функция, трудная для понимания и все же не дающая результатов
Нормально, вы возитесь с указателями до конца списка, проблема в том, что список является круговым списком, там нет конца!

Как вам уже неоднократно говорили, используйте отладчик и посмотрите, что делает ваш код.
Ты хочешь совета, но не следуешь ему. Похоже, вам нужны полные взрывные решения с минимальными усилиями.

Вы должны научиться использовать отладчик как можно скорее. Вместо того чтобы гадать, что делает ваш код, пришло время увидеть, как он выполняется, и убедиться, что он делает то, что вы ожидаете.

Отладчик-Википедия, свободная энциклопедия[^]
Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Отладчик здесь для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.

Совет: возьмите лист бумаги и попробуйте смоделировать свой алгоритм вручную, ваша программа должна использовать ту же процедуру.