2013-03-18 4 views
0

Je n'arrive pas à comprendre ce qui ne va pas avec ma fonction d'insertion.Récursivité/listes chaînées

Fondamentalement, dans la fonction principale, je demande à un utilisateur d'entrer un nombre entier, et il doit traverser la liste de manière RECURSIVE et insérer le numéro dans l'ordre. S'il vous plaît laissez-moi savoir si vous avez besoin d'autre chose.

Lorsque j'imprimer la liste, il n'imprime sur 0 deux fois

In the main: 
      **This is looped** 
    printf("Enter the value you want to insert: "); 
    scanf(" %d", &integer); 
    current = insert(&head, integer); 
    temp = current; 

    while(temp) 
    { 
     printf("%d\n", temp->num); 
     temp = temp->next; 
    } 


node* insert(node** head, int integer) 
{ 
    node* temp = malloc(sizeof(node)); 
    node* temp1; 
    node* new; 

    if(*head == NULL) 
    { 
     temp->num = integer; 
     temp->next = *head; 
     *head = temp; 
    } 
    else if((*head)->num > integer) 
    { 
     temp = *head; 
     temp1 = temp->next; //breaks the link 
     temp->next = new; //creates a new node 
     new->num = integer; //adds int 
     new->next = temp1; //links new node to previously broken node 
     *head = temp; 
    } 

    else 
     insert(&((*head)->next), integer); 

    return(temp); 
} 

Merci beaucoup!

+0

Où définissez-vous la valeur de nouveau? – John3136

+0

Qu'entendez-vous par là? – juice

+0

Y at-il une raison particulière pour laquelle vous voulez faire cela avec récursivité? Cela ne semble pas avoir de sens. – Lundin

Répondre

3
if(*head == NULL) 
{ 
    (*head)->next == temp; 
    temp->num = integer; 
    temp->next = *head; 
    *head = temp; 
} 

cela est faux et provoquera une lecture invalide * tête est NULL et donc (*head)->next est invalide. Il va lire à partir de NULL + offset. Où offset dépend de la définition de votre type de données node.

+1

Mais OP a un '==' au lieu de '=' (ce que je pense était l'intention), donc c'est une lecture invalide qui est beaucoup plus sûre qu'une écriture invalide ;-) – John3136

+1

En effet, belle prise. – Intrepidd

+1

Merci .. destiné à faire = mais de toute façon c'était encore faux. – juice

1
while(temp) 
{ 
    printf("%d\n", current->num); 
    temp = temp->next; 
} 

Je pense que vous voulez être imprimer temp->num au lieu de current->num.

+0

lol qui aide ... mais si j'entre 7 et puis 3 .. il imprime toujours 0 3 – juice