2016-11-24 2 views
1

La fonction en résultant dans une boucle infinie. Il n'est pas capable de renvoyer le nombre de nœuds. Où vais-je mal?Taille de la liste circulaire en C++ à l'aide de Double Pointer

int Count(struct node **head) 
    { 

    printf("entered"); 
    struct node **temp; 
    int count = 0; 
    temp = &((*head)->next); 
    while ((&(*temp)->next) != head) 
    { 
     printf("entered"); 
     temp = &((*temp)->next); 
     count++; 
    } 
return count; 
    } 

Répondre

0

Dans le fournir le code source, le tout en condition fait référence à des adresses de pointeurs (où le pointeur est stocké) et le struct node **head pointe vers un emplacement statique dans la main() mais (&(*temp)->next) pointe sur la somme allouée de le dernier élément.

Pour comparer les éléments d'une liste liée, vous devez comparer les pointeurs struct node * au lieu d'adresses de pointeurs struct node **.

Dans la fonction Count(), parce que le *head existe (non par rapport à NULL), le compteur count devrait commencer à partir de 1 et de compter tous les éléments de la liste circulaire, vous devriez commencer par temp = &(*head); au lieu de l'élément suivant temp = &((*head)->next); .

Ci-après est un "Minimal, Complete, and Verifiable example".

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

#define NODE_MAX (5) 

struct node { 
    struct node *next; 
}; 

int Count(struct node **head) 
{ 
    printf("entered"); 
    struct node **temp; 
    int count = 1; // at least the '*head' node exists 
    temp = &(*head);// &((*head)->next); 
    while (((*temp)->next) != *head) // use '*head' 
    { 
     printf("entered"); 
     temp = &((*temp)->next); 
     count++; 
    } 
    return count; 
} 

int main() 
{ 
    struct node array[NODE_MAX]; 
    struct node *head, *temp; 

    head = &(array[0]); 
    temp = head; 
    for(int i=1;i<NODE_MAX;i++) { 
     temp->next = &(array[i]); 
     temp = temp->next; 
    } 
    temp->next = &(array[0]); 

    printf("\nCount = %d\n",Count(&head)); 

    system("pause"); 
    return (0); 
} 

Il serait plus simple à gérer liste liée à des pointeurs niveau comme l'exemple suivant:

int Count2(struct node **head) 
{ 
    printf("entered"); 
    struct node *temp; 
    int count = 1; 
    temp = (*head); // pointers to the first 
    while (temp->next != *head) // direct pointer comparison 
    { 
     printf("entered"); 
     temp = temp->next; // natural linked-list exploration 
     count++; 
    } 
    return count; 
}