数据结构图实验报告.docx
- 文档编号:30574413
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:12
- 大小:70.10KB
数据结构图实验报告.docx
《数据结构图实验报告.docx》由会员分享,可在线阅读,更多相关《数据结构图实验报告.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构图实验报告
数据结构实验报告(实验三)
实验人:
颜建学
班级:
4101090703
实验时间:
实验学时:
4
实验地点:
260
实验题目:
图
二、实验目的:
1.掌握图的逻辑结构和存储结构
2.掌握图的深度优先和广度优先遍历及最小生产树等基本算法。
三、实验内容:
1.将用户从键盘输入的图(顶点和边集)以邻接表形式存入计算机。
对该图进行深度优先遍历和广度优先遍历,输出遍历序列。
2.(选做)将用户从键盘输入的连同网(顶点和边集)以邻矩阵形式存入计算机。
求该网的最小生成树,输出该树各边。
四、实验用到数据结构:
逻辑结构:
链表
存储结构:
邻接矩阵
结构定义,功能函数声明如下:
#include
#include
#definek100
intvisited[k]={0},visitedd[k]={0};
typedefstructnode{intadjvex;
structnode*next;
}node;
typedefstruct{chara;
node*first;
}list;
typedefstruct{listvextes[k];
intn,e;
}adjgraph;
voidcreat(adjgraph*g);
voidprint(adjgraphg);
voidvisit1(adjgraphg,inti);/*深度优先*/
voiddfs(adjgraphg);
voidvisit2(adjgraphg,inti);/*广度优先*/
voidbfs(adjgraphg);
五、具体实现
#ifndefQUE_123
#defineQUE_123
#ifndefMYGRAPH123
#defineMYGRAPH123
#include
#include
#include
#defineMAX50
typedefcharelemtype;
typedefstructarcnode
{
intadjvex;
structarcnode*next;
}arcnode,*arclink;
typedefstructvnode
{
chardata;
structarcnode*fir;
}vonde,graph[MAX];
intcreate(graphg);
intlocal(graphg,intn,elemtypev2);
voidtra(graphg,intn,voidvisit(graphg,intv));
voidbfs(graphg,intv);
voiddfs(graphg,intv);
#endif
//定义链式队列
typedefintdatatype;//队中元素类型
typedefstructquenode
{
datatypedata;
structquenode*next;
}quenode,*quelink;
typedefstructheadnode
{
quelinkquehead,querear;
}headnode,*queue;
voidinitque(queue&q);
intentque(queue&q,datatype&e);
intoutque(queue&q,datatype&e);
#endif
intcreate(graphg)
{
intvexnum,adjnum;//这两个变量存放顶点个数和边的个数
intkind;//有向图而无向图标记
charch;
arclinkp,s;
printf("要建立无向图吗?
Y/N\n");
ch=getchar();
if(ch=='y'||ch=='Y')
kind=0;
else
kind=1;
printf("开始建立图\n");
printf("请输入该图的顶点个数\n");
scanf("%d",&vexnum);
printf("请输入该图的边的个数\n");
scanf("%d",&adjnum);
fflush(stdin);//清空输入缓冲
inti;
printf("请输入各个顶点数据(将顶点字母连续输入按回车结束)\n");
for(i=0;i { scanf("%c",&g[i].data); g[i].fir=NULL; } printf("输入边\n"); charv1,v2; intx1,x2;//输入顶点在g数组中的下标 for(i=0;i { printf("请输入第%d条边(直接输入边的两个顶点中间没有任何间隔)\n",i+1); fflush(stdin);//清空输入缓冲 scanf("%c%c",&v1,&v2); //确定该边两个顶点在g中的下标 x1=local(g,vexnum,v1); x2=local(g,vexnum,v2); while(x1>vexnum-1||x2>vexnum-1) { printf("输入边中的顶点不存在,请重新输入该边\n"); fflush(stdin); scanf("%c%c",&v1,&v2); x1=local(g,vexnum,v1); x2=local(g,vexnum,v2); } //插入节点 s=(arclink)malloc(sizeof(arclink)); if(! s)return-1; s->adjvex=x2; s->next=NULL; p=g[x1].fir; if(! p) g[x1].fir=s; else { while(p->next) p=p->next; p->next=s; } if(kind==0)//无向图 { s=(arclink)malloc(sizeof(arclink)); if(! s)return-1; s->adjvex=x1; s->next=NULL; p=g[x2].fir; if(! p) g[x2].fir=s; else { while(p->next) p=p->next; p->next=s; } } } returnvexnum; } intlocal(graphg,intn,elemtypev) { inti; for(i=0;i if(g[i].data==v)returni; returni; } intvisited[MAX]; voidtra(graphg,intn,voidvisit(graphg,intv)) { inti; for(i=0;i visited[i]=0; for(i=0;i if(visited[i]==0) visit(g,i); } voidbfs(graphg,intv)//广度优先遍历 { printf("%c",g[v].data); visited[v]=1; queueq; initque(q); entque(q,v); while(q->quehead! =q->querear) { intw; inta; outque(q,w); arclinkp; p=g[w].fir; while(p) { a=p->adjvex; if(! visited[a]) { printf("%c",g[a].data); visited[a]=1; entque(q,a); } p=p->next; } } } voiddfs(graphg,intv)//深度优先遍历 { intw; printf("%c",g[v].data); visited[v]=1; arclinkp; p=g[v].fir; while(p) { w=p->adjvex; if(! visited[w]&&w>=0) dfs(g,w); p=p->next; } } voidinitque(queue&q) { q=(queue)malloc(sizeof(headnode)); if(q) if(q->quehead=(quelink)malloc(sizeof(quenode))) q->querear=q->quehead; else exit(-1);//队列初始化失败 else exit(-1);//队列初始化失败 } intentque(queue&q,datatype&e) { quelinks; s=(quelink)malloc(sizeof(quenode)); if(s) { s->data=e; s->next=NULL; q->querear->next=s; q->querear=s; return1; } else return0; } intoutque(queue&q,datatype&e) { quelinks; if(q->quehead! =q->querear) { s=q->quehead->next; e=s->data; q->quehead->next=s->next; if(! s->next)//队中只有一个节点 q->querear=q->quehead; free(s); return1; } else return0; } intmain() { intn; graphg1;//g1为数组 n=create(g1); printf("深度优先: \n"); tra(g1,n,dfs); printf("\n"); printf("广度优先\n"); tra(g1,n,bfs); printf("\n"); return0; } 六、实验结果 七、实验心得: 通过本次实验,使我基本上掌握了图的概念、存储和遍历,经过编程实验巩固了二叉树的知识,让我清楚了如何用邻接链表对图进行存储,了解了两种遍历的用途。 在实验的过程中,总的来说还是比较顺利的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构图 实验 报告