关于图的深度优先遍历的算法,我找出问题了,帮我改改。
#include<stdio.h>#include<stdlib.h>
#define Max 10
typedef int vertextype;
typedef struct arcnode{
int adjvex;
int info;
struct arcnode *next;
}arcnode;
typedef struct vnode{
vertextype data;
struct arcnode * firstarc;//边表的转换类型哦 对应类型;
}vnode;
typedef struct{
vnode adjlist[Max];
int arcnum,vernum;
}Algraph;
int visited[Max+1];//辅助数组记录未被访问的节点
void creat_Algraph(Algraph *g);
int locatevex(Algraph *g,vertextype);
void display_adjacency(Algraph *g);
void DFSTraver(Algraph g);
void DFS(Algraph g, int v);
void main()
{
Algraph g;
creat_Algraph(&g);
display_adjacency(&g);
printf("接下来演示图的遍历:\n");
printf("depth first search:");
DFSTraver(g);
}
int locatevex(Algraph *g,vertextype v)
{
int i;
for(i=0;i<g->vernum;i++)
if(g->adjlist[i].data==v)
return i;
return -1;
}
void creat_Algraph(Algraph *g)
{
int n,e,i,vi,vj,l,m;
arcnode *k;
printf("请输入顶点数和边数(空格区分):");
scanf("%d %d",&n,&e);
g->arcnum=e;g->vernum=n;
for(i=0;i<g->vernum;i++)
{
printf("请输入图的第%d顶点信息(整型):",i+1);
scanf("%d",&g->adjlist[i].data);
g->adjlist[i].firstarc=NULL;
}
printf("请输入边的信息:\n");
for(i=0;i<g->arcnum;i++)
{
printf("请输入第%d边上(vi,vj)上的顶点序号(空格区分):\n",i+1);
scanf("%d %d",&vi,&vj);
getchar(); //有必要用头插法去链接 Fistarc,数据本身就没有顺序可言;
l=locatevex(g,vi); //!!定位的正确连接点
m=locatevex(g,vj);
if(l>=0&&m>=0)
{
k=(arcnode*)malloc(sizeof(arcnode));
k->adjvex=m;////m+1
k->next=g->adjlist[l].firstarc;
g->adjlist[l].firstarc=k;
}
}
}
void display_adjacency(Algraph *g)
{
int i;
arcnode *k;
printf("图的邻接表 显示:\n");
for(i=0;i<g->vernum;i++)
{
printf("\n%4d",g->adjlist[i].data);
k=g->adjlist[i].firstarc;
while(k!=NULL)
{
printf("-->%d",k->adjvex);
k=k->next;
}
}
printf("\n");
}
void DFSTraver(Algraph g)
{
int i;
for(i=0;i<g.vernum;i++)
visited[i]=0;
for(i=0;i<g.vernum;i++);
if(!visited[i])
DFS(g,i);
}
void DFS(Algraph g ,int v)
{
arcnode *p;
printf("%5d\n",g.adjlist[v].data);//(1)这里有问题
visited[v]=1;
p=g.adjlist[v].firstarc;
while(p)
{
if(!visited[p->adjvex])//(2)这里有问题
DFS(g,p->adjvex);
p=p->next;
}
}