Как работает связанный список, чтобы создать другой связанный список с другим порядком элементов. Объяснение пожалуйста - PullRequest
0 голосов
/ 17 февраля 2020
struct node* question4(struct node *list){ //list = 66, 9, 14, 52, 87, 14, 17
      struct node* a = list; //a = 66, 9, 14, 52, 87, 14, 17 pointing to head (66)
      struct node* b = list; //b = 66, 9, 14, 52, 87, 14, 17 pointing to head (66)
      struct node* c;
      if(a == NULL) return NULL; // a is not NULL it's pointing to 66
      while(a->next != NULL) // run until a points to the last element (17) 
            a = a->next;
      a->next = b; //next element of 17 points to b (which is 66). 
      c = b->next; // c points to what b is pointing to next which is 9. 
      b -> next = NULL; // next element of b is NULL(instead of 14). what happens here?
      return c;
}

Таким образом, а связан с б. так элемент а идет так? 66-> 9-> 14-> 52-> 87-> 14-> 17-> 66-> 9-> 14-> 52-> 87-> 14-> 17

и b просто 66-> 9-> NULL?

c - это 9-> 14-> 52-> 87-> 14-> 17? ИЛИ 9-> 14-> 52-> 87-> 14-> 17-> 66? почему?

В настоящее время я изучаю связанный список, спасибо вам, ребята, за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 17 февраля 2020

Этот код используется для поворота односвязного списка на один правый узел.

Давайте рассмотрим это утверждение

c = b->next;

указатель b после этого объявления

struct node* b = list

указывает на элемент со значением 66

b = 66, 9, 14, 52, 87, 14, 17

То есть c указывает на следующий элемент со значением 9` (b-> next).

Затем после этого оператора

b -> next = NULL;

мы имеем

66, NULL, 9, 14, 52, 87, 14, 17
          ^
          |
          c

Но после предыдущего фрагмента кода

  while(a->next != NULL) // run until a points to the last element (17) 
        a = a->next;
  a->next = b

последний режим со значением 17 указывает на предыдущий первый узел со значением 66.

В результате вы получите

c = 9, 14, 52, 87, 14, 17, 66, NULL

0 голосов
/ 17 февраля 2020

Программа сдвигает заголовок связанного списка вправо на один элемент и возвращает цикл к первому первому элементу до конца. По большей части вы правильно сделали, последние несколько строк работают следующим образом:

a->next = b;

Это связывает исходный последний элемент с исходным первым элементом, т. Е. Создает ссылку 17-> 66.

c = b->next;

c здесь используется для хранения нового элемента головы. Поскольку b указывал на исходную головку, и мы хотим, чтобы второй элемент был новой головкой, c указывает на следующий элемент b, т. Е. 9.

b -> next = NULL;

. a->next = b; делает связанный список круглым, это разрывает круг, удаляя ссылку 66-> 9.

Наконец, возвращается c, поэтому список в конце:

9->14->52->87->14->17->66
...