数据结构实验报告无向图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
◎实验题目: 无向图的建立与遍历
◎实验目的:掌握无向图的邻接链表存储,熟悉无向图的广度与深度优先遍历。
◎实验内容:对一个无向图以邻接链表存储,分别以深度、广度优先非递归遍历输出。
一、需求分析
1.本演示程序中,输入的形式为无向图的邻接链表形式,首先输入该无向图的顶点数和边数,接着输入顶点信息,再输入每个边的顶点对应序号。
2.该无向图以深度、广度优先遍历输出。
3.本程序可以实现无向图的邻接链表存储,并以深度、广度优先非递归遍历输出。
4.程序执行的命令包括:(1)建立一个无向图的邻接链表存储(2)以深度优先遍历输出(3)以广度优先遍历输出(4)结束
5.测试数据:
顶点数和边数:6,5
顶点信息:a b c d e f
边的顶点对应序号:
0,1
0,2
0,3
2,4
3,4
深度优先遍历输出:
a d e c b
f
广度优先遍历输出:
a d c
b e
f
二概要设计
为了实现上述操作,应以邻接链表为存储结构。
1.基本操作:
void createalgraph(algraph &g)
创建无向图的邻接链表存储
void dfstraverseal(algraph &g,int v)
以深度优先遍历输出
void bfstraverseal(algraph &g,int v) 以广度优先遍历输出
2.本程序包含四个模块:
(1)主程序模块
(2)无向图的邻接链表存储模块
(3)深度优先遍历输出模块
(4)广度优先遍历输出模块
3.模块调用图:
三详细设计
1.元素类型,结点类型和指针类型:typedef struct node
{
int adjvex;
struct node *next;
}edgenode;
typedef struct vnode
{
char vertex;
edgenode *firstedge;
}vertxnode;
typedef vertxnode Adjlist[maxvernum]; typedef struct
{
Adjlist adjlist;
int n,e;
}algraph;
edgenode *s;
edgenode *stack[maxvernum],*p;
2.每个模块的分析:
(1)主程序模块
int main()
{
int v=0;
algraph g;
createalgraph(g);
printf("以深度优先遍历输出\n");
dfstraverseal(g,v);
printf("以广度优先遍历输出\n");
bfstraverseal(g,v);
getchar();
getchar();
return 0;
}
(2)无向图的邻接链表存储模块
void createalgraph(algraph &g)
{
int i,j,k;
edgenode *s;
printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
scanf("%d,%d",&(g.n),&(g.e)); /*读入顶点数和边数*/
getchar();
printf("请输入顶点信息(输入格式为:(顶点号(CR))):\n");
for(i=0;i { scanf("%c",&(g.adjlist[i].vertex)); /*读入顶点信息*/ getchar(); g.adjlist[i].firstedge=NULL; /*顶点的边表头指针设为空*/ } printf("请输入边的信息(输入格式为:i,j):\n"); for(k=0;k { scanf("%d,%d",&i,&j); /*读入边(vi,vj)的顶点对应序号*/ s=(edgenode *)malloc(sizeof(edgenode)); /*生成新边表节点s*/ s->adjvex=j; /*邻接点序号为j*/ s->next=g.adjlist[i].firstedge; /*将新边表节点s插入到顶点vi的边表头部*/ g.adjlist[i].firstedge=s; s=(edgenode *)malloc(sizeof(edgenode)); /*生成新边表节点s*/ s->adjvex=i; /*邻接点序号为i*/ s->next=g.adjlist[j].firstedge; /*将新边表节点s插入到顶点vj的边表头部*/ g.adjlist[j].firstedge=s; } } (3)深度优先遍历输出模块 { int j=0; edgenode *stack[maxvernum],*p; int visited[maxvernum],top=-1,i; for(i=0;i visited[i]=0; while(j!=g.n) { i=0; while(visited[i]==1) { i++; }v=i; printf("%c ",g.adjlist[v].vertex); /*访问图的指定起始顶点v*/ j++; p=g.adjlist[v].firstedge; visited[v]=1; while(top>=0||p!=NULL) { while(p!=NULL) if(visited[p->adjvex]==1) p=p->next; else { printf("%c ",g.adjlist[p->adjvex].vertex); /*从v出发访问一个与v邻接的p所指的顶点*/ j++; visited[p->adjvex]=1; top++; stack[top]=p; /*将p所指的顶点入栈*/ p=g.adjlist[p->adjvex].firstedge; /*从p所指顶点出发*/ } if(top>=0) { p=stack[top]; /*退栈,回溯查找已被访问节点的未被访问过的邻接点*/ top--; p=p->next; } } printf("\n"); } }(4)广度优先遍历输出模块