数据结构课程设计报告.docx
- 文档编号:22828645
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:18
- 大小:92.42KB
数据结构课程设计报告.docx
《数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告
题目:
一、图子系统二、查找子系统1
一、课程设计的目的1
二、课程设计的内容和要求2
三、题目一设计过程2
四、题目二设计过程8
五、设计总结16
六、参考文献16
题目:
一、图子系统二、查找子系统
一、课程设计的目的
本学期我们对《数据结构》这门课程进行了学习。
这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。
这次课程设计不但要求学生掌握《数据结构》中的各方面知识,还要求学生具备一定的C语言基础和编程能力。
(1)题目一的目的:
1、掌握土邻接表的存储方法
2、掌握图深度优先遍历的基本思想
3、掌握图广表度优先遍历的基本思想
(2)题目二的目的:
1、理解查找的基本算法
2、掌握静态查找和动态查找的区别
3、掌握顺序查找和二叉排序树的基本思想及其算法
二、课程设计的内容和要求
(1)题目一的内容和要求:
1、对任意给定的图(顶点数和边数自定),建立它的邻接表并输出。
2、编写图的深度优先遍历程序。
3、利用队列的基本运算实现广度优先遍历。
(2)题目二的内容和要求:
1、设计一个选择式菜单。
查找子系统
*1……….顺序查找*
*2……….二叉排序树*
*3……….返回*
*******************************************************************
请选择菜单号(0……2)
2、分别实现顺序查找和二叉排序树。
3、二叉排序树必须实现构建、查找、插入的基本操作。
三、题目一设计过程
1、题目分析
对图的每个顶点建立一个带头结点的线性链表,用于存储图中于顶点相邻接的边或弧的信息。
头结点中存放该结点的信息。
所有头结点用一个顺序表存放,对图进行深度优先遍历和广度优先遍历。
2、算法描述
voidCreateUDN(Graph&G)\\任意建立一个图
voidDFS(GraphG,intk)\\从图的某一点k出发,进行深度优先遍历算法
voidBFS(GraphG,intk)\\从图的某一点k出发,进行广度优先遍历算法
3、源代码
#include
#include
#defineINFINITY32767
#defineMAX_VEX20
#defineQUEUE_SIZE(MAX_VEX+1)
usingnamespacestd;
bool*visited;
typedefstruct{
char*vexs;
intarcs[MAX_VEX][MAX_VEX];
intvexnum,arcnum;
}Graph;
classQueue{
public:
voidInitQueue(){
base=(int*)malloc(QUEUE_SIZE*sizeof(int));
front=rear=0;
}
voidEnQueue(inte){
base[rear]=e;
rear=(rear+1)%QUEUE_SIZE;
}
voidDeQueue(int&e){
e=base[front];
front=(front+1)%QUEUE_SIZE;
}
public:
int*base;
intfront;
intrear;
};
intLocate(GraphG,charc){
for(inti=0;i if(G.vexs[i]==c)returni; return-1; } voidCreateUDN(Graph&G){ inti,j,w,s1,s2; chara,b,temp; printf("输入顶点数和弧数: "); scanf("%d%d",&G.vexnum,&G.arcnum); temp=getchar(); G.vexs=(char*)malloc(G.vexnum*sizeof(char)); printf("输入%d个顶点.\n",G.vexnum); for(i=0;i printf("输入顶点%d: ",i); scanf("%c",&G.vexs[i]); temp=getchar(); } for(i=0;i for(j=0;j G.arcs[i][j]=INFINITY; printf("输入%d条弧.\n",G.arcnum); for(i=0;i printf("输入弧%d: ",i); scanf("%c%c%d",&a,&b,&w); temp=getchar(); s1=Locate(G,a); s2=Locate(G,b); G.arcs[s1][s2]=G.arcs[s2][s1]=w; } } intFirstVex(GraphG,intk){ if(k>=0&&k for(inti=0;i if(G.arcs[k][i]! =INFINITY)returni; } return-1; } intNextVex(GraphG,inti,intj){ if(i>=0&&i for(intk=j+1;k if(G.arcs[i][k]! =INFINITY)returnk; } return-1; } voidDFS(GraphG,intk){ inti; if(k==-1){ for(i=0;i if(! visited[i])DFS(G,i); } else{ visited[k]=true; printf("%c",G.vexs[k]); for(i=FirstVex(G,k);i>=0;i=NextVex(G,k,i)) if(! visited[i])DFS(G,i); } } voidBFS(GraphG){ intk; QueueQ; Q.InitQueue(); for(inti=0;i if(! visited[i]){ visited[i]=true; printf("%c",G.vexs[i]); Q.EnQueue(i); while(Q.front! =Q.rear){ Q.DeQueue(k); for(intw=FirstVex(G,k);w>=0;w=NextVex(G,k,w)) if(! visited[w]){ visited[w]=true; printf("%c",G.vexs[w]); Q.EnQueue(w); } } } } voidmain(){ inti; GraphG; CreateUDN(G); visited=(bool*)malloc(G.vexnum*sizeof(bool)); printf("\n广度优先遍历: "); for(i=0;i visited[i]=false; DFS(G,-1); printf("\n深度优先遍历: "); for(i=0;i visited[i]=false; BFS(G); printf("\n程序结束.\n"); } 4、运行结果 通过输入图的顶点数、弧数可以得到图的深度优先遍历序列和广度优先遍历序列,如下图所示。 四、题目二设计过程 1、题目分析 顺序查找是从线性表的一端开始,顺序扫描线性表,依次将扫描到的关键字于给定值x相比较,若相等则查找成功;若扫描结束后,仍未找到与关键字x相等的结点,则查找失败。 对于二叉排序树,从根结点出发,当访问树中某个结点时,如果访问的关键字值等于给定的关键字值就访问成功。 反之,如果关键字值大或小于已给定的关键字值则考虑查找左或右子树。 2、算法描述 voidSequenceSearch()\\顺序查找 BSTreeCreateBST(void)\\建立二叉树 voidInsBST(BSTree*T,KeyTypeKey)\\在二叉树中插入数据 voidBSTSearch()\\查询二叉树数据 3、源代码 #include #include #include #defineLENGTH20 #defineN10 voidSequenceSearch() {inta[N],i,x,y; printf("\n\t\t建立一个整数的顺序表(回车间隔,-1结束): \n"); for(i=0;i { printf("\t\t"); scanf("%d",&a[i]); if(a[i]==-1) {y=i;break;} } printf("开始使用顺序查询: \n请输入你想要查找的数据: \n"); scanf("%d",&x); getchar(); i=y-1; while(i>=0&&a[i]! =x) i--; if(i==-1) printf("未能查找到数据%d.\n"); else printf("经过%d次查找,查找到数据%d.\n",i+1,x); return; } typedefintKeyType; typedefstructnode { KeyTypeKey; structnode*lchild,*rchild; }BSTNode; typedefBSTNode*BSTree; BSTreeCreateBST(void); voidSearchBST(BSTreeT,KeyTypeKey); voidInsBST(BSTree*Tptr,KeyTypeKey); voidBSTSearch() { BSTreeT; charch1,ch2; KeyTypeKey; printf("建立一棵二叉树: \n"); T=CreateBST(); ch1='y'; getchar(); while(ch1=='y'||ch2=='Y') { printf("\n"); printf("\n\t\t*****************************************"); printf("\n\t\t*1------------更新二叉排序树--------*"); printf("\n\t\t*2------------查找结点--------------*"); printf("\n\t\t*3------------插入结点--------------*"); printf("\n\t\t*0------------返回------------------*"); printf("\n\t\t*****************************************\n\t\t"); scanf("%c",&ch2); getchar(); switch(ch2) { case'1': T=CreateBST();break; case'2': printf("\n\t\t请输入要查找的数据: "); scanf("%d",&Key); getchar(); SearchBST(T,Key);break; case'3': printf("\n\t\t请输入要插入的数据: "); scanf("%d",&Key); getchar(); InsBST(&T,Key);break; case'0': ch2='n';return; default: printf("输入错误,请重新输入! \n"); } } } BSTreeCreateBST(void) { BSTreeT; KeyTypeKey; T=NULL; printf("\n\t\t请输入一个关键字(输入0时结束): "); scanf("%d",&Key); while(Key) { InsBST(&T,Key); printf("\n\t\t请输入一个关键字(输入0时结束): "); scanf("%d",&Key); } returnT; } voidSearchBST(BSTreeT,KeyTypeKey) { BSTNode*p=T; while(p) {if(p->Key==Key) {printf("\n\t\t已经找到你输入的数据."); return; } p=(Key p->lchild: p->rchild; } printf("\n\t\t没有找到你输入的数据."); } voidInsBST(BSTree*T,KeyTypeKey) { BSTNode*f,*p; p=(*T); while(p) { if(p->Key==Key) { printf("\n\t\t树中已有%d,不需插入.\n",Key); return; } f=p; p=(Key p->lchild: p->rchild; } p=newBSTNode; p->Key=Key; p->lchild=p->rchild=NULL; if((*T)==NULL) (*T)=p; else if(Key f->lchild=p; else f->rchild=p; } main() { intchoise; charch='y'; while(ch=='y'||ch=='Y') { printf("\n\t\t*****************************************"); printf("\n\t\t*1------------顺序查找------------------*"); printf("\n\t\t*2------------二叉排序树----------------*"); printf("\n\t\t*0------------返回----------------------*"); printf("\n\t\t*****************************************\n\t\t"); scanf("%d",&choise); switch(choise) { case1: SequenceSearch();break; case2: BSTSearch();break; case0: ch='n';break; default: printf("输入错误,请重新输入! \n"); } } } 4、运行结果 五、设计总结 开始的时候总是很头疼,为了这次的课程设计,我泡了很多天的图书馆和机房,查阅了大量的资料书籍,并对数据结构课本知识点进行了系统的复习,巩固了基础,但是还是遇到了一些困难。 直到最后快要答辩的时候彻底的吧程序搞懂了,往往都是这样当工作快接近尾声的时候才有一种焕然一新的感觉! 六、参考文献 1.杨路明.C语言程序设计教程.北京邮电大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告