2016-08-17 1 views
0

schrieb ich eine rekursive Funktion eine verknüpfte Liste zu umkehren wie folgt:Der mitgelieferte Parameter für die Funktion wird NULL?

struct node{ 
int val; 
struct node *next; 
}; 
//Global pointer to structure 
struct node *start=NULL,*head=NULL; 


//*Function to input node* 

void create(int data){ 

struct node *temp; 
temp=(struct node *)malloc(sizeof(struct node)); 
if(start == NULL){ 
    temp->val=data; 
    temp->next=NULL; 
    start=temp; 
    head=temp; 
} 
else{ 
    temp->val=data; 
    temp->next=NULL; 
    head->next=temp; 
    head=temp; 
    } 
    } 

    *Function to reverse the linked list* 
    void* rev(struct node *prev,struct node *cur){ 
     if(cur!=NULL){ 
     printf("Works"); 
     rev(cur,cur->next); 
     cur->next=prev; 
    } 
    else{ 
     start=prev; 
    } 

} 

und der damit verbundenen Code in Haupt ist:

main(){ 
    struct node *temp; 
    temp=start; 
    /*Code to insert values*/ 
    rev(NULL,temp); 
    } 

nun der Code nimmt die Eingabe und druckt es perfekt, aber nachdem ich Call rev() Funktion die gleiche Traversalfunktion druckt nichts. Ich habe den Code auf Debugger Zeile für Zeile n es gab mir die folgende Ausgabe laufen:

rev (i = 0x0, CUR = 0x0)

Auch da cur ist irgendwie NULL, die if Teil von rev() wird nie ausgeführt und nur die else wird einmal ausgeführt. Wenn ich die Eingabe in meiner create() Funktion nehme, aktualisiere ich den Start auf das erste Element der verknüpften Liste und sogar in main eine Print-Anweisung beweist, dass es so ist. Aber warum erhält die Funktion rev() immer Eingangsparameter als NULL?

Bitte kommentieren Sie, wenn zusätzliche Informationen erforderlich sind.

Antwort

0

Spezifische Probleme mit Ihrem Code: Ihre main() Funktion fehlt ausreichend Code, um die Umkehrfunktionalität zu testen (z. B. erzeugt es keine Knoten!); Ihre create() Routine benötigt wirklich einen head und tail Zeiger, um richtig zu arbeiten, nicht die aktuellen head und start; Ihre Umkehrfunktion behält den Kopf-/Anfangszeiger bei, behandelt jedoch keinen Endzeiger; Sie haben redundanten Code in Ihren if und else Klauseln, die aus dem Konditional herausgezogen werden können; Sie haben rev() eine void * statt einfach void deklariert.

Ich habe überarbeiteten Code unten mit den oben genannten Änderungen zusammen mit einigen Stilfragen Adressierung:

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

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

// Global pointers to structure 
struct node *head = NULL, *tail = NULL; 

// Function to add node 

void create(int data) { 

    struct node *temporary = malloc(sizeof(struct node)); 

    temporary->value = data; 
    temporary->next = NULL; 

    if (head == NULL) { 
     head = temporary; 
    } else { 
     tail->next = temporary; 
    } 

    tail = temporary; 
} 

// Function to reverse the linked list 

void reverse(struct node *previous, struct node *current) { 
    if (current != NULL) { 
     reverse(current, current->next); 
     current->next = previous; 
    } else { 
     head = previous; 
    } 

    if (previous != NULL) { 
     tail = previous; 
    } 
} 

void display(struct node *temporary) { 
    while (temporary != NULL) { 
     printf("%d ", temporary->value); 
     temporary = temporary->next; 
    } 
    printf("\n"); 
} 

// And the related code in main is: 

int main() { 

    /* Code to insert values */ 
    for (int i = 1; i <= 10; i++) { 
     create(i); 
    } 

    display(head); 

    reverse(NULL, head); 

    display(head); 

    create(0); 

    display(head); 

    return 0; 
} 

OUTPUT

> ./a.out 
1 2 3 4 5 6 7 8 9 10 
10 9 8 7 6 5 4 3 2 1 
10 9 8 7 6 5 4 3 2 1 0 
> 

Sie eine Routine hinzufügen, sollte die Knoten in der befreien verknüpfte Liste.

+0

Oh wow! Danke für Ihre Bemühungen. Ich bin mir noch nicht sicher, ob etwas mit der 'rev()' Funktion nicht stimmt. Es tut mir leid, mein 'create()' ist in der Tat unordentlich. Danke nochmal :) – Shanky

Verwandte Themen