中南大学数据结构课程设计.docx
- 文档编号:23879902
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:40
- 大小:228.65KB
中南大学数据结构课程设计.docx
《中南大学数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《中南大学数据结构课程设计.docx(40页珍藏版)》请在冰豆网上搜索。
中南大学数据结构课程设计
数据结构课程设计
学院:
信息科学与工程学院
专业班级:
指导老师:
学号:
姓名:
校园导游咨询系统
1.1.题目与要求
1)自己画一张简易的校园平面图,有三个校区和三所附属医院,在这些校区和医院内选10个以上的建筑物、办公室、宿舍等地名。
以图中顶点表示校园内各地名,存放地名名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息。
2)为来访客人提供图中任意地名相关信息的查询。
3)为来访客人提供任意地名的问路查询,即查询任意两个地名之间的一条最短路径。
实现提示:
一般情况下,校园的道路是双向通行的,可设计校园平面图是一个无向网。
顶点和边均含有相关信息。
1.2.设计与实现
基本思路
校园导游拓扑图是由景点和景点之间的路径组成的,所以这完全可以用数据结构中的图来模拟。
用图的结点代表景点,用图的边代表景点之间的路径。
所以首先应设计一个图类。
结点值代表景点信息,边的权值代表景点间的距离。
结点值及边的权值用顺序表存储,所以需要设计一个顺序表类。
本系统需要查询景点信息和求一个景点到另一个景点的最短路径长度及路线,为方便操作,所以给每个景点一个代码,用结构体类型实现。
计算路径长度和最短路线时可用弗洛伊德(Floyd)算法实现。
最后用switch选择语句选择执行浏览景点信息或查询最短路径。
主要数据结构
链接矩阵,相关代码
typedefstructarc
{
intadj;//路径长度
}arc,adjmatrix[40][40];//建一个结构体数组保存路径长度
typedefstructscenery//存储景点信息
{
intnum;//景点编号
charname[20];//景点名称
charintroduction[200];//景点介绍
}scenery;
typedefstructgraph
{
sceneryvexs[40];//点
adjmatrixarcs;//边
intvexnum,arcnum;//点与边的个数
}graph;
graphb;
程序的算法和主要流程
用弗洛伊德算法实现最短路径:
voidfloyd(graph*G)//求有向网G中各对顶点v和w之间的最短路径p[v][w]
{intv,u,i,w,k,j,flag=1,//及其带权长度D[v][w],若p[v][w][u]为TRUE
p[10][10][10],D[10][10];//则u是从v到w当前求得最短路径上的点
for(v=0;v
for(w=0;w
{
D[v][w]=G->arcs[v][w].adj;//初始路径赋值
for(u=0;u
p[v][w][u]=0;
if(D[v][w]<9999)//从v到w有直接路径
{
p[v][w][v]=1;
p[v][w][w]=1;
}
}
for(u=0;u
for(v=0;v
for(w=0;w
if(D[v][u]+D[u][w] { D[v][w]=D[v][u]+D[u][w]; for(i=0;i p[v][w][i]=p[v][u][i]||p[u][w][i]; } 主要流程: intmain() { b=initgraph();//初始化 while (1) { Menu();//界面 intchoice;//选择功能 cin>>choice; switch(choice) { case1: 查看校园景点 showall(&b); system("pause"); system("cls"); break; case2: 查看景点信息 showselect(&b); system("pause"); system("cls"); break; case3: 查找最短旅游路线 floyd(&b); system("pause"); system("cls"); break; case4: 退出系统 exit (1); break; default: cout<<"请在1-4中选择操作! "< system("pause"); system("cls"); break; } } return0; } 程序实现过程中的主要难点和解决方法 程序设计的主要难点就是在对结构体的设计和弗洛伊德算法的具体实现上,通过查询数据结构的书及相关算法书,我了解到弗洛伊德算法主要运用了动态规划的相关思想,通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 从图的带权邻接矩阵A=[a(i,j)]n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D (1);又用同样地公式由D (1)构造出D (2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。 矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。 1.3.实验结果及分析 实验的准备 图1.3.1校园结构拓扑图 首先我们序设计校园导游拓扑结构图,将相关数据存入相应数据结构中,然后设计实现相关功能的方法。 实验数据如下: strcpy(G.vexs[0].name,"升华公寓"); strcpy(G.vexs[0].introduction,"学生宿舍,位于中南大学南校区。 "); strcpy(G.vexs[1].name,"二食堂"); strcpy(G.vexs[1].introduction,"学生食堂,南校区最大的食堂,四层楼。 "); strcpy(G.vexs[2].name,"七食堂"); strcpy(G.vexs[2].introduction,"学生食堂,位于中南大学南校区。 "); strcpy(G.vexs[3].name,"八食堂"); strcpy(G.vexs[3].introduction,"学生食堂,位于中南大学南校区。 "); strcpy(G.vexs[4].name,"校医院"); strcpy(G.vexs[4].introduction,"校内医院,位于中南大学南校区。 "); strcpy(G.vexs[5].name,"春之岛"); strcpy(G.vexs[5].introduction,"校园超市,产品种类齐全,位于中南大学南校区。 "); strcpy(G.vexs[6].name,"图书馆"); strcpy(G.vexs[6].introduction,"学生自习的好去处,位于中南大学新校区。 "); strcpy(G.vexs[7].name,"建艺院"); strcpy(G.vexs[7].introduction,"建艺院,位于中南大学新校区。 "); strcpy(G.vexs[8].name,"外语院"); strcpy(G.vexs[8].introduction,"外语院,位于中南大学新校区。 "); strcpy(G.vexs[9].name,"教学楼"); strcpy(G.vexs[9].introduction,"学生上课场所,位于中南大学新校区。 "); for(i=0;i for(j=0;j G.arcs[i][j].adj=9999;//初始化,9999为不存在路径 G.arcs[0][1].adj=100; G.arcs[0][3].adj=200; G.arcs[1][2].adj=1100; G.arcs[2][5].adj=1000; G.arcs[4][5].adj=900; G.arcs[3][4].adj=300; G.arcs[4][7].adj=400; G.arcs[6][7].adj=500; G.arcs[6][9].adj=600; G.arcs[7][8].adj=800; G.arcs[8][9].adj=700; 采用这种链接矩阵的结构能够使用floyd算法对后面的最短路径这一功能进行具体实现。 实验结果及分析 将最短路径计算结果与我们之前所设计的校园拓扑图的最短路径进行比较,验证了实验结果的正确性。 1.4.总结 本实验采用链接矩阵来进行数据的存储,将路径的权值保存在矩阵中,通过弗洛伊德算法计算两点之间的最短路径。 实验代码能够实现为来访客人提供图中任意地名相关信息的查询。 以及为来访客人提供任意地名的问路查询,即查询任意两个地名之间的一条最短路径。 实验代码并没有实现对地图的增删等功能,如果要实现该功能,我们需要将链接矩阵改为链接表的形式进行存储。 这个会在后面进行进一步的学习。 在实验过程中我进一步了解了数据结构中有关图的存储,并熟悉了c++的一些使用方法,感到本次实验收益匪浅。 简单的职工管理系统 2.1.题目与要求 对单位的职工进行管理,包括插入、删除、查找、排序等功能。 系统要求 职工对象包括姓名、性别、出生年月、学历、电话这几种属性。 (1)新增一名职工: 将新增职工对象按姓名以字典方式存储。 (2)删除一名职工: 从职工信息中删除一名职工对象。 (3)查询: 从职工信息中查询符合某些条件的职工。 (4)修改: 检索某个职工对象,对其某些属性进行修改。 (5)排序: 按某种需要对职工信息进行排序。 实现提示 (1)对职工对象中的"姓名"按字典顺序进行排序。 (2)对排序后的职工对象进行增、删、查询、修改、排序等操作。 2.2.设计与实现 基本思路 该系统利用线性链表实现,首先建一个结构体类型,里面用来存放职工相关信息,用链表将所有数据关联起来。 从而实现对相应对象的插入、删除、查找、排序等功能。 主要数据结构 链表: structEmployee {//声明职工的结构作为链表节点。 intcode; stringname; stringsex; intbirth; stringedu; intphone; structEmployee*next; }; typedefstructEmployeeNode;//别名 typedefNode*Link;//指针型别名 程序的算法和主要流程 冒泡排序算法: Linksort(LinkHead) { Linkp,q; Node*temp; temp=newNode; temp->name=""; temp->code=0; temp->birth=0; temp->sex=""; temp->edu=""; temp->phone=0; temp->next=NULL; for(p=Head;p->next! =NULL;p=p->next) { for(q=Head->next;q->next! =NULL;q=q->next) { if(q->name>q->next->name) { temp->name=q->name; q->name=q->next->name; q->next->name=temp->name; } } 主要流程: intmain() { LinkHead=0; Head=Create(Head);//创建一个空头节点 intmenu; while (1) { cout< "; cin>>menu; switch(menu) { case0: 退出系统 cout<<"成功退出系统! "< return0; case1: 增加员工信息 Head=add(Head); break; case2: 删除员工信息 Head=del(Head); break; case3: 员工信息查询 search(Head); break; case4: 员工信息修改 modify(Head); break; case5: 信息总表 display_list(Head); break; default: cout<<"请选择正确的菜单项进行操作。 多谢合作! "< } } Release(Head); return0; } 程序实现过程中的主要难点和解决方法 由于采用的是线性链表,线性表中的数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素外,其他元素都是首尾相连的。 当结点删除时,需要找到所删元素的前一个结点,用p->next=p->next->next来实现对数据的删除。 我们新建两个结点来完成对数据的删除,使ptr_1始终在ptr_2的前面。 Linksearch(LinkHead)//返回符合姓名条件的职工信息 { Linkptr_1; Linkptr_2; stringname; ptr_1=Head->next; ptr_2=Head; while(ptr_1) { if(ptr_1->name==name) { display_node(ptr_1);//打印满足条件节点 re(); returnptr_2; } else { ptr_1=ptr_1->next;//查询下一节点 ptr_2=ptr_2->next; } } Linkdel(LinkHead)//删除职工记录 { Linkptr; Linkptr_2; ptr_2=search(Head); ptr=ptr_2->next; cout< if(ptr) { ptr_2->next=ptr->next; free(ptr); } else{ cout<<"没找到此职工的记录,无法删除。 "< } returnHead; } 2.3实验结果及分析 实验的准备 图2.3.1职工管理系统模块图 首先将职工系统的实现框架图列出,建立起相应的数据结构,利用注册职工这一模块将职工信息输入,进而实现后续模块功能。 实验结果及分析 在修改界面还有一些不足,比如输入数据过长会造成数据的溢出,进而影响输出。 2.4总结 本次实验实现了对单位的职工进行管理,包括插入、删除、查找、排序等功能。 最大的收获是熟悉了对链表的使用方式和vc6.0的debug功能,在这个过程中我发现了调试对程序的重要性。 在调试查询修改功能过程中,查询的总是不正确,查询的结果显示,没有找到职工信息,最后发现查找的结点不正确,查询应该与输入的值和头结点next比较,而不是头结点。 还有就是查询结点不知道如何循环,最后又看看了记得笔记和书,才知道如何继续查找而不出错误。 还有就是你新建一个链表要对它进行初始化,若没有初始化,系统不会为它分配空间,从而造成种种错误。 排序时注意交换的先后顺序就可以了,删除时注意交换结点的顺序。 本次课程设计是围绕数据结构进行。 根据问题描述可知,需要解决问题并不复杂,整个问题只需要实现一个职工管理系统功能,那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改以及保存。 但是,为了实现该功能,却需要优秀的算法和数据结构以保证实现的时间和空间效率。 把职工信息存储在一个单链表中,利用指针实现对职工信息的各项基本操作。 虽然设计的程序完成了题目描述所需要实现的功能,但是仍然存在不如人意的地方。 那就是可以排序上面多设计几个算法。 实现多角度排序。 在这个系统中没有职工序号的信息,所以允许职工姓名相同,在很大程度上面,可能使得职工信息重复。 另外删除时也只能一个个的删,这些都是还需改进的地方。 经过这次数据结构课程设计,我们及时巩固的了数据结构、算法,另外还懂得了一个好的数据结构的重要性。 它能够帮我们减少代码量并使程序的性能更加优良。 附件: 校园导游系统代码 #include #include #include usingnamespacestd; typedefstructarc { intadj;//路径长度 }arc,adjmatrix[40][40];//建一个结构体数组保存路径长度 typedefstructscenery//存储景点信息 { intnum;//景点编号 charname[20];//景点名称 charintroduction[200];//景点介绍 }scenery; typedefstructgraph { sceneryvexs[40];//点 adjmatrixarcs;//边 intvexnum,arcnum;//点与边的个数 }graph; graphb; graphinitgraph(void)//初始化 { graphG; inti,j; G.vexnum=10; G.arcnum=11; for(i=0;i G.vexs[i].num=i;//编号 strcpy(G.vexs[0].name,"升华公寓"); strcpy(G.vexs[0].introduction,"学生宿舍,位于中南大学南校区。 "); strcpy(G.vexs[1].name,"二食堂"); strcpy(G.vexs[1].introduction,"学生食堂,南校区最大的食堂,四层楼。 "); strcpy(G.vexs[2].name,"七食堂"); strcpy(G.vexs[2].introduction,"学生食堂,位于中南大学南校区。 "); strcpy(G.vexs[3].name,"八食堂"); strcpy(G.vexs[3].introduction,"学生食堂,位于中南大学南校区。 "); strcpy(G.vexs[4].name,"校医院"); strcpy(G.vexs[4].introduction,"校内医院,位于中南大学南校区。 "); strcpy(G.vexs[5].name,"春之岛"); strcpy(G.vexs[5].introduction,"校园超市,产品种类齐全,位于中南大学南校区。 "); strcpy(G.vexs[6].name,"图书馆"); strcpy(G.vexs[6].introduction,"学生自习的好去处,位于中南大学新校区。 "); strcpy(G.vexs[7].name,"建艺院"); strcpy(G.vexs[7].introduction,"建艺院,位于中南大学新校区。 "); strcpy(G.vexs[8].name,"外语院"); strcpy(G.vexs[8].introduction,"外语院,位于中南大学新校区。 "); strcpy(G.vexs[9].name,"教学楼"); strcpy(G.vexs[9].introduction,"学生上课场所,位于中南大学新校区。 "); for(i=0;i for(j=0;j G.arcs[i][j].adj=9999;//初始化,9999为不存在路径 G.arcs[0][1].adj=100; G.arcs[0][3].adj=200; G.arcs[1][2].adj=1100; G.arcs[2][5].adj=1000; G.arcs[4][5].adj=900; G.arcs[3][4].adj=300; G.arcs[4][7].adj=400; G.arcs[6][7].adj=500; G.arcs[6][9].adj=600; G.arcs[7][8].adj=800; G.arcs[8][9].adj=700; for(i=0;i for(j=0;j G.arcs[j][i].adj=G.arcs[i][j].adj;//无向图不分方向 returnG; } voidshowall(graph*a) { inti; for(i=0;i<10;i++) cout< } voidshowselect(graph*a)//查询特定景点信息 { inti; cout<<"请输入所要查询景点编号: "; cin>>i; cout<<"景点信息: "< cout< } voidfloyd(graph*G)//求有向网G中各对顶点v和w之间的最短路径p[v][w] {intv,u,i,w,k,j,flag=1,//及其带权长度D[v][w],若p[v][w][u]为TRUE p[10][10][10],D[10][10];//则u是从v到w当前求得最短路径上的点 for(v=0;v for(w=0;w { D[v][w]=G->arcs[v][w].adj;//初始路径赋值 for(u=0;u p[v][w][u]=0; if(D[v][w]<9999)//从v到w有直接路径 { p[v][w][v]=1; p[v][w][w]=1; } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中南 大学 数据结构 课程设计