2016-11-09 80 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

要交换第一个元素和头尾元素,您必须通过以下过程。 首先,我们必须让尾部和头部的下一个节点一个节点在一些临时变量和交换的头和尾的next和prev指针。

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