商品货架管理数据结构课程设计.docx
《商品货架管理数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《商品货架管理数据结构课程设计.docx(13页珍藏版)》请在冰点文库上搜索。
商品货架管理数据结构课程设计
洛阳理工学院
课程设计说明书
课程名称数据结构
设计课题商品货架管理
专业计算机科学与技术
班级xxx
学号xxx
姓名xxx
完成日期2014年6月14日
课程设计任务书
设计题目:
商品货架管理
_________________________________________________________
设计内容与要求:
小四号宋体,行间距固定值12磅
每段缩进两个字符
注:
如果题目太长行间距可以缩小,总之,这一页不可以分成两页。
商品货架管理
设计内容:
商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。
上货时,需要倒货架,以保证生产日期较近的商品在较下的位置。
设计要求:
针对一种特定商品,实现上述管理过程。
指导教师:
王伟静
2014年6月5日
课程设计评语
成绩:
指导教师:
年月日
【问题描述】
商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。
上货时,需要倒货架,以保证生产日期较近的商品在较下的位置。
【基本要求】
针对一种特定商品,实现上述管理过程。
【测试数据】
小四宋体,行间距单倍行距,每段缩进两个字符
【算法思想】
第一:
先定义数据日期的结构体——里面包括年、月、日
第二:
写进栈、出栈函数
第三:
写倒货函数
基本思想就是借助三个一维数组分别装载年(a[])、月(b[])、日(c[]),然后出栈并将所有元素放到这三个数组中,一个生产日期的年、月、日数组的下标必须必须相同否则就乱了。
再将数组中元素按生产日期较近进行排序,最后一步将数组中的元素压到原来的栈中即可。
第四:
函数输出,输出只是单纯的输出,不要求出战,故需要另写一个函数
第五:
主函数因为可以循环使用,故用switch—case语句即可实现
【模块划分】
进栈、出栈、倒货、输出和主函数
【数据结构】
栈:
程序中使用的是链栈,链栈的好处是只要还有存储空间就会存储,结构体的next域指向下一个数据域,它的存储空间是随意的,可以连续,也可以不连续。
数组:
数组的存储方式是连续的物理空间,下标即为存储位置,可以高效的运行
【测试情况】
小四宋体,行间距单倍行距
重点内容,每个功能抓图并且给予文字解释
【心得】
通过此次的课程设计让我深刻的了解到了数据结构是很难的,刚开始的写的时候,结构体定义就出错了,以至于后边的函数功能都出错了,就连输入都有错误,我刚开始以为是我的函数写错了呐!
把进栈、出栈函数照着教材上的又重新写了一会,结果发现还是不行,后来请教班里学的比较还好的同学,发现我结构体定义的有问题,我年份用的是int类型,月、日用的是char类型,char类型只能接收一个字符,第二个就不能接收不了,所我的输入总有问题,后来我改成int类型的就没有这种情况了。
后来又想边比较边压栈,弄了一段时间,后来由于时间关系就没实现,就借助数组实现的。
也是一种遗憾。
以后有时间写出来。
此次的课程设计,让我对栈有了更加深入的理解,因为结构体出错时写了好几遍,同时也感谢帮助我的老师和同学们,谢谢给我的帮助,才是顺利的完成此次课程设计。
【源程序】
5号,TimesNew Roman 字体
#include
#include
#defineFALSE0
#defineTRUE1
#defineSIZE3
#defineNUM100
//日期结构体定义
typedefstructDate
{
intyear;
intmonth;
intday;
}Date,*DATE;
//链栈结构体定义
typedefstructNode
{
Datedate;
structNode*next;
}linkstacknode,*linkstack;
//链栈初始化
voidinitstack(linkstack*S)
{
*S=(linkstacknode*)malloc(sizeof(linkstacknode));
(*S)->next=NULL;
}
//链栈进栈
intpush(linkstacknode*S,Datedate)
{
linkstacknode*temp;
temp=(linkstacknode*)malloc(sizeof(linkstacknode));
if(temp==NULL)return(FALSE);
temp->date.year=date.year;
temp->date.month=date.month;
temp->date.day=date.day;
temp->next=S->next;
S->next=temp;
return(TRUE);
}
//链栈出栈
intPop(linkstacknode*S,Date*date)
{
linkstacknode*temp;
temp=S->next;
if(temp==NULL)return0;
S->next=temp->next;
date->year=temp->date.year;
date->month=temp->date.month;
date->day=temp->date.day;
free(temp);
return1;
}
//链栈输出
voidshow_Date_linkstacknode(linkstacknode*S)
{
linkstacknode*p=NULL;
p=S->next;
while(p!
=NULL)
{
printf("%d:
%d:
%d:
\n",p->date.year,p->date.month,p->date.day);
p=p->next;
}
}
//删除
voiddelet(linkstacknode*S,Date*date)
{
inti=0,j=0,n=0;//temp0,temp1,temp2,
inta[NUM]={0};
intb[NUM]={0};
intc[NUM]={0};
Date*date0=NULL;
date0=(Date*)malloc(sizeof(Date));
while(S->next!
=NULL)//将栈中元素放在数组中
{
Pop(S,date);
a[i]=date->year;
b[i]=date->month;
c[i]=date->day;
i++;
}
//删除元素与栈中元素比较并覆盖删除
for(j=0;j{
if(a[j]==date->year)
{
if(b[j]==date->month)
{
if(c[j]==date->day)
{
for(;j
{
a[j]=a[j+1];
b[j]=b[j+1];
c[j]=c[j+1];
}
}
}
}
}
//将排好的数组中元素压入到栈中
for(n=0;n
{
S->date.year=a[n];
S->date.month=b[n];
S->date.day=c[n];
push(S,S->date);
//a[n]=S->date.year;
//b[n]=S->date.month;
//c[n]=S->date.day;
//push(S,S->date);
}
}
//排序压栈
voidshuru(linkstacknode*S)
{
inti=0,j=0,n=0,temp0,temp1,temp2;
inta[NUM]={0};//日期—年数组
intb[NUM]={0};//日期—月数组
intc[NUM]={0};//日期—日数组
Date*date=NULL;
date=(Date*)malloc(sizeof(Date));
while(S->next!
=NULL)//将栈中元素放在数组中
{
Pop(S,date);
a[i]=date->year;
b[i]=date->month;
c[i]=date->day;
i++;
}
//从大到小排序
for(j=0;j
{
if(a[j]{
temp0=a[j+1];
temp1=b[j+1];
temp2=c[j+1];
a[j+1]=a[j];
b[j+1]=b[j];
c[j+1]=c[j];
a[j]=temp0;
b[j]=temp1;
c[j]=temp2;
}
elseif(b[j]
{
temp0=a[j+1];
temp1=b[j+1];
temp2=c[j+1];
a[j+1]=a[j];
b[j+1]=b[j];
c[j+1]=c[j];
a[j]=temp0;
b[j]=temp1;
c[j]=temp2;;
}
elseif(c[j]{
temp0=a[j+1];
temp1=b[j+1];
temp2=c[j+1];
a[j+1]=a[j];
b[j+1]=b[j];
c[j+1]=c[j];
a[j]=temp0;
b[j]=temp1;
c[j]=temp2;
}
}
//将排好的数组中元素压入到栈中
for(n=0;n
{
S->date.year=a[n];
S->date.month=b[n];
S->date.day=c[n];
push(S,S->date);
}
}
voidmenu()
{
printf("*****************************************************\n");
printf("******************可口可乐**********************\n");
printf("*****************************************************\n");
printf("\n");
printf("***********日期(年月日)之间用空格隔开***************\n");
printf("**********一个日期(年月日)完成后按回车**************\n");
printf("\n");
printf("****************** 1:
产品输入 **********************\n");
printf("***************** 2:
产品输入 **********************\n");
printf("****************** 3:
产品输出 **********************\n");
printf("****************** 4:
退 出 ***********************\n");
printf("\n");
}
voidmain()
{
chari=0,flag=1,cloise=0;
intm=0;
linkstacknode*S=NULL;
//*S=(linkstacknode*)malloc(sizeof(linkstacknode))
Date*date=NULL;
Date*date1=NULL;
initstack(&S);
flushall();
date=(Date*)malloc(sizeof(Date));
date1=(Date*)malloc(sizeof(Date));
while(flag)
{
menu();
printf("请输入选择项:
\n");
scanf("%d",&cloise);
switch(cloise)
{
case1:
printf("请安输入商品个数:
\n");
scanf("%d",&m);
printf("请输入日期(年月日):
\n");
for(i=0;i{
scanf("%d%d%d",&date->year,&date->month,&date->day);
push(S,*date);
}
break;
case2:
printf("请输入日期(年月日):
\n");
scanf("%d%d%d",&date1->year,&date1->month,&date1->day);
delet(S,date1);
break;
case3:
printf("上货后的日期如下:
\n");
shuru(S);
show_Date_linkstacknode(S);
break;
case4:
flag=0;
break;
}
}
}
........忽略此处.......