2014-02-17 3 views
0

Добрый день, ребята, я новый здесь, чтобы C, и пытаюсь изучить связанные списки. Я пытался обменять 2 узла из связанного списка, но до сих пор не удалось заставить его работать. Код, который я пытался использовать, вызывает бесконечный циклический цикл, но я не думаю, что это из-за инструкции if или while.Обмен 2 узлами в связанном списке

Посмотрите? Какие-нибудь указатели здесь? Помощь будет принята с благодарностью.

В основном, код использует пользовательский ввод для поиска узла на основе данных внутри, затем он должен обменивать узел данными с последующим узлом. Было ли это в течение 3 часов, может ли кто-нибудь помочь? Благодаря!

/проводник имя им с помощью указателя для текущего узла/

#include <stdio.h> 
#include <stdlib.h> 

struct node { 
    int x; 
    struct node *next; 
    struct node *prev; 
}; 

struct node *root; 
struct node *conductor; 
struct node *counter; 
struct node *newnode; 
struct node *back; 

struct node *swapper; 
struct node *swappee; 
struct node *blanker; 

int add = 0; 
int initialization = 0; 
int query = 0; 

int swap() 
{ 

printf("enter data to search from within the nodes: "); 
fflush(stdin); 
scanf("%d", &query); 

conductor = root; 
while (conductor->next != 0) 
    { 
     if(conductor->x == query) 
     { 
     printf("\n%d\n", query); 
     swapper = conductor; 
     swappee = conductor->prev; 
     conductor = swappee; 
     conductor->next = swapper; 
     break; 
     } 
     else 
     { 
     conductor = conductor->next; 
     } 
    } 

mainMenu(); 

}

+1

Пожалуйста, отформатируйте свой код лучше, спасибо. – m0skit0

+0

внутри тела блока 'else', попробуйте напечатать' conductor-> x', и если вы все еще не нашли проблему, чем опубликовать вывод из этого. Это поможет вам (и нам) понять, что происходит. –

+1

замените элемент x на узел. – BLUEPIXY

ответ

1

Двойной связный список (как тот, у вас есть) в основном массив узла , каждый узел указывает на своих соседей. Предположим, что у нас есть узлы -A-B-C-D- (A-B означает, что A указывает на B и B указывает на A). Допустим, вы хотите поменять местами B и C. Вы должны сделать 4 изменения:

  • Сделать точки C
  • Make точки C до B и A
  • Сделайте точку B до D и B
  • make D point to B

Вы делаете только второе и третье изменение. Итак, вам нужно добавить A->next = B и D->prev=C. Надеюсь, это достаточно ясно.

Кроме того, вы не должны пропускать входные потоки.

0

Если вы хотите поменять местами данные:

if (conductor->x == query) { 
    int temp = conductor->x; 
    if (conductor->next) 
     conductor->x = conductor->next->x; 
     conductor->next->x = temp; 
    } 
} 

Обычно это то, что вы хотите сделать. Если у вас есть структура с несколькими членами вместо 1 int, то обмен ссылками может казаться менее беспорядочным в теории, но это не так, в первую очередь из-за того, что вы должны часто проверять существование следующего/предыдущего узла. По правде говоря, вы, вероятно, захотите указатель на отдельную структуру в таком случае.

Указанные три узла - previous, current и next, указывая на current->prev, current и current->next соответственно - вы должны обновить более 6 указателей:

  1. next-> пред = предыдущая
  2. previous- > следующая = следующая
  3. current-> пред = следующий
  4. current-> следующая = next-> следующая
  5. next-> следующая = ток
  6. current-> next-> пред = ток

Шаг 2 не является необходимым, если previous является NULL. Шаг 7 не нужен, если current->next - NULL.

Вся вещь не нужна, если next is NULL.

Если вы хотите поменять местами с предыдущим узлом вместо следующего, обменять любой экземпляр переменной previous с переменной next и наоборот, а также обмениваться любой экземпляр ->prev с ->next и наоборот.

В целом, для этого требуется справедливый бит кода ветвления, который может быть медленным. Вот почему обычно лучше менять данные, а не вмешиваться в указатели. Это становится еще более беспорядочным, если вы хотите обменять предыдущий узел, и у вас есть только связанный список, который указывает на следующий узел, потому что вы должны сохранить еще один указатель на эквивалент previous->prev, предполагая, что существует previous.

Смежные вопросы