【问题标题】:c display adjacency list of graphc 显示图的邻接列表
【发布时间】:2015-08-15 12:04:21
【问题描述】:

我已经为基于 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 的值。请帮助我正在纠正这个问题,以便可以显示正确的邻接列表

【问题讨论】:

  • 不要使用please、Thanks之类的句子,因为这只会让人不得不阅读更多(没有有价值的内容)。也使用适当的代码缩进。
  • C 中的数组索引从 0 开始。您始终使用基于 1 的索引并且您的数组应该足够大,但是如果您使用 C 编程,请使用 C 表示法。也没有必要创建一个虚拟哨兵节点; NULL 指针旨在承担该角色。
  • 是的,但是代码适用于连接的组件,例如 when v=3 e=2 (1,2)( 2,3)

标签: c graph-algorithm


【解决方案1】:

您需要更好地构建数据。例如,目前,边由struct node 表示,节点本身由指向struct node 的指针数组表示。

在您的代码中,adjv[i] 是顶点 i 的邻接列表的头部,但您的代码会在边数上循环。您有 4 个顶点和 2 条边,因此您错过了与顶点 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指针作为链表的标记值;
  • 为顶点和边提供不同的结构,因为它们代表不同的事物,通常也需要不同的数据;
  • 始终使用node 或vertex 之一,因为它们本质上是相同的,但在您的代码中应该有一个统一的名称,以便您可以快速了解发生了什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多