2016-11-24 4 views
1

無限ループに陥る関数。ノードの数を返すことはできません。どこが間違っていますか?提供するソースコードでダブルポインタを使用したC++の循環リストのサイズ

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

答えて

0

、一方条件は、ポインタのアドレスを参照している(ポインタが格納されている)とstruct node **headmain()で静的位置を指しているが、(&(*temp)->next)の割り当てを指しています最後の項目。

リンクリスト内の項目を比較するために、あなたはポインタstruct node *代わりのポインタstruct node **のアドレスを比較する必要があります。 Count()関数で

*headは( NULLと比較していない)が存在するので、カウンタcountは1から開始する必要が円形リスト内のすべての項目をカウントするためには、代わりに次の項目temp = &((*head)->next);temp = &(*head);によって開始する必要があり。

ここでは"Minimal, Complete, and Verifiable example"です。

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; 
} 
:ポインタは、次の例のようなレベルで

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

リンクリストを管理するために、よりシンプルになります

関連する問題