2016-11-09 9 views
0

Я пытаюсь поменять первый и последний элементы двусвязного списка. Пока у меня есть следующий код, где я создаю список и добавляю к нему некоторые номера. Но вывод является одним и тем же списком.C - Сменить первый и последний элемент в двусвязном списке

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

struct node2 { 
    int number; 
    struct node2 *next, *prev; 
}; 

void addNodeDouble(struct node2 **head, struct node2 **tail, int num, int thesi) { 
    if (*head == NULL) { 
     struct node2 * current; 
     current = (struct node2 *)malloc(1 * sizeof(struct node2)); 
     current->number = num; 
     current->prev = NULL; 
     current->next = NULL; 
     *head = current; 
     *tail = current; 
    } else { 
     if (thesi == 1) { 
      struct node2 *current, *temp; 
      current = (struct node2 *)malloc(1 * sizeof(struct node2)); 
      current->number = num; 
      temp = *head; 
      while (temp->next != NULL) 
       temp = temp->next; 

      temp->next = current; 
      current->prev = *tail; 
      current->next = NULL; 
      (*tail)->next = current; 
      *tail = current; 
     } else { 
      struct node2 *current; 
      current = (struct node2 *)malloc(1 * sizeof(struct node2)); 
      current->number = num; 
      current->next = *head; 
      (*head)->prev = current; 
      *head = current; 
     } 
    } 
} 

void ReversedisplayList(struct node2 **head, struct node2 **tail) { 
    struct node2 *current; 
    if (*head == NULL) 
     printf("I lista einai adeia!\n"); 
    else { 
     current = *tail; 
     while (current != NULL) { 
      printf("%d ", current->number); 
      current = current->prev; 
     } 
    } 
} 

void swapElements2(struct node2 **head, struct node2 **tail) { 
    struct node2 *current, *temp; 

    temp = (*tail)->prev; 
    current = *tail; 

    temp->next = *head; 
    current->next = (*head)->next; 
    (*head)->next = NULL; 
    *head = current; 
} 

int main() { 
    struct node2 *head, *tail; 
    head = tail = NULL; 

    addNodeDouble(&head, &tail, 4, 1); 
    addNodeDouble(&head, &tail, 8, 1); 
    addNodeDouble(&head, &tail, 3, 0); 
    addNodeDouble(&head, &tail, 1, 1); 
    addNodeDouble(&head, &tail, 7, 0); 

    printf("\n\nDoubly linked list (reversed): "); 
    ReversedisplayList(&head, &tail); 

    swapElements2(&head, &tail); 
    printf("\nChanged list: "); 
    ReversedisplayList(&head, &tail); 
} 

я получаю:

Doubly linked list (reversed): 1 8 4 3 7 
Changed list: 1 8 4 3 7 

Но я хочу:

Changed list: 7 8 4 3 1 
+1

Возможно, вы захотите рассмотреть возможность замены данных узлов вместо самих узлов. В этом случае вам будет намного легче. – Hypino

+0

@Hypino Нет, я действительно хочу поменять местами – user3120283

ответ

1

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

void swapElements2(struct node2 **head, struct node2 **tail) { 
    struct node2 *ttail, *thead; 

    ttail = (*tail) -> prev; 
    thead = (*head) -> next; 

    (*head) -> next = NULL; 
    (*tail) -> prev = NULL; 

    (*head) -> prev = ttail; 
    (*tail) -> next = thead; 

    ttail -> next = (*head); 
    thead -> prev = (*tail); 

    (*tail) = ttail -> next; 
    (*head) = thead -> next; 
} 
+0

Отступ неправильный, и всегда должно быть короткое объяснение, а не только дамп кода , –

+0

Спасибо, я добавил объяснение сейчас. – jafarbtech

+0

Правильно откорректируйте свой код, что делает его более читаемым и более простым в использовании. –

0

Вы забыли изменить (*head) -> prev и (*tail) -> prev.

(*head)->prev = temp; 
(*tail)->prev = NULL; 
+0

Хмм, добавьте эти команды в конце функции swapElements2? Потому что, если я это сделаю, я получаю «Измененный список: 1» ([здесь] (http://ideone.com/YouUbd)) – user3120283

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

  • Нет связанных вопросов^_^