0

我是图表新手,我正在尝试在图表中编写非常简单的程序。我编写了两个函数,其中一个创建了一个空图,其顶点数与用户输入的一样多。另一个,在两个顶点之间添加有向边。


前者成功执行,但后者没有。程序停止运行,但代码编译成功。


#include <stdio.h>
#include <stdlib.h>
#define MAX 1000

struct node
{
    int data;
    struct node *next;
};

struct node *arr[MAX];

void createEmptyGraph(int n)
{
    // n is the number of vertices
    int i;

    for(i=0;i<n;i++)
    {
       arr[i]=NULL;
    }

    printf("\nAn empty graph with %d vertices has been created",n);
    printf("\nNo edge is connected yet");
}

void addNode(int startVertex,int endVertex)
{
    // For directed edges
    struct node *n;
    n=(struct node *)malloc(sizeof(struct node));
    n->next=arr[startVertex];
    arr[startVertex]->next=n;

    printf("\nAn edge between directed from %d to %d has been   added",startVertex,endVertex);
}

int main(void)
{
    int num;

    printf("Enter the number of vertices in the graph: ");
    scanf("%d",&num);

    createEmptyGraph(num);
    addNode(0,1);

    return 0;
}

我正在使用图形的邻接表表示。请指出错误。


还有一件事,在createEmptyGraph()方法中,为什么我不能做这样的事情


for(i=0;i<n;i++)
{
    arr[i]->data=d;
    arr[i]->next=NULL;
}
4

4 回答 4

1

您声明一个指针数组:

struct node *arr[MAX];

在您的createEmptyGraph()方法中,您需要首先分配数组中的每个结构 - 相反,您只需将指针设置为 null..

for(i=0;i<n;i++)
{
    arr[i]=NULL;
}

以下内容不起作用,因为您尚未分配每个条目:

for(i=0;i<n;i++)
{
    arr[i]->data=d;
    arr[i]->next=NULL;
}

先分配(malloc())然后你可以像上面那样设置...

因此,由于您尚未分配,因此以下内容将不起作用:

n->next=arr[startVertex]; // this is okay, you've set it to NULL
arr[startVertex]->next=n; // ERROR: you are accessing a NULL pointer!
于 2012-07-19T08:58:53.880 回答
0

你不可以做这个

 for(i=0;i<n;i++) 
 {     
      arr[i]->data=d;     
      arr[i]->next=NULL; 
 }

因为您的数组尚未初始化。此数组中的指针未初始化,取消引用它们不是一个好主意。要么将数组更改为结构数组而不是结构指针,要么将内存分配给数组中的指针。取消引用未初始化或 NULL 指针是自找麻烦。

于 2012-07-19T08:59:37.497 回答
0
CreateEmptyGraph()
for(i=0;i<n;i++)
{
    arr[i]->data=d;    // arr[i] is a pointer that must be initialized first.
    arr[i]->next=NULL; // arr[i] is a pointer that must be initialized first.
}

由于数组arr是一个指针数组,因此您不能在不初始化arr的情况下调用CreateEmptyGraph ,否则您可能会遇到访问冲突。

于 2012-07-19T09:00:18.440 回答
0

您的代码中发生了几件奇怪的事情。

  • 你只有一个struct node,没有struct edge。由于node只有一个next指针,因此在此模型中每个节点只能有零个或一个出边。
  • addNode看起来它应该添加边缘,但名称另有说明。
  • arr代表你的图的节点,如果真的addNode应该添加一条边,那么它为什么要分配一个新节点?当它应该添加一个节点时,为什么不将它添加到数组中?

至于您的代码失败的原因:

arr[startVertex]->next=n;

这将失败,因为 的所有条目arr都已初始化NULL并且从未更改过。您不能用于->访问不存在对象的成员。

于 2012-07-19T09:01:44.223 回答