数据结构C语言课程设计Word下载.docx
《数据结构C语言课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构C语言课程设计Word下载.docx(28页珍藏版)》请在冰豆网上搜索。
航班查询系统
2.1.1题目内容
飞机航班信息包括:
航班号、起点站、终点站、起飞时间、到达时间、机型以及票价,实例如下:
设计航班查询系统要求能对飞机航班信息进行增加、删除、排序和查找。
可按航班的航班号、起点站、终点站、起飞时间以及到达时间进行查询
2.1.2算法描述及实验步骤
算法描述
该航班查询系统采用线性链表存储。
开始,创建链表。
然后输出提示操作选项,由用户输入所选项序号。
执行选项。
当第一次操作结束后,提示是否继续进行操作,再有用户决定。
流程图
2.1.3调试过程及实验结果
(1)完成第一模块:
链表创建以及添加,编译时出现警告:
“warningC4091:
'
typedef'
:
ignoredonleftof'
structfly'
whennovariableisdeclared”,“typedef”时在结构体后面定义一个变量名,所以只需在结构体后面加一个变量名,或者是把结构体的“typedef”去掉。
运行,结果提示错误。
重新检查,发现调用的创建函数和添加函数位置放反了,修改错误,运行成功。
(2)完成其他模块。
在编写排序模块时,链表的排序不懂,通过网上查找,用冒泡法,通过调换链表节点的数据进行排序。
字符串操作
2.2.1题目内容
字符串采用数组存储,建立两个字符串String1和String2.输出两个字符串。
将字符串String2的头n个字符添加到String1的尾部,输出结果查找String3在串String1中的位置,若String3在String1中不存在,则插入String3在String1中的m位置上。
输出结果。
2.2.2算法描述及实验步骤
算法描述
开始,输入两个字符串,然后将string2复制到string1后面。
然后输string3,判断string3是否在string1内,若存在,输出找到;
若不存在,输入插入位置,然后将string3插入string1中,输出string1,结束。
流程图
2.2.3调试过程及实验结果
(1)拷贝string3到string1时,因为移动string1后面的字符,忘了加结束标志,结果输出乱码。
二叉树的运算2
2.3.1题目内容
任务:
请设计一个算法,把二叉树的叶子结点按从左到右的顺序连成一个单链表。
二叉树用二叉链存储,链接时用叶子结点的rchild域存放指针。
2.3.2算法描述及实验步骤
该题采用线性链表存储结构。
开始,创建二叉树,链表。
遍历整棵二叉树,查找叶子节点,当找到是,将叶子节点放入链表当中。
输出结果,结束。
流程图
2.3.3调试过程及实验结果
2.4二叉树运算1
2.4.1题目内容
任务:
求二叉树中指定两个结点共同的最近祖先。
2.4.2算法描述及实验步骤
开始,创建二叉树。
输入要查找的两个节点。
判断两个节点位于根节点的哪一侧,若位于两侧,这根节点为它们的最近共同祖先,否则用递归遍历继续判断,查找。
最后输出结果,结束。
2.4.3调试过程及实验结果
调试过程
这道题的核心的内容是找到要查找的两个节点,然后再找共同祖先,所以我采用的一下方法:
创建的树是事先排好序的,大于根节点的放在右边,小于根节点的放左边,相等输不进去。
所以,通过判断查找的节点位于根节点的那一边,然后往那边查找。
当两节点位于上一节点两侧时,则上一节点为最近共同祖先。
运行结果:
三.课程设计分析与总结
1、这次课程设计为我们提供了一次实践机会,让我们用所学知识有所运用。
2、在这次课程设计上,巩固了以前所学,并且查缺补漏;
通过这次课程设计,有学习了许多新知识。
四.源程序清单
2.1航班查询系统
#include<
stdio.h>
stdlib.h>
string.h>
#defineERROR1
#defineOK0
typedefintStatus;
//给int一个别名Status
typedefstructfly//定义结构体
{
charFlynum[6];
charstar[10];
charreach[10];
charstartime[6];
charreachtime[10];
charType[10];
intprice;
};
typedefstructnode//定义航班信息链表的机构体
structflydata;
//数据域
structnode*next;
//指针域
}Node,*Link;
voidCreateList(Link&
L)
{
L=(Link)malloc(sizeof(Node));
L->
next=NULL;
//先建立一个带头结点的空链表
}
StatusListInsert(Link&
L)//增加航班信息
Linkp,s,r;
s=L->
next;
r=L;
p=(Link)malloc(sizeof(Node));
//生成新节点
if(!
p)
{
printf("
\n空间分配失败"
);
returnERROR;
}
printf("
\n请输入航班信息"
scanf("
%s%s%s%s%s%s%d"
&
p->
data.Flynum,&
data.star,&
data.reach,&
data.startime,&
data.reachtime,&
data.Type,&
data.price);
while(s!
=NULL)//判断该航班是否已经安排了
if(strcmp(p->
data.Flynum,s->
data.Flynum)==0)
{
printf("
\n该航班已经重复"
returnERROR;
}
s=s->
while(r->
next!
=NULL)//添加航班
{
r=r->
}
p->
next=r->
r->
next=p;
returnOK;
}
StatusDelete(Link&
L)//删除航班信息
Linkp,q;
charnum[10];
\n请输入要删除的航班号:
"
%s"
num);
q=L;
p=L->
while(p->
=NULL)
if(strcmp(num,p->
break;
q=q->
p=p->
q->
next=p->
free(p);
voidSuch_num(LinkL)//按航班号查询
Linkp;
\n请输入要查找的航班号"
while(p!
%s"
p->
data.Flynum);
data.star);
data.reach);
data.startime);
data.reachtime);
data.Type);
%d"
voidSuch_Star(LinkL)//按起飞地点查询
\n请输入起飞地点:
data.star)==0)
voidSuch_Reach(LinkL)//按到达地点查询
\n请输入到达地点:
data.reach)==0)
voidSuch_Stime(LinkL)//按起飞时间查询
\n请输入起飞时间:
data.startime)==0)
voidSuch_Rtime(LinkL)//按到达时间查询
\n请输入到达时间:
data.reachtime)==0)
voidShow(LinkL)//显示航班信息
\n以下为所有航班信息:
p=L;
\n%s"
\n"
StatusSort(LinkL)//排序,通过交换数据进行排序;
冒泡排序法
Linkp,q,s;
s=(Link)malloc(sizeof(Node));
s)
for(p=L->
p!
=NULL;
p=p->
next)
for(q=p->
q!
q=q->
if(strcmp(p->
data.startime,q->
data.startime)>
0)
{
s->
data=p->
data;
p->
data=q->
q->
data=s->
}
Show(L);
voidmain()//主函数
LinkL;
inti,a;
|-----------------------欢迎使用航班查询系统-----------------------|\n"
\n**********************************************************"
\n******"
\n***1显示所有航班信息***"
\n***2航班号查询***"
\n***3起飞时间查询***"
\n***4到达时间查询***"
\n***5起飞地点查询***"
\n***6到达地点查询***"
\n***7增加航班信息***"
\n***8删除航班信息***"
\n***9航班排序***"
CreateList(L);
//创建链表
\n|-航班号-|-起飞地点-|-到达地点-|-起飞时间-|-到达时间-|-飞机类型-|-票价-|"
for(i=0;
i<
100;
i++)//用于多长操作
\n\n请输入服务编号:
scanf("
%d"
a);
switch(a)
case1:
Show(L);
case2:
Such_num(L);
case3:
Such_Stime(L);
case4:
Such_Rtime(L);
break;
case5:
Such_Star(L);
case6:
Such_Reach(L);
case7:
ListInsert(L);
case8:
Delete(L);
case9:
Sort(L);
default:
输入无效"
\n请按任意键继续操作!
退出请按0\n"
if(a==0)
2.2字符串操作
voidmain()
inti,m,len1,len3,j;
charstring1[100],string2[100],string3[100];
char*p;
\n请输入string1:
string1);
\n请输入string2:
string2);
\n请输入拷贝数N:
i);
p=strncat(string1,string2,i);
//调用strncat函数,完成字符串的合并。
p);
\n请输入string3:
string3);
p=strstr(string1,string3);
//查找string1中是否存在string3的片段
if(p)
存在\n"
else//string3的插入
请输入插入位置m:
m);
len3=strlen(string3);
len1=strlen(string1);
for(i=len1-1;
i>
=m-1;
i--)
string1[i+len3]=string1[i];
string1[len1+len3]='
\0'
;
for(i=0,j=m-1;
len3;
i++,j++)
string1[j]=string3[i];
%s\n"
string1);
2.3二叉树运算2
#include<
typedefintTElemType;
typedefstructBiTNode
TElemTypedata;
structBiTNode*lchild,*rchild;
}BiNode,*Bitree;
Bitreeroot;
//定义根结点
voidinsert_data(intx)/*生成二叉排序树*/
Bitreep,q,s;
s=(Bitree)malloc(sizeof(BiNode));
//创建结点
s->
data=x;
//结点赋值
lchild=NULL;
rchild=NULL;
root)
root=s;
else
p=root;
while(p)/*如何接入二叉排序树的适当位置*/
q=p;
if(p->
data==x)//相同结点不能重复插入
printf("
dataalreadyexist!
\n"
return;
elseif(x<
data)
p=p->
lchild;
else
rchild;
if(x<
q->
q->
lchild=s;
else
rchild=s;
voidCreateList(Bitree&
L=(Bitree)malloc(sizeof(BiNode));
rchild=NULL;
intPreOrderTraverse(Bitreeroot,Bitree&
L)
Bitreen,p,r;
n=root;
n)return0;
if(n->
lchild==NULL&
&
n->
rchild==NULL)//判断叶子结点并利用指针rchild生成单链表
p=(Bitree)malloc(sizeof(BiNode));
p->
data=n->
while(r->
rchild!
=NULL)
{
r=r->
r