数据结构算法图的基本操作何英才.docx
- 文档编号:29176588
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:16
- 大小:114.97KB
数据结构算法图的基本操作何英才.docx
《数据结构算法图的基本操作何英才.docx》由会员分享,可在线阅读,更多相关《数据结构算法图的基本操作何英才.docx(16页珍藏版)》请在冰豆网上搜索。
数据结构算法图的基本操作何英才
课程名称数据结构-图的遍历与存储
实验项目名称图的遍历与存储
姓名:
何英才学号:
123012013058班级:
软工2班
实验成绩指导老师(签名)日期
一.实验目的和要求
1.掌握图的基本概念。
2.掌握图基本操作的实现。
二.实验内容
①定义邻接矩阵的定义类型
typedefintda4tatype;
typedefstruct
{
charvexs[max];
intarcs[max][max];
intvexsnum,arcsnum;/*顶点个数及边的个数*/
}graph;
②定义邻接表的边结点类型以及邻接表类型
typedefcharvextype;
typedefstructnode
{
intadjvex;/*邻接点域*/
structnode*next;/*链域*/
}enode;/*边表结点*/
typedefstruct
{
vextypevertex;/*顶点信息*/
enode*link;/*边表头指针*/
}vnode;/*顶点表结点
③初始化图的邻接矩阵
for(i=0;i
G->vexs[i]=getchar();
for(i=0;i
for(j=0;j
G->arcs[i][j]=0;
④初始化图的邻接表
for(i=0;i { a[i].vertex=getchar(); a[i].link=NULL;/*边表头指针初始化*/ } 3.图的流程图 四.代码实现 #include #include #include #definemax6 typedefintdatatype; typedefstruct { charvexs[max]; intarcs[max][max]; intvexsnum,arcsnum;/*顶点个数及边的个数*/ }graph; voidcreatgraph(graph*G)/*建立邻接矩阵的无向图*/ { inti,j,k,sum; printf("请输入顶点个数及边的个数: \n"); scanf("%d%d",&G->vexsnum,&G->arcsnum); printf("请读入顶点信息,建立顶点表: \n"); getchar(); for(i=0;i G->vexs[i]=getchar(); for(i=0;i for(j=0;j G->arcs[i][j]=0;/*邻接矩阵初始化*/ printf("请输入相邻接的两边的顶点信息: \n"); for(k=0;k { scanf("%d%d",&i,&j); G->arcs[i][j]=1; G->arcs[j][i]=1; }/*读入边(Vi,Vj)*/ printf("输出的邻接矩阵为: \n"); for(i=0;i { printf("\n"); for(j=0;j printf("%3d",G->arcs[i][j]); }/*邻接矩阵的输出*/ printf("\n输出邻接矩阵Vi顶点的度为: \n"); for(i=0;i { sum=0; for(j=0;j if(G->arcs[i][j]==1) sum++; printf("V%d的度为: %d\n",i,sum); }/*各顶点的度*/ } #definen4 #definem5 typedefcharvextype; typedefstructnode { intadjvex;/*邻接点域*/ structnode*next;/*链域*/ }enode;/*边表结点*/ typedefstruct { vextypevertex;/*顶点信息*/ enode*link;/*边表头指针*/ }vnode;/*顶点表结点*/ vnodea[n]; voidcreatlist()/*建立无向图的邻接表*/ { inti,j,k,sum; enode*s; printf("请读入顶点信息,建立顶点表: \n"); getchar(); for(i=0;i { a[i].vertex=getchar(); a[i].link=NULL;/*边表头指针初始化*/ } printf("请输入相邻接的两边的顶点信息: \n"); for(k=0;k { scanf("%d%d",&i,&j);/*读入边(Vi,Vj)*/ s=(enode*)malloc(sizeof(enode));/*生成邻接点序号为j的表结点*s*/ s->adjvex=j; s->next=a[i].link; a[i].link=s;/*将*s插入顶点Vi的边表头部*/ s=(enode*)malloc(sizeof(enode));/*生成邻接点序号为i的边表结点*s*/ s->adjvex=i; s->next=a[j].link; a[j].link=s;/*将*s插入顶点Vj的边表头部*/ } printf("输出的邻接表为: \n"); for(i=0;i { printf("\n%c",a[i].vertex); s=a[i].link; while(s) { printf("%d->",s->adjvex); s=s->next; } }/*邻接表的输出*/ printf("输出邻接表Vi顶点的度为: \n"); for(i=0;i { s=a[i].link; sum=0; while(s) { sum++; s=s->next; } printf("V%d的度为: %d\n",i,sum); }/*各顶点的度*/ } intvisited1[max]={0};/*定义布尔向量visited1为全程量*/ voiddfs1(graph*G,inti)/*从Vi+1出发深度优先搜索图G,G用邻接矩阵表示*/ { intj; printf("node: %c\n",G->vexs[i]);/*访问出发点Vi+1*/ visited1[i]=1;/*标记Vi+1已被访问*/ for(j=0;j if((G->arcs[i][j])&&(! visited1[j])) dfs1(G,j);/*若Vi+1的邻接点Vi+1未曾访问过,则从Vi+1出发进行深度优先搜索*/ } #definemaxsize80 typedefintdatatype; typedefstruct { datatypedata[maxsize]; intfront,rear; }sequeue;/*顺序队列的类型*/ sequeue*p;/*p是顺序队列类型的指针*/ voidsetnull()/*置队列p为空对*/ { p->front=maxsize-1; p->rear=maxsize-1; } intempty()/*判别p是否为空*/ { if(p->front==p->rear) return1; elsereturn0; } intfront()/*取p的队头元素*/ { if(empty()) { printf("thesequeueisempty"); return0; } elsereturnp->data[(p->front+1)%maxsize]; } intenqueue(intx)/*将新元素x插入队列p的队尾*/ { if((p->rear+1)%maxsize==p->front) { printf("thequeueisfull."); return0; } else { p->rear=(p->rear+1)%maxsize; p->data[p->rear]=x; returnx; } } intdequeue()/*删除队列p的头元素,并返回该元素*/ { if(empty()) { printf("thesequeueisempty"); return0; } else{ p->front=(p->front+1)%maxsize; return(p->data[p->front]); } } intvisited2[max]={0}; voidbfs1(graph*G,intk)/*从Vi+1出发广度优先搜索图G,G用邻接矩阵表示*/ { inti,j; setnull(); printf("node: %c\n",G->vexs[k]);/*访问出发点Vk+1*/ visited2[k]=1; enqueue(k); while(! empty())/*队非空时执行*/ { i=dequeue(); for(j=0;j if((G->arcs[i][j])&&(! visited2[j])) { printf("%c\n",G->vexs[j]);/*访问Vi+1的未曾访问的邻接点Vj+1*/ visited2[j]=1; enqueue(j);/*访问过的顶点入队*/ } } } intvisited3[n]={0}; voiddfs2(inti)/*从Vi+1出发深度优先遍历搜索图a,a图用邻接表表示*/ { enode*p; printf("node: %c\n",a[i].vertex); visited3[i]=1; p=a[i].link;/*取Vi+1的边表头指针*/ while(p! =NULL)/*依次搜索Vi+1的邻接点*/ { if(! visited3[p->adjvex]) dfs2(p->adjvex);/*从Vi+1的未曾访问过的邻接点出发进行深度优先搜索*/ p=p->next;/*找Vi+1下一个邻接点*/ } } intvisited4[n]={0}; voidbfs2(intk)/*从Vi+1出发广度优先搜索图a,a用邻接表表示*/ { inti; enode*p; setnull(); printf("node: %c\n",a[k].vertex); visited4[k]=1; enqueue(k); while(! empty()) { i=dequeue(); p=a[i].link;/*取Vi+1的边表头指针*/ while(p! =NULL)/*依次搜索Vi+1的邻接点*/ { if(! visited4[p->adjvex])/*访问Vi+1的未曾访问的邻接点*/ { printf("node: %c\n",a[p->adjvex].vertex); visited4[p->adjvex]=1; enqueue(p->adjvex);/*访问过的顶点入队*/ } p=p->next;/*找Vi+1的下一个邻接点*/ } } } voidmain() { inti,j,x,y,z,s,t; grapha; intflag=0; p=(sequeue*)malloc(sizeof(sequeue)); printf("=============欢迎进入=============\n"); while (1) { printf("请选择输入\n1为用邻接矩阵存储图\n2为用邻接表存储图\n0为退出: \n"); scanf("%d",&x); switch(x) { case1: creatgraph(&a); while(flag==0) { printf("请选择输入\n1为邻接矩阵深度优先遍历\n2为邻接矩阵广度优先遍历\n0为返回继续选择图的存储: \n"); scanf("%d",&y); switch(y) { case1: printf("请输入深度优先遍历的顶点: \n"); scanf("%d",&i); dfs1(&a,i);break; case2: printf("请输入广度优先遍历的顶点: \n"); scanf("%d",&j); bfs1(&a,j);break; case0: flag=1; } }break; case2: creatlist(); while(flag==0) { printf("请选择输入\n1为邻接表深度优先遍历\n2为邻接表广度优先遍历\n0为返回继续选择图的存储: \n: "); scanf("%d",&z); switch(z) { case1: printf("请输入深度优先遍历的顶点: \n"); scanf("%d",&s); dfs2(s);break; case2: printf("请输入广度优先遍历的顶点: \n"); scanf("%d",&t); bfs2(t);break; case0: flag=1; } }break; case0: exit(0); } } } 5、结果分析 当我们选择从键盘上输入1时,程序执行的是用邻接矩阵存储图,相应的我们要从键盘了输入顶点个数及边的个数,如4,5。 再读入顶点信息,如0123。 根据提示信息再从键盘上输入相邻接的两边的顶点信息,如0,1;0,2;0,3;1,2;1,3。 这样便可以得到所存储的邻接矩阵了,同时也输出了各个顶点的度。 ①选择深度优先 ②选择广度优选
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 基本 操作 英才