读书人

图的遍历麻烦大家帮帮忙看一下。解决

发布时间: 2012-04-13 13:50:24 作者: rapoo

图的遍历,麻烦大家帮帮忙看一下。
#include <stdio.h>
#include <malloc.h>

//int visited[20];

typedef struct ANode //边表结点
{
int adjvex; //邻接点域
struct ANode *nextarc; //链域
//int info;
}ArcNode;

typedef struct Vnode //表头结点
{
int data; //顶点值
ArcNode *firstarc; //表头结点指针
}VNode;

typedef VNode AdjList[10];

typedef struct
{
AdjList adjlist;
int n,e;//顶点数n和边数e
}ALGraph;


void CreatALGraph(ALGraph *G)
{
int i,j;//顶点数和边数
int k;
int a;//顶点值
ArcNode *s;

printf("请输入顶点数和边数:\n");
scanf("%d %d",&i,&j);
G->n=i;
G->e=j;

printf("请输入顶点值:\n");
for(k=0;k<G->n;k++)
{
scanf("%d",&a);
G->adjlist[i].data=a;//给顶点赋值
G->adjlist[i].firstarc=NULL; //将边表置空
}

printf("请输入构成由两个序号构成的变:例如(0,1)\n");
for(k=0;k<G->e;k++)
{
printf("请输入弧尾结点编号:");
scanf("%d",&i);

printf("请输入弧头结点编号:");
scanf("%d",&j);
printf("\n");
s=(ArcNode *)malloc(sizeof(ArcNode)); //生成 边表结点
s->adjvex=j;
s->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=s; //生成从i指向j的边

}


}

int visited[50];


void DFS(ALGraph *G,int v)
{
ArcNode *p;
visited[v]=1;
printf("%d",v);
p=G->adjlist[v].firstarc;
while(p!=NULL)
{
if (visited[p->adjvex]==0)
{
DFS(G,p->adjvex);
}
p=p->nextarc;
}
}

void main()
{
int v;
ALGraph *G;
G=(ALGraph *)malloc(sizeof(ALGraph));
CreatALGraph(G);
printf("请输入初始顶点编号:");
scanf("%d",&v);
DFS(G,v);

}



这个程序可以通过编译,但是有问题,麻烦高手们帮帮忙看一下。谢谢了!

[解决办法]
呵呵! 你这个是根据李春葆的数据结构写的程序吧?
改好了,没多大错误.

#include <stdio.h>
#include <malloc.h>

//int visited[20];

typedef struct ANode //边表结点
{
int adjvex; //邻接点域
struct ANode *nextarc; //链域
//int info;
}ArcNode;

typedef struct Vnode //表头结点
{
int data; //顶点值
ArcNode *firstarc; //表头结点指针
}VNode;

typedef VNode AdjList[10];

typedef struct
{
AdjList adjlist;
int n,e; //顶点数n和边数e
}ALGraph;


void CreatALGraph(ALGraph *G)
{
int i,j; //顶点数和边数
int k;
int a; //顶点值
ArcNode *s;

printf("请输入顶点数和边数:\n");
scanf("%d %d",&i,&j);
G->n=i;
G->e=j;

printf("请输入顶点值:\n");
for(k=0;k<G->n;k++)
{
scanf("%d",&a);
**************************************************************************
//下标应该是k,而不是你写的i;因为此时i是顶点数,是个定值。

G->adjlist[k].data=a; //给顶点赋值
G->adjlist[k].firstarc=NULL; //将边表置空
**************************************************************************
}

printf("请输入构成由两个序号构成的变:例如(0,1)\n");
for(k=0;k<G->e;k++)
{
printf("请输入弧尾结点编号:");
scanf("%d",&i);

printf("请输入弧头结点编号:");
scanf("%d",&j);
printf("\n");
s=(ArcNode *)malloc(sizeof(ArcNode)); //生成 边表结点
s->adjvex=j;
s->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=s; //生成从i指向j的边

}


}

int visited[50];


void DFS(ALGraph *G,int v)
{
ArcNode *p;
visited[v]=1;


printf("%d",v);
p=G->adjlist[v].firstarc;
while(p!=NULL)
{
if (visited[p->adjvex]==0)
{
DFS(G,p->adjvex);
}
p=p->nextarc;
}
}

void main()
{
int v;
ALGraph *G;
G=(ALGraph *)malloc(sizeof(ALGraph));
CreatALGraph(G);
printf("请输入初始顶点编号:");
scanf("%d",&v);
DFS(G,v);

}


读书人网 >C语言

热点推荐