0

私はグラフが初めてで、グラフで非常に単純なプログラムを作成しようとしています。私は 2 つの関数を作成しました。そのうちの 1 つは、ユーザーが入力した数の頂点を持つ空のグラフを作成します。もう 1 つは、2 つの頂点間に有向エッジを追加します。


前者は正常に実行されますが、後者は実行されません。プログラムは実行を停止しますが、コードは正常にコンパイルされます。


#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;
}

グラフの隣接リスト表現を使用しています。エラーを指摘してください。


メソッドでもう1つ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

コードで奇妙なことがいくつか起こっています。

  • あなたはstruct node、いいえ しか持っていませんstruct edgenodeポインターは1 つしかないため、このnextモデルでは、各ノードはゼロまたは 1 つの発信エッジしか持つことができません。
  • addNodeエッジを追加する必要があるように見えますが、名前はそうではありません。
  • arrグラフのノードを表すように、本当にaddNodeエッジを追加する必要がある場合、なぜ新しいノードを割り当てるのでしょうか? そして、ノードを追加する必要があるときに、それを配列に追加しないのはなぜですか?

コードが失敗する理由について:

arr[startVertex]->next=n;

のすべてのエントリarrが初期化されNULL、それから変更されることはないため、これは失敗します。->を使用して、存在しないオブジェクトのメンバーにアクセスすることはできません。

于 2012-07-19T09:01:44.223 に答える
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 に答える