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;
}