2016-07-28 14 views
-6

隣接リストを使用しているときに頂点の印刷に問題があります。私は隣人なしで始点だけを取得したいが、代わりにそれらのアドレスを取得する。だから、私はポインタに関する問題があります。今、私はなぜそれが正しい出力を印刷していないのか分からない。私のコード:Cのグラフの隣接リスト

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
typedef struct ADI{ 
    int val; 
    struct ADI *urm; 
}ADI; 

ADI *adjancencyList(int vertex) 
{ 
    int neigh,i; 
    ADI *head, *elem, *vec; 
    head = (ADI*) malloc(sizeof(ADI)); 
    head->val = vertex; 
    elem = head; 
    printf("Input number of neighbours:"); 
    scanf("%d", &neigh); 
    for(i = 0; i < neigh ; i++) 
    { printf("Neighbour:"); 
     vec = (ADI*) malloc(sizeof(ADI)); 
     elem->urm = vec; 
     scanf("%d", &elem->val); 
    } 

    return head; 
} 
int main() 
{ int i, n, v; 
    printf("Input number of vertices "); 
    scanf("%d", &n); 
    ADI *A = (ADI*) malloc(n * sizeof(ADI)); 

    for(i = 0; i < n; i++) 
    { 
     printf("Input vertex name:"); 
     scanf(" %d ", &v); 
     A = adjancencyList(v); 
     A++; 
    } 

    A = &(A[0]); 

    for(i = 0; i < n; i++) 
    { 
    printf(" %d ", A->val ); 
    printf(" \n "); 
    A++; 
    } 
    return 0; 

} 
+2

入力、予想される出力、および実際の出力の例を提供してください。 –

+1

@MichaelWalz: "Great minds ..." –

+0

'scanf()' -family形式の文字列の末尾のスペースは、ファイルではなくユーザーからの入力である場合には、悪質なものです。基本的な問題は、 'scanf()'関数が実際の入力の後に空白文字でないものを見つけるまで返されないということです。 –

答えて

1

あなたのプログラムはメモリリークの原因です。 adjancencyList()から返されるものを格納するには、ADIの配列ではなく、ADI*の配列を使用する必要があります。この場合は、添え字を使用する方がインクリメントよりもよく見えます。もう1つのヒントは、A = &(A[0]);は事実上何もしないということです。

また、彼らはyou shouldn't cast the result of malloc() in Cと言います。

はこれを試してみてください:

int main(void) 
{ 
    int i, n, v; 
    printf("Input number of vertices "); 
    scanf("%d", &n); 
    ADI **A = malloc(n * sizeof(ADI*)); 

    for(i = 0; i < n; i++) 
    { 
     printf("Input vertex name:"); 
     scanf(" %d ", &v); 
     A[i] = adjancencyList(v); 
    } 

    for(i = 0; i < n; i++) 
    { 
     printf(" %d ", A[i]->val ); 
     printf(" \n "); 
    } 
    return 0; 

} 
+0

答えをありがとう!私が読んだところでは、二重ポインタの使用が必要であると思いました。なぜそれが正しい形式であるのか説明してください。私のベクトルの最初のアドレスを指さないのですか?また、私はA =&(A [0])を使用したので、forの最後の後、最初のアドレスに再びいました。 –

+0

@AlexPostolache 'A'の型が要素の型に合っているので(' adjanencyList() 'も@JonathanLefflerによって指摘されているように間違っています)' main() ')。あなたの 'A' *は' malloc() 'によって割り当てられたものを指し示していましたが、代入' A = adjancencyList(v); 'で上書きされています。 'A =&(A [0])'は 'A =&(A + 0)'に相当します。これは 'A =&* A'と等価です。努力はありません。 – MikeCAT

関連する問題