2016-11-09 1 views
0

Ich versuche, die ersten und letzten Elemente einer doppelt verketteten Liste zu vertauschen. Bisher habe ich den folgenden Code, wo ich eine Liste erstellen und einige Nummern hinzufügen. Aber die Ausgabe ist die gleiche Liste beide Male.C - Das erste und letzte Element in der doppelt verketteten Liste vertauschen

#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); 
} 

ich:

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

Aber ich will:

Changed list: 7 8 4 3 1 
+1

Sie sollten in Betracht ziehen, die Daten der Knoten anstelle der Knoten selbst auszutauschen. Das würde Ihnen in diesem Fall die Arbeit wesentlich erleichtern. – Hypino

+0

@Hypino Nein, ich möchte die Knoten tauschen – user3120283

Antwort

1

Um die ersten und Kopf- und Schwanzelemente zu tauschen, gehen Sie wie folgt vor. Zuerst müssen wir den vorherigen Knoten des Schwanzes und den nächsten Knoten des Kopfes in eine temporäre Variable bringen und Kopf und Schwanz des nächsten und vorherigen Zeigers austauschen.

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

Einzug ist nicht korrekt, und es sollte immer eine kurze Erklärung geben, nicht nur ein Code-Dump . –

+0

Danke, ich habe jetzt die Erklärung hinzugefügt. – jafarbtech

+0

Bitte den Code richtig einrücken, dies macht es lesbarer und einfacher zu folgen. –

0

Sie (*head) -> prev und (*tail) -> prev zu ändern vergessen.

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

Hmm, fügen Sie diese Befehle am Ende der Funktion swapElements2? Denn wenn ich das tue, bekomme ich "Changed list: 1" ([hier] (http://ideone.com/YouUbd)) – user3120283

Verwandte Themen