2016-12-09 6 views
1

Ich brauche ein wenig zu beheben in meinem Code
die Funktion void sort_list (struct Node * Kopf) dividieren Sie die Liste auf 2 Listen: ungerade Zahlen und gerade Zahlen. dann die 2 Listen zurück zu einer Liste, wenn die geraden Zahlen in der linken und die ungeraden Zahlen in der rechten marge. alles funktioniert, außer dass die ursprüngliche Liste in der Hauptsache nicht aktualisiert wird. ich werde nicht die neue Liste zurückgeben. Die Funktion muss ungültig sein. vielleicht muss ich die Liste auf andere Weise senden, aber ich weiß nicht wie. Dank für HilfeC | Segregate gerade und ungerade Knoten in einer verknüpften Liste

#include <stdio.h> 
#include <time.h> 

struct Node { 
    int data; 
    struct Node* next; 
}; 

struct Node* Create_list(int size) { 
    struct Node* head = NULL, *temp; 
    srand(time(NULL)); 
    for (int i = 0;i<size;i++) { 
     int x = rand() % 10 + 1; 
     temp = (struct Node*)malloc(sizeof(struct Node)); 
     temp->data = x; 
     temp->next = head; 
     head = temp; 
    } 
    return head; 
} 

void print_list(const struct Node* head) { 
    struct Node* temp=head; 
    while (temp != NULL) { 
     printf("%4d", temp->data); 
     temp = temp->next; 
    } 
    printf("\n"); 
} 

void free_list(struct Node* head) { 
    struct Node* to_free = head; 
    while (to_free != NULL) { 
     head = head->next; 
     free(to_free); 
     to_free = head; 
    } 
} 

void sort_list(struct Node* head) { 
    struct Node* head_odd, *head_even, *temp; 
    head_odd = head_even = NULL; 
    while (head != NULL) { 
     temp = head; 
     head = head->next; 
     if ((temp->data) % 2 == 0) { 
      temp->next = head_even; 
      head_even = temp; 
     } 
     else { 
      temp->next = head_odd; 
      head_odd = temp; 
     } 

    } 
    head = head_even; 
    while (head_even->next != NULL) { 
     head_even = head_even->next; 
    } 
    head_even->next = head_odd; 
} 

void main() { 
    struct Node* list = Create_list(6); 
    print_list(list); 
    sort_list(list); 
    print_list(list); 
    free_list(list); 
} 

Antwort

1

C verwendet Pass-by-Wert. So folgt aus:

void sort_list(struct Node* head) { 

von

gefolgt
sort_list(list); 

den Wert von list an die Funktion übergeben.

Alle Änderungen, die Sie an head innerhalb der Funktion vornehmen, sind local to head, d. H. Ändern den Wert list in main nicht.

einen doppelten Zeiger verwenden wie:

void sort_list(struct Node** head) { 
.... 
    *head = .... 


sort_list(&list); 

oder einen Zeiger zurück wie:

struct Node* sort_list(struct Node* head) { 
.... 
    return head; 


list = sort_list(list); 
Verwandte Themen