数据结构C语言课程设计.docx
《数据结构C语言课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构C语言课程设计.docx(28页珍藏版)》请在冰豆网上搜索。
数据结构C语言课程设计
《数据结构与算法》
课程设计报告
(2012—2013学年第1学期)
计算机与信息工程学院
2013
年
7
月
8
日
目录
一.课程设计的目的与要求(含设计指标)2
二.方案实现与调试2
2.1题目:
航班查询系统2
2.2题目:
字符串操作4
2.3:
二叉树的运算26
2.4二叉树运算18
三.课程设计分析与总结10
四.源程序清单10
2.1航班查询系统10
2.2字符串操作18
2.3二叉树运算219
2.4二叉树运算22
设计日志25
一.课程设计的目的与要求(含设计指标)
设计目的
1、培养学生运用算法与数据结构的基本知识解决实际编程中的数据结构设计和算法设计问题。
2、培养学生独立设计程序与解决问题的能力,培养学生团队协作集成程序模块及调试能力。
3、培养学生初步的软件设计及软件测试的能力。
基本要求:
学生必须仔细阅读《数据结构》课程设计指导书,认真主动完成课程设计的要求。
有问题及时主动通过各种方式与教师联系沟通。
学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课程设计过程中不断检测自己的计划完成情况,有困难及时向教师汇报。
课程设计按照教学要求需要一周时间完成,一周中每天(按每周5天)上机调试程序时间不少于4小时,总共至少要上机调试程序15小时。
根据设计报告要求编写设计报告,主要内容包括目的、意义、原理和实现方法简介、过程分析及说明、实验结果情况说明、结论。
每位同学必须有可运行的程序,学生能清楚解释各自编写的程序,并回答教师的提问,学生回答的问题和程序运行的结果作为评分的主要衡量标准;(周三开始逐一检查)。
二.方案实现与调试
2.1题目:
航班查询系统
2.1.1题目内容
飞机航班信息包括:
航班号、起点站、终点站、起飞时间、到达时间、机型以及票价,实例如下:
设计航班查询系统要求能对飞机航班信息进行增加、删除、排序和查找。
可按航班的航班号、起点站、终点站、起飞时间以及到达时间进行查询
2.1.2算法描述及实验步骤
算法描述
该航班查询系统采用线性链表存储。
开始,创建链表。
然后输出提示操作选项,由用户输入所选项序号。
执行选项。
当第一次操作结束后,提示是否继续进行操作,再有用户决定。
流程图
2.1.3调试过程及实验结果
(1)完成第一模块:
链表创建以及添加,编译时出现警告:
“warningC4091:
'typedef':
ignoredonleftof'structfly'whennovariableisdeclared”,“typedef”时在结构体后面定义一个变量名,所以只需在结构体后面加一个变量名,或者是把结构体的“typedef”去掉。
运行,结果提示错误。
重新检查,发现调用的创建函数和添加函数位置放反了,修改错误,运行成功。
(2)完成其他模块。
在编写排序模块时,链表的排序不懂,通过网上查找,用冒泡法,通过调换链表节点的数据进行排序。
2.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.3:
二叉树的运算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
#include
#include
#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,&p->data.star,&p->data.reach,&p->data.startime,&p->data.reachtime,&p->data.Type,&p->data.price);
while(s!
=NULL)//判断该航班是否已经安排了
{
if(strcmp(p->data.Flynum,s->data.Flynum)==0)
{
printf("\n该航班已经重复");
returnERROR;
}
s=s->next;
}
while(r->next!
=NULL)//添加航班
{
r=r->next;
}
p->next=r->next;
r->next=p;
returnOK;
}
StatusDelete(Link&L)//删除航班信息
{
Linkp,q;
charnum[10];
printf("\n请输入要删除的航班号:
");
scanf("%s",&num);
q=L;
p=L->next;
while(p->next!
=NULL)
{
if(strcmp(num,p->data.Flynum)==0)
break;
q=q->next;
p=p->next;
}
q->next=p->next;
free(p);
returnOK;
}
voidSuch_num(LinkL)//按航班号查询
{
Linkp;
charnum[10];
printf("\n请输入要查找的航班号");
scanf("%s",&num);
p=L->next;
while(p!
=NULL)
{
if(strcmp(num,p->data.Flynum)==0)
break;
p=p->next;
}
printf("%s",p->data.Flynum);
printf("%s",p->data.star);
printf("%s",p->data.reach);
printf("%s",p->data.startime);
printf("%s",p->data.reachtime);
printf("%s",p->data.Type);
printf("%d",p->data.price);
}
voidSuch_Star(LinkL)//按起飞地点查询
{
Linkp;
charnum[10];
printf("\n请输入起飞地点:
");
scanf("%s",&num);
p=L->next;
while(p!
=NULL)
{
if(strcmp(num,p->data.star)==0)
break;
p=p->next;
}
printf("%s",p->data.Flynum);
printf("%s",p->data.star);
printf("%s",p->data.reach);
printf("%s",p->data.startime);
printf("%s",p->data.reachtime);
printf("%s",p->data.Type);
printf("%d",p->data.price);
}
voidSuch_Reach(LinkL)//按到达地点查询
{
Linkp;
charnum[10];
printf("\n请输入到达地点:
");
scanf("%s",&num);
p=L->next;
while(p!
=NULL)
{
if(strcmp(num,p->data.reach)==0)
break;
p=p->next;
}
printf("%s",p->data.Flynum);
printf("%s",p->data.star);
printf("%s",p->data.reach);
printf("%s",p->data.startime);
printf("%s",p->data.reachtime);
printf("%s",p->data.Type);
printf("%d",p->data.price);
}
voidSuch_Stime(LinkL)//按起飞时间查询
{
Linkp;
charnum[10];
printf("\n请输入起飞时间:
");
scanf("%s",&num);
p=L->next;
while(p!
=NULL)
{
if(strcmp(num,p->data.startime)==0)
break;
p=p->next;
}
printf("%s",p->data.Flynum);
printf("%s",p->data.star);
printf("%s",p->data.reach);
printf("%s",p->data.startime);
printf("%s",p->data.reachtime);
printf("%s",p->data.Type);
printf("%d",p->data.price);
}
voidSuch_Rtime(LinkL)//按到达时间查询
{
Linkp;
charnum[10];
printf("\n请输入到达时间:
");
scanf("%s",&num);
p=L->next;
while(p!
=NULL)
{
if(strcmp(num,p->data.reachtime)==0)
break;
p=p->next;
}
printf("%s",p->data.Flynum);
printf("%s",p->data.star);
printf("%s",p->data.reach);
printf("%s",p->data.startime);
printf("%s",p->data.reachtime);
printf("%s",p->data.Type);
printf("%d",p->data.price);
}
voidShow(LinkL)//显示航班信息
{
Linkp;
printf("\n以下为所有航班信息:
");
p=L;
while(p->next!
=NULL)
{
p=p->next;
printf("\n%s",p->data.Flynum);
printf("%s",p->data.star);
printf("%s",p->data.reach);
printf("%s",p->data.startime);
printf("%s",p->data.reachtime);
printf("%s",p->data.Type);
printf("%d",p->data.price);
printf("\n");
}
}
StatusSort(LinkL)//排序,通过交换数据进行排序;冒泡排序法
{
Linkp,q,s;
s=(Link)malloc(sizeof(Node));
if(!
s)
{
printf("\n空间分配失败");
returnERROR;
}
for(p=L->next;p!
=NULL;p=p->next)
{
for(q=p->next;q!
=NULL;q=q->next)
{
if(strcmp(p->data.startime,q->data.startime)>0)
{
s->data=p->data;
p->data=q->data;
q->data=s->data;
}
}
}
Show(L);
returnOK;
}
voidmain()//主函数
{
LinkL;
inti,a;
printf("|-----------------------欢迎使用航班查询系统-----------------------|\n");
printf("\n");
printf("\n**********************************************************");
printf("\n******");
printf("\n***1显示所有航班信息***");
printf("\n***2航班号查询***");
printf("\n***3起飞时间查询***");
printf("\n***4到达时间查询***");
printf("\n***5起飞地点查询***");
printf("\n***6到达地点查询***");
printf("\n***7增加航班信息***");
printf("\n***8删除航班信息***");
printf("\n***9航班排序***");
printf("\n******");
printf("\n**********************************************************");
CreateList(L);//创建链表
printf("\n|-航班号-|-起飞地点-|-到达地点-|-起飞时间-|-到达时间-|-飞机类型-|-票价-|");
for(i=0;i<100;i++)//用于多长操作
{
printf("\n\n请输入服务编号:
");
scanf("%d",&a);
switch(a)
{
case1:
Show(L);
break;
case2:
Such_num(L);
break;
case3:
Such_Stime(L);
break;
case4:
Such_Rtime(L);
break;
case5:
Such_Star(L);
break;
case6:
Such_Reach(L);
break;
case7:
ListInsert(L);
break;
case8:
Delete(L);
case9:
Sort(L);
break;
default:
printf("输入无效");
break;
}
printf("\n请按任意键继续操作!
退出请按0\n");
scanf("%d",&a);
if(a==0)
break;
}
}
2.2字符串操作
#include
#include
voidmain()
{
inti,m,len1,len3,j;
charstring1[100],string2[100],string3[100];
char*p;
printf("\n请输入string1:
");
scanf("%s",&string1);
printf("\n请输入string2:
");
scanf("%s",&string2);
printf("\n请输入拷贝数N:
");
scanf("%d",&i);
p=strncat(string1,string2,i);//调用strncat函数,完成字符串的合并。
printf("%s",p);
printf("\n请输入string3:
");
scanf("%s",&string3);
p=strstr(string1,string3);//查找string1中是否存在string3的片段
if(p)
printf("存在\n");
else//string3的插入
{
printf("请输入插入位置m:
");
scanf("%d",&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;i{
string1[j]=string3[i];
}
printf("%s\n",string1);
}
}
2.3二叉树运算2
#include
#include
typedefintTElemType;
typedefstructBiTNode
{
TElemTypedata;
structBiTNode*lchild,*rchild;
}BiNode,*Bitree;
Bitreeroot;//定义根结点
voidinsert_data(intx)/*生成二叉排序树*/
{
Bitreep,q,s;
s=(Bitree)malloc(sizeof(BiNode));//创建结点
s->data=x;//结点赋值
s->lchild=NULL;
s->rchild=NULL;
if(!
root)
{
root=s;
}
else
{
p=root;
while(p)/*如何接入二叉排序树的适当位置*/
{
q=p;
if(p->data==x)//相同结点不能重复插入
{
printf("dataalreadyexist!
\n");
return;
}
elseif(xdata)
p=p->lchild;
else
p=p->rchild;
}
if(xdata)
q->lchild=s;
else
q->rchild=s;
}
}
voidCreateList(Bitree&L)
{
L=(Bitree)malloc(sizeof(BiNode));
L->rchild=NULL;//先建立一个带头结点的空链表
}
intPreOrderTraverse(Bitreeroot,Bitree&L)
{
Bitreen,p,r;
r=L;
n=root;
if(!
n)return0;
if(n->lchild==NULL&&n->rchild==NULL)//判断叶子结点并利用指针rchild生成单链表
{
p=(Bitree)malloc(sizeof(BiNode));
p->data=n->data;
while(r->rchild!
=NULL)
{
r=r->r