2015-08-15 46 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