2015-08-15 70 views
0

我已經編寫了一個基於小c圖的實現的代碼,並相應地列出了圖的頂點的鄰接列表。我給上面的代碼是:c顯示圖的鄰接列表

#include<stdio.h> 
#include<stdlib.h> 
struct node { 
    int info; 
    struct node* next; 
}* z, *adjv[50], *t; 
void insert() { 
    int j, v, e, c, d, i; 
    z = (struct node*)malloc(sizeof(struct node)); 
    z->next = z; 
    scanf("%d%d", &v, &e); 
    for (j = 1; j <= v; j++) { 
     adjv[j] = z; 
    } 
    for (j = 1; j <= e; j++) { 
     scanf("%d%d", &c, &d); 
     t = (struct node*)malloc(sizeof(struct node)); 
     t->info = c; 
     t->next = adjv[d]; 
     adjv[d] = t; 
     t = (struct node*)malloc(sizeof(struct node)); 
     t->info = d; 
     t->next = adjv[c]; 
     adjv[c] = t; 
    } 
    for (i = 1; i <= e; i++) { 

     while (adjv[i] != z) { 
      printf("%d", adjv[i]->info); 
      adjv[i] = adjv[i]->next; 
     } 
    } 
} 
int main() { 
    insert(); 
    return 0; 
} 

當我爲它提供頂點= 4的邊緣= 2和邊緣爲(1,2)(3,4)它不顯示這是斷開的圖作爲鄰接列表僅顯示1和2的值。請幫助我解決此問題,以便可以顯示正確的鄰接列表

+0

請不要用逗號,謝謝之類的句子,因爲它只是讓人們必須閱讀更多(沒有有價值的內容)。也使用正確的代碼縮進。 – hoijui

+0

C中的數組索引從0開始。您始終使用基於1的索引,並且您的數組應該足夠大,但如果使用C編程,請使用C符號。也沒有必要創建一個虛擬哨兵節點; 'NULL'指針被設計用來扮演這個角色。 –

+0

是的,但代碼適用於連接組件,例如當v = 3時e = 2(1,2)(2,3) – soul

回答

0

您需要更好地構建數據。例如,此刻,邊由struct node表示,並且節點本身由指向struct node的指針陣列表示。

在您的代碼中,adjv[i]是頂點i的鄰接列表的頭部,但是您的代碼會遍歷邊的數目。您有4個頂點和條邊,所以你錯過了連接頂點3和4

一個糾正(更詳細)打印循環會循環達到頂點數量:

for (i = 1; i <= v; i++) { 
    while (adjv[i] != z) { 
     printf("%d -> %d\n", i, adjv[i]->info); 
     adjv[i] = adjv[i]->next; 
    } 
} 

也就是說,請考慮讓你的代碼更具可讀性和更多C-ish:

  • 使您的索引從零開始;
  • 使用NULL指針作爲鏈表的標記值;
  • 爲頂點和邊緣提供了不同的結構,因爲它們表示不同的東西並且通常也需要不同的數據;
  • 始終使用nodevertex中的任何一個,因爲它們本質上是相同的,但應在代碼中使用統一名稱,以便您快速瞭解發生了什麼。
+0

謝謝我在v和e變量之間感到困惑 – soul