2016-04-05 4 views
0

I-Elemente wie folgt paiwise tauschen musste tauschen:eine einfach verkettete Liste gegeben, schreiben Sie ein Funktionselement paarweise

Eg: 1 2 3 4 5 6 7 8 //Before 
    2 14 3 6 5  8 7 //After 

Meine Swap-Funktion ist als followes.

void swap(struct node *head) 
{ 
    struct node *p, *a, *q; 
    p = head; 
    do{ 
     head = p; 
     p = head -> next -> next; 
     q = head->next;    
     head -> next -> next = head; 
     head -> next = p; 
     head = q; 
    } while(p!=NULL); 
} 

Aber der Code funktioniert nicht. Mein vollständiger Code ist wie folgt:

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

struct node 
{ 
    int dat; 
    struct node *next; 
}; 

void print(struct node *); 
void swap(struct node *); 

int main() 
{ 
    int i; 
    struct node *head, *h1, *h2, *h3, *h4, *h5, *h6, *h7, *h8; 
    h1 = (struct node *)malloc(sizeof(struct node)); 
    h2 = (struct node *)malloc(sizeof(struct node)); 
    h3 = (struct node *)malloc(sizeof(struct node)); 
    h4 = (struct node *)malloc(sizeof(struct node)); 
    h5 = (struct node *)malloc(sizeof(struct node)); 
    h6 = (struct node *)malloc(sizeof(struct node)); 
    h7 = (struct node *)malloc(sizeof(struct node)); 
    h8 = (struct node *)malloc(sizeof(struct node)); 
    head = (struct node *)malloc(sizeof(struct node)); 
    head = h1; 
    h1 -> dat = 1; 
    h1 -> next = h2; 
    h2 -> dat = 2; 
    h2 -> next = h3; 
    h3 -> dat = 3; 
    h3 -> next = h4; 
    h4 -> dat = 4; 
    h4 -> next = h5; 
    h5 -> dat = 5; 
    h5 -> next = h6; 
    h6 -> dat = 6; 
    h6 -> next = h7; 
    h7 -> dat = 7; 
    h7 -> next = h8; 
    h8 -> dat = 8; 
    h8 -> next = NULL; 
    print(head); 
    printf("\n\n"); 
    swap(head); 
    getch(); 
    return 0; 
} 

void print(struct node *head) 
{ 
    if(head != NULL) 
    { 
     printf("%d\n", head -> dat); 
     head = head -> next; 
     print(head); 
    } 
} 

void swap(struct node *head) 
{ 
    struct node *p, *a, *q; 
    p = head; 
    do{ 
     head = p; 
     p = head -> next -> next; 
     q = head -> next;    
     head -> next -> next = head; 
     head -> next = p; 
     head = q; 
    } while(p != NULL); 
} 

Bitte helfen Sie meinen Code zu korrigieren

+1

einrücken Code zuerst! – LPs

+3

Wie funktioniert es nicht? Beschreiben Sie das erwartete und tatsächliche Verhalten. –

+0

Das scheint eine wirklich, wirklich merkwürdige Implementierung von Swap zu sein. Würdest du es nicht zwei Zeiger weitergeben wollen und sie ihre Position in der Liste tauschen lassen? –

Antwort

0

Es gibt ein paar Dinge falsch in Ihrem Code. Einer ist, dass Sie den Kopf in der Schleife ändern, wo Sie ihn nur am Anfang ändern sollten (und eine andere Variable verwenden, wenn Sie die verknüpfte Liste durchlaufen). Auch sollten Sie mehr Kontrollen haben, wenn Sie das Ende der Liste schlagen können.

Probieren Sie etwas wie (Disclaimer, ich es eigentlich nicht versuchen):

void swap(struct node *head) 
{ 
    struct node *odd, *even; 
    if ((head == NULL) || (head->next == NULL)) 
     return; 
    odd = head; 
    even = head->next; 
    head = head->next; // change this one once and for all 

    while ((odd != NULL) && (even != NULL)) { 
     // swap the elements 
     odd->next = even->next; 
     even->next = odd; 

     // move to the next ones 
     odd = even->next; 
     if (odd != NULL) 
      even = odd->next; 
    } 
} 
Verwandte Themen