0

すべての頂点とそのエッジをグラフに印刷しようとしています。グラフには隣接リスト表現を使用しました。私のコードは

#define MAX 1000

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

struct node *arr[MAX];


void printGraph(int n)
{
    // n is the number of vertex

    int i;
    for(i=0;i<n;i++)
    {
        printf("The vertex %d is connected to");

        if(arr[i]->next==NULL)
            printf("no edges");
        else
        {
            struct node *tmp;
            for(tmp=arr[i];tmp!=NULL;tmp=tmp->next)
                printf("%d",tmp->data);
        }
        printf("\n");
    }
}

メソッドを呼び出すたびにprintGraph、プログラムは無限ループに入ります。エラーはどこにありますか?


I am adding my other methods. Please check them to see if I am properly creating a graph


void createEmptyGraph(int n)
{

// n is the number of vertices
int i;

for(i=0;i<n;i++)
{
    struct node *n;
    n=(struct node *)malloc(sizeof(struct node));

    n->data=i;
    n->next=NULL;

    arr[i]=n;
}

printf("\nAn empty graph with %d vertices has been sreated",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);
}
4

3 に答える 3

0
n->next=arr[startVertex];
arr[startVertex]->next=n;

このコードはtmp!=NULLが発生しないようにします

多分このように:

n->next=arr[startVertex]->next;
arr[startVertex]->next=n;
于 2012-07-19T09:23:28.163 に答える
0

tmp!=NULL決して起こらないかもしれません...?

于 2012-07-19T09:17:27.920 に答える
0

arr[i] がサイクル内にある場合、これは永久にループする可能性がありますfor(tmp=arr[i];tmp!=NULL;tmp=tmp->next)。次のように、チェックしてサイクルを中断するために訪問済みのベクトルを保持します。

node *visited[MAX];
int nVis = 0;
bool cycle = false;
for(tmp=arr[i];tmp!=NULL && !cycle;tmp=tmp->next) {
  for (int j = 0; j < nVis; ++j)
   if (visited[j] == tmp) {
     cycle = true;
     break;
   }
 visited[nVis++] = tmp;
 ...
}
于 2012-07-19T09:21:49.227 に答える