Реверсивный связанный список в C - PullRequest
1 голос
/ 18 марта 2020

Я работал над кодом для обращения к связанному списку, но мне кажется, что только первый элемент распечатывается в моем списке. Вот моя функция:

void reverseSqueue(Squeue squeue) {
    if (squeue -> first == NULL || squeue -> last == NULL){
        return;
    }
    Node* temp = NULL;
    Node* curr = squeue -> first;
    squeue -> first = squeue -> last;
    squeue -> last = curr;

    /*if (squeue -> first != squeue -> last){
      curr = curr -> next;
    }

    printf("%s\n", curr -> next -> value);
    printf("%s\n", curr -> value);
    printf("%s\n", curr -> prev -> value);
    printf("______________\n");
    printf("%s\n", squeue -> first -> value);
    Node* nde = squeue -> first;
    while (nde != NULL){
        printf("%s\n", nde -> value);
    nde = nde -> prev;
    }*/
    while (curr != NULL){
    /*if (curr != squeue -> first || curr != squeue -> last){
        if (curr -> next == squeue -> last){
            curr = NULL;
        }else{*/
        temp = curr;
        curr -> next = curr;
        curr = temp;
        curr = curr -> prev;
      //}
    //}else{
    //curr = NULL;
    //}
    }
}

Я извиняюсь за грязный код, я попытался запустить несколько тестов и прокомментировал их здесь; До этого у меня был код, который работал нормально, но в OClint выдавалось предупреждение о значении мусора, поэтому я попытался их исправить, и теперь мой код, похоже, больше не работает. Если ничего не работает, я могу просто go вернуться к исходному коду. Любой вклад очень ценится!

struct node {
  char *value;
  struct node *next;
  struct node *prev;
};
typedef struct node Node;

struct squeue {
   struct node* first;
   struct node* last;
};
typedef struct squeue * Squeue;

1 Ответ

0 голосов
/ 19 марта 2020

С помощью curr-> next = curr вы говорите, что следующим узлом текущего узла является текущий узел, то есть текущий узел указывает на себя как на следующий узел.

Node *first = squeue->last; 
squeue->last = squeue->first; // the last node is now the first
squeue->first = first; // squeue->first = original order squeue->last

Node *curr = first; 
while (curr != NULL) { // loop begins with the original order last node,
                       // but new order first node

    // curr->next, curr->prev = curr->prev, curr->next
    Node *prev = curr->prev; // saves the curr's prev
    curr->prev = curr->next; // modifies curr's prev, now pointing to curr's next
    curr->next = prev; // curr's next now points to it's original prev

    curr = curr->next; // the next curr is the original order curr's prev,
                       // but the now order curr's next
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...