数据结构课程结构设计.docx
《数据结构课程结构设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程结构设计.docx(31页珍藏版)》请在冰点文库上搜索。
![数据结构课程结构设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/48fd2186-f8b2-4974-bf01-f93ff583493d/48fd2186-f8b2-4974-bf01-f93ff583493d1.gif)
数据结构课程结构设计
数据结构课程结构设计
一.课程设计的目的与要求(含设计指标)
1、设计目的
(1)培养学生运用算法与数据结构的基本知识解决实际编程中的数据结构设计和算法设计问题。
(2)培养学生独立设计程序与解决问题的能力,培养学生团队协作集成程序模块及调试能力。
(3)培养学生初步的软件设计及软件测试的能力。
2、设计任务及要求
基本要求:
学生必须仔细阅读《数据结构》课程设计指导书,认真主动完成课程设计的要求。
有问题及时主动通过各种方式与教师联系沟通。
学生要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己的计划完成情况,及时的向教师汇报。
课程设计按照教学要求需要一周时间完成,一周中每天(按每周5天)至少要上3-4小时的机来调试C语言设计的程序,总共至少要上机调试程序15小时。
根据设计报告要求编写设计报告,主要内容包括目的、意义、原理和实现方法简介、过程分析及说明、实验结果情况说明、结论。
每个人必须有可运行的程序,学生能对自己的程序面对教师提问并能熟练地解释清楚,学生回答的问题和程序运行的结果作为评分的主要衡量标准;
二.方案实现与调试
2.1题目:
某停车场可以停放n辆汽车,该停车场只有一个大门,每辆汽车离开停车场都要求之前的汽车必须先退出停车场为它让道,而后让道的汽车再次驶入停车场,停车场示意图如下:
要求设计停车管理系统,实现车辆的进入、离开并根据停车时间计费。
2.1.1算法描述及实验步骤
停车场管理系统
2.1.2调试过程及实验结果
2.2题目:
字符串的操作:
任务:
字符串采用数组存储,建立两个字符串String1和String2.输出两个字符串。
将字符串String2的头n个字符添加到String1的尾部,输出结果。
查找String3在串String1中的位置,若String3在String1中不存在,则插入String3在String1中的m位置上。
输出结果。
2.2.1算法描述及实验步骤
voidInitString(Sstring*S,intmax,char*string);初始化字符串S,将string的字符复制到S中;
intInsert(Sstring*S,intpos,SstringT):
在主串S的pos位置插入子串T;
intSubString(Sstring*T,SstringS,intpos,intlen)取主串S从pos位置开始的长度为len的字串,取成功返回1,失败返回0;
voidDestroy(Sstring*S):
撤销串S的所占的空间;
voidIndex(SstringS,SstringT,intpos):
查找S从pos位置开始的子串T
2.2.2调试过程及实验结果
2.3题目:
2.3.1算法描述及实验步骤
通过追踪两个节点的路径,来找出他们的祖先,还可以通过判断从根结点开始,判断以当前结点为根的树中左右子树是不是包含我们要找的两个结点。
如果两个结点都出现在它的左子树中,那最低的共同父结点也出现在它的左子树中。
如果两个结点都出现在它的右子树中,那最低的共同父结点也出现在它的右子树中。
如果两个结点一个出现在左子树中,一个出现在右子树中,那当前的结点就是最低的共同父结点
否
是
否
是是
2.3.2调试过程及实验结果
2.4题目:
二叉树的运算2
任务:
请设计一个算法,把二叉树的叶子结点按从左到右的顺序连成一个单链表。
二叉树用二叉链存储,链接时用叶子结点的rchild域存放指针。
2.4.1算法描述及实验步骤
voidinsert_data(intx)创建树;
voidleaflink(test*root)叶子节点连接;
2.4.2调试过程及实验结果
三.课程设计分析与总结
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程.”千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础.
通过这次课程设计,对于数据结构有了更深的了解。
书本上的知识与老师的讲解都比较容易理解,但是当自己采用刚学的知识点编写程序时却感到十分棘手,有时表现在想不到适合题意的算法,有时表现在算法想出来后,只能将书本上原有的程序段誊写到自己的程序中再加以必要的连接以完成程序的编写。
针对这一情况,我会严格要求自己,熟练掌握算法思想,尽量独立完成程序的编写与修改工作,只有这样,才能够提高运用知识,解决问题的能力。
在这次设计过程中,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
四.源程序清单
停车场:
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"conio.h"
#defineN100/*定义一个全局变量用来存储停车场的最大容量*/
typedefstructtime
{
inthour;
intmin;
}Time;/*用于计算停车时间以便计算停车费用*/
typedefstructnode
{
charcarnum[10];
Timereach;
Timego;
}Car;/*车辆信息结点*/
typedefstructNODE
{
Car*stack[150];
inttop;
}SqStack;/*定义一个栈作为停车站*/
typedefstructcar
{
Car*data;
structcar*next;
}QNode;/*定义一个车结构*/
typedefstructNode
{
QNode*front;
QNode*rear;
}LinkQueue;/*等待通道*/
voidInitStack(SqStack*s)/*初始化栈*/
{
inti;
s->top=0;
for(i=0;i<=N;i++)
s->stack[s->top]=NULL;
}
intInitQueue(LinkQueue*Q)/*初始化便道*/
{
Q->front=(QNode*)malloc(sizeof(QNode));
if(Q->front!
=NULL)
{
Q->front->next=NULL;
Q->rear=Q->front;
return
(1);
}
elsereturn(-1);
}
intarrive(SqStack*In,LinkQueue*W)/*车辆到达*/
{
Car*p;
QNode*t;
p=(Car*)malloc(sizeof(Car));
flushall();
printf("\n\t\t停车场还有%d个停车位",N-In->top);
printf("\n\t\t请输入车牌号码:
");
gets(p->carnum);
if(In->top{
In->top++;
printf("\n\t\t停车的位置:
%d号停车位。
",In->top);
printf("\n\t\t请输入车到达的时间(格式“**:
**”):
");
scanf("%d:
%d",&(p->reach.hour),&(p->reach.min));
In->stack[In->top]=p;
printf("\t\t请按任意键返回");
getch();
return
(1);
}
else/*停车场已满,车进便道*/
{
printf("\n\t\t停车位已满,该车须在便道等待!
");
t=(QNode*)malloc(sizeof(QNode));
t->data=p;
t->next=NULL;
W->rear->next=t;
W->rear=t;
printf("\t\t请按任意键返回");
getch();
return
(1);
}
}
voidPrint(Car*p,introom)/*输出停车站车的信息*/
{
intA1,A2,B1,B2;
printf("\n\t\t请输入车离开的时间(格式“**:
**”):
");
scanf("%d:
%d",&(p->go.hour),&(p->go.min));
printf("\n\t\t车牌号码:
");
puts(p->carnum);
printf("\n\t\t车到达的时间是:
%d:
%d",p->reach.hour,p->reach.min);
printf("\t\t车离开的时间是:
%d:
%d",p->go.hour,p->go.min);
A1=p->reach.hour;
A2=p->reach.min;
B1=p->go.hour;
B2=p->go.min;
printf("\n\t\t费用为:
%d元",(((B1-A1)*60+(B2-A2))));
free(p);
}
voidgo(SqStack*In,SqStack*Out,LinkQueue*W)/*车辆离开*/
{
intlocate;
Car*p,*t;
QNode*q;
/*判断车场内是否有车*/
if(In->top>0)/*有车*/
{
while
(1)/*输入离开车辆的信息*/
{
printf("\n\t\t请输入车在停车场的位置:
",In->top);
scanf("%d",&locate);
if(locate>=1&&locate<=In->top)
break;
}
while(In->top>locate)/*车辆离开*/
{
Out->top++;
Out->stack[Out->top]=In->stack[In->top];
In->stack[In->top]=NULL;
In->top--;
}
p=In->stack[In->top];
In->stack[In->top]=NULL;
In->top--;
while(Out->top>=1)
{
In->top++;
In->stack[In->top]=Out->stack[Out->top];
Out->stack[Out->top]=NULL;
Out->top--;
}
Print(p,locate);
/*判断通道上是否有车及车站是否已满*/
if((W->front!
=W->rear)&&In->top{
q=W->front->next;
t=q->data;
In->top++;
printf("\n\t\t便道的%s号车进入车场第%d号停车位。
",t->carnum,In->top);
printf("\n\t\t请输入现在的时间(格式“**:
**”):
");
scanf("%d:
%d",&(t->reach.hour),&(t->reach.min));
W->front->next=q->next;
if(q==W->rear)W->rear=W->front;
In->stack[In->top]=t;
free(q);
}
}
elseprintf("\nt\t停车场里没有车\n");/*没车*/
printf("\t\t请按任意键返回");
getch();
}
voidinfo1(SqStack*S)/*列表输出车场信息*/
{
inti;
if(S->top>0)/*判断停车场内是否有车*/
{
printf("\n->>>>>>>查看车场:
");
printf("\n位置到达时间车牌号\n");
for(i=1;i<=S->top;i++)
{
printf("%d",i);
printf("\t%d:
%d\t",S->stack[i]->reach.hour,S->stack[i]->reach.min);
puts(S->stack[i]->carnum);
}
}
elseprintf("\n\t\t停车场里没有车");
}
voidinfo2(LinkQueue*W)/*显示便道信息*/
{
QNode*p;
p=W->front->next;
if(W->front!
=W->rear)/*判断通道上是否有车*/
{
printf("\n便道中车辆的号码为:
\n");
while(p!
=NULL)
{
puts(p->data->carnum);
p=p->next;
}
}
elseprintf("\n便道里没有车\n");
printf("请按任意键返回");
getch();
}
voidinfo(SqStackS,LinkQueueW)
{
info1(&S);/*显示停车场信息*/
info2(&W);/*显示停便道信息*/
}
voidmain()
{
SqStackIn,Out;
LinkQueueWait;
inta;
InitStack(&In);
InitStack(&Out);
InitQueue(&Wait);
while
(1)
{
printf("\n********************欢迎使用停车场管理系统******************\n");
printf("\n\t\t该停车场的容量为150:
");
printf("\n\t\t次停车场的停车费用为1.00元/分钟。
\n");
printf("\n1--------车辆停车");
printf("\n2--------车辆离开");
printf("\n3--------停车场信息");
printf(\n4--------退出系统\n");
printf("\n\t\t请选择相应操作");
while
(1)
{
scanf("%d",&a);
switch(a)
{
case1:
arrive(&In,&Wait);break;
case2:
go(&In,&Out,&Wait);break;
case3:
info(In,Wait);break;
case4:
{printf("\t\t谢谢使用!
欢迎下次光临!
");exit(0);}
default:
printf("\n\t\t按键无效,请重新按键选择!
");
}
printf("\n********************欢迎使用停车场管理系统******************\n");
printf("\n\t\t该停车场的容量为150:
");
printf("\n\t\t次停车场的停车费用为1.00元/分钟。
\n");
printf("\n1--------车辆停车");
printf("\n2--------车辆离开");
printf("\n3--------停车场信息");
printf("\n4--------退出系统\n");
printf("\n\t\t请选择相应操作");
}
}
}
字符串操作:
#include
#include
#include
typedefstruct{
char*ch;
intMaxsize;
intlength;
}Sstring;
voidInitString(Sstring*S,intmax,char*string)
{
inti;
S->ch=(char*)malloc(max*sizeof(char));
S->Maxsize=max;
S->length=strlen(string);
for(i=0;ilength;i++)
S->ch[i]=string[i];
}
intInsert(Sstring*S,intpos,SstringT)
{inti;
if(pos<0)
{printf("参数pos出错!
");return0;}
else
{
//重新申请S->ch所指数组空间,原数组元素存放在新数组的前面
if(S->length+T.length>S->Maxsize)
realloc(S->ch,(S->length+T.length)*sizeof(char));
S->Maxsize=S->length+T.length;
for(i=S->length-1;i>=pos;i--)
S->ch[i+T.length]=S->ch[i];//依次后移T.length个位置
for(i=0;iS->ch[pos+i]=T.ch[i];//插入字串
S->length=S->length+T.length;//改变S的数据元素个数
return1;
}
}
//取主串S从pos位置开始的长度为len的字串,取成功返回1,失败返回0
intSubString(Sstring*T,SstringS,intpos,intlen)
{inti;
if(pos<0||len<0||pos+len>S.length)
{printf("参数pos和len出错!
");
return0;
}
if(len>T->Maxsize)
{
T->ch=(char*)malloc(len*sizeof(char));
T->Maxsize=len;
}
for(i=0;iT->ch[i]=S.ch[pos+i];
T->length=len;
return1;
}
voidDestroy(Sstring*S)
{
free(S->ch);
S->Maxsize=0;
S->length=0;
}
voidIndex(SstringS,SstringT,intpos)
{
inti=pos,j=0,v;intm;
while(i{
if(S.ch[i]==T.ch[j])
{i++;
j++;
}
else{
i=i-j+1;
j=0;
}
}
if(j==T.length)
{v=i-T.length;
printf("串String3在String1中的%d位置",v);}
else{
printf("串String3在String1中不存在!
\n");
printf("请输入插入位置m:
\n");
scanf("%d",&m);
Insert(&S,m,T);
for(i=0;iprintf("%c",S.ch[i]);
printf("\n");
}
}
voidmain()
{
SstringS1,S2,S3,S4;
inti;
intj;
intn;
intmax1=25,max2=10,max3=20,max4=5;
InitString(&S1,max1,"structAreBox");
InitString(&S2,max2,"VertexType");
InitString(&S3,max3,"Data");
InitString(&S4,max4,"");
printf("*************************\n");
printf("*1.输入字符串string1*\n");
printf("*2.输入字符串string2*\n");
printf("*3.输入字符串string3*\n");
printf("*4.串String2的头n个字符添加到String1的尾部,输出结果*\n");
printf("*5.查找sring3在string1的位置*\n");
printf("*************************\n");
//输入第一个字符串
printf("\n请输入串S1:
");
for(i=0;iprintf("%c",S1.ch[i]);
printf("\n");
//输入第二个字符串
printf("\n请输入串S2:
");
for(i=0;iprintf("%c",S2.ch[i]);
printf("\n");
//输入第三个字符串
printf("\n请输入串S3:
");
for(i=0;iprintf("%c",S3.ch[i]);
printf("\n");
//将字符串2的头n个字符添加到S1尾部
if(n{printf("请输入n的值:
\n");
scanf("%d",&n);
SubString(&S4,S2,0,n);
Insert(&S1,S1.length,S4);}
elseprintf("输入不正确");
//查找String3在串String1中的位置,若String3在String1中不存在