从文件读取无向图邻接表,进行深度优先遍历
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
//定义邻接表
typedef struct node{
int adjvex;//顶点编号
struct node *next;//指向下一个结点
}edgenode;//
typedef struct vnode{
int vertex;//顶点
edgenode *firstedge;//指向第一个表结点
}vertexnode,AdjList[MAX];//头结点
typedef struct{
AdjList vertices; //顶点数组
int vexnum;//顶点数
int arcnum;//弧的条数
}Graph;
int CreatGraph(Graph &G)//从文件读取并输出邻接表
{
FILE *fp;edgenode *p;
if((fp=fopen("graph.txt","r"))==NULL)
{
printf("文件打开失败\n");
return 0;
}
fscanf(fp,"%d",&G.vexnum);
G.arcnum=G.vexnum+1;
printf("顶点个数%d\n",G.vexnum);
int i;
for (i = 1; i <= G.vexnum; i++)
{
G.vertices[i].vertex = i ;
G.vertices[i].firstedge = NULL;
int a;
while (1)
{
fscanf(fp, "%d", &a);
if (a == 0) break;
else
{
p = (edgenode *)malloc(sizeof(edgenode));
p->adjvex = a;
p->next = G.vertices[i].firstedge;
G.vertices[i].firstedge = p;
}
}
}
fclose(fp);
//输出邻接表
printf("创建无向图G2邻接表如下:\n");
for(i=1;i<=G.vexnum;i++)
{
p=G.vertices[i].firstedge;//指向第一个表结点
while(p!=NULL)
{
printf("%d->",p->adjvex);
p=p->next;
}
printf("NULL\n");
}
return 1;
}
int Firstadjvex(Graph G,int v)//在邻接表中找结点v的第一个邻接点
{
edgenode *p;
p=G.vertices[v].firstedge;
if(p)
return (p->next->adjvex);
else
return 0;
}
int Nextadjvex(Graph G,int v,int w)//在邻接表中找结点v继邻接点w后的第一个结点
{
edgenode *p;int i,j;
p=G.vertices[v].firstedge;
while(p)
{
i=p->next->adjvex;
if(i==w)
break;
}
j=Firstadjvex(G,i);
return j;
}
void DFS(Graph G,int v,int visited[])
{
printf("%d",G.vertices[v].vertex);
visited[v]=1;int w;
for(w= Firstadjvex(G,v);w;w=Nextadjvex(G,v,w))
if(visited[w]==0)
DFS(G,w,visited);
}
void DFStravel(Graph G)
{
printf("G2深度优先遍历如下\n");
int visited[MAX];
int i;
for(i=1;i<=G.vexnum;++i)
visited[i]=0;
for(i=1;i<=G.vexnum;++i)
if(visited[i])
DFS(G,i,visited);
}
int main(void)
{
Graph G;
G=*(Graph*)malloc(sizeof(Graph));
CreatGraph(G);
DFStravel(G);
return 0;
}
运行结果只有一行G2深度优先遍历如下,请问出错在哪里了呢?如何修改?
文本文档内容为
3
3 2 1 0
3 1 2 0
2 1 3 0