数据结构课程设计实验报告
目录
1. 单位员工通讯录管理系统(线性表的应用)*********************
2. 停车场管理(栈和队列的应用)*******************************
3. 哈夫曼编码/译码系统(树应用)******************************
4. 教学计划编制问题(图的应用)*******************************
5. 药店的药品销售统计系统(排序应用**************************
6. 综合排序 (**)*******************************************
7. 迷宫求解***************************************************
8. 总结*******************************************************
9. 源代码*****************************************************
1
一. 单位员工通讯录管理系统(线性表的应用)
1.设计题目:单位员工通讯录管理系统(线性表的应用)
2.问题描述:
为某个单位建立一个员工通讯录管理系统,可以方便查询每一个员工的办公
室电话、手机号。其功能包括通讯录链表的建立、员工通讯信息的查询、修改、
插入与删除、以及整个通讯录表的输出。
3.需求分析:
随着社会的发展,越来越多的工厂建立。为了便于管理单位员工和方便员工
之间的交流,员工的各项信息的统计,查询和修改,删除等显得很重要。基于上
面的种种原因,在学习过数据结构课程和其他编程语言的基础上编成了一个单位
员工通讯录管理系统,便于单位对员工的管理和员工间的交流。
4.算法设计:
本程序使用的数据结构中的线性表中的知识,在 C 语言的基础上编的。
首先,应该建立一个单链表,链表的节点信息表存的有单位员工的编号,姓名,手机号码和
办公室电话,然后我们就可以添加员工的各项信息了。在建立好员工信息的表后我们还可以
进行员工信息的查询操作,在进行查询时我们首先要信息删除操作,此操作首先要找到要删
除的员工信息,然后将此节点的前一节点的后续指针直接指向要删除的结点的后续指针,并
且释放要删除的结点空间即可。员工信息修改,首先找到要修改的员工,然后输入要修改的
员工信息,将输入信息直接覆盖在原有信息上即可。员工信息输出,遍历整个链表并输出。
初始化函数:LinkList Creat()
查找函数:void Search(staff *l)
删除函数:void Delete(staff *l)
修改函数:void Change(staff *l)
利用头插法插入函数 void Insert(staff *l)
{
staff *p;
printf("**插入通讯录记录**\n");
p=(staff *)malloc(sizeof(staff));
printf("\n 请输入员工信息:\n");
printf("员工编号:");
scanf("%d",&p->num);
printf("员工姓名:");
scanf("%s",p->name);
printf("手机号码:");
scanf("%d",&p->phone);
printf("电话号码:");
scanf("%d",&p->call);
2
p->next=l->next;//头插法
l->next=p;
printf("****插入成功!***\n");
}
五.测试结果
测试数据:编号 姓名 手机 电话
01
02
03
苏
王
胡
12345
23456
34567
123
234
345
1.界面
2.新建通讯录
3
二、停车场管理(栈和队列的应用)
1.设计题目:停车场管理(栈和队列的应用)
2.问题描述
设停车场是一个可以停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进
出。汽车在停车场内按车辆到达时间的先后顺序,依次有北向南排列(大门在最
南端,最先到达的第一车停放在车场的最北端),若车场内已停满 n 辆车,那么
后来的车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即
可开入;每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费
用。试为停车场编制按上述要求进行管理的模拟程序。
3.需求分析:
由于现在车辆越来越多,基本上所有的公共场所都有停车场,便于人们的出
行。当车辆过多的时候,仅仅需要人工指挥是不可能的,所以就必须有更加完善
的停车管理系统来保障车辆的正常停放。因此开发出了这一个相对来说更完善的
管理系统。
4.算法思想和算法设计
本系统是在 C++语言的基础上,结合数据结构中的栈和队列的应用编程的。
以栈模拟停车场,以队列模拟车场外的便道。每一组输入数据包括三个数据项:
汽车“到达”或“离去”信息、汽车牌照号码以及到达或离去的时刻。对每一组
输入数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便
道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的
费用(在便道上停车不收费)。
首先定义栈的顺序存储结构和队列的链表结构同时定义栈顶指针 top 以及
栈底指针 base。然后初始化栈,同时定义在停车时停车时间 time 和所需费用
money 的关系。当车 A 进入的时候栈顶元素加 1,当车 B 进入的时候栈顶元素加
1,但是由于空间不足,当车 C 进入的时候则显示停车场已满,进入便道!同时
输入车辆的信息,只有当 A,B 两辆车中有一量出站的时候 C 方能进入。当便道上
的车辆进入的时候同时队列元素减 1.
5
停车实现函数:
void tingche(SqStack &S,LinkQueue &L)
{
int time1;char mingz[10];
if(S.top-S.base<4){
cout<<"请输入车辆信息"<
>mingz;
strcpy(S.top->name,mingz);
cout<<"所需的停车时间:";cin>>time1;
S.top->time=time1;
S.top->money=S.top->time*5;S.top++; }else
{
L.rear->next=new QNode;
cout<<"停车场已满,请进入通道等待。"<>mingz;
strcpy(L.rear->next->car,mingz);
L.rear=L.rear->next;L.rear->next=NULL;
}}
出车函数实现:
void chuche(SqStack &S,SqStack &q,LinkQueue &L)
{
char chu[10];q.base=q.top=q.stop;
cout<<"请输入出车的牌号:";cin>>chu;
S.top--;while(strcmp(S.top->name,chu))
*(q.top)=*(S.top);q.top++;S.top--;
{
}
cout<<"停车时间:"<time<money<q.top--;
while((q.top-q.base)>=0)
*(S.top)=*(q.top);S.top++;q.top--;
{
}
if(L.front->next!=NULL) {int time2;
cout<<"便道车辆向停车场转移;"<next->car<>time2;
strcpy(S.top->name,L.front->next->car);
S.top->time=time2;S.top->money=S.top->time*5;S.top++;
L.front->next=L.front->next->next;
}}
五.测试结果
测试数据:车牌号 A23 时间 5 车牌号 B56 时间 10
车牌号 T12 时间 10
7
三、哈夫曼编码/译码系统(树应用)
1.设计题目:哈夫曼编码/译码系统(树应用)
2.问题描述:
现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行
编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的
字符信息。
3.需求分析:
由于通讯信息的简洁性和保密性,就需要对传输的内容进行处理,然后到达
接受者的手中之后再进行必要的解码。哈弗曼编码译码系统就是这样一个处理并
翻译信息的系统。利用利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传
输效率,缩短信 息的传输时间,还有一定的保密性。
4.算法思想和算法设计
本程序是用最优二叉树即哈夫曼树来实现哈夫曼编码译码器的功能。假设每
种字符在电文中出现的次数为 Wi,编码长度为 Li,电文中有 n 种字符,则电文
编码总长度为(W1*L1)+(W2*L2)+…+(Wi*Li)。若将此对应到二叉树上,Wi 为叶
结点,Li 为根结点到叶结点的路径长度。那么,(W1*L1)+(W2*L2)+…+(Wi*Li)
恰好为二叉树上带权路径长度。
因此,设计电文总长最短的二进制前缀编码,就是以 n 种字符出现的频率作
权,构造一棵哈夫曼树,此构造过程称为哈夫曼编码
该系统将实现以下几大功能:从文件中读取字符串,建立哈夫曼树,哈弗曼
编码以及哈夫曼译码等。
从硬盘读取字符串的函数:
void Open(char s[])
{
char name[10];
FILE *fp;
int i=0;
printf("请输入要打开的文件名:");
gets(name);
if((fp=fopen(name,"rt"))==NULL)
{
}
printf("打开失败!\n");
exit(1);
8