
课 程 设 计 说 明 书
课程名称 数据结构
设计课题 商品货架管理
专 业 计算机科学与技术
班 级 B120503
学 号 B120*****
姓 名 王磊
完成日期 2014年6月14日
| 课 程 设 计 任 务 书 |
| 设计题目: 商品货架管理 _________________________________________________________ 设计内容与要求: 小四号宋体,行间距固定值12磅 每段缩进两个字符 注:如果题目太长行间距可以缩小,总之,这一页不可以分成两页。 商品货架管理 设计内容: 商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。上货时,需要倒货架,以保证生产日期较近的商品在较下的位置。 设计要求: 针对一种特定商品,实现上述管理过程。 指导教师:王伟静 2014 年 6 月5日 |
| 课 程 设 计 评 语 |
成绩: 指导教师: 年 月 日 |
商品货架可以看成一个栈,栈顶商品的生产日期最早,栈底商品的生产日期最近。上货时,需要倒货架,以保证生产日期较近的商品在较下的位置。
【基本要求】
针对一种特定商品,实现上述管理过程。
【测试数据】
小四宋体,行间距单倍行距,每段缩进两个字符
【算法思想】
第一:先定义数据日期的结构体——里面包括年、月、日
第二:写进栈、出栈函数
第三:写倒货函数
基本思想就是借助三个一维数组分别装载年(a[])、月(b[])、日(c[]),然后出栈并将所有元素放到这三个数组中,一个生产日期的年、月、日数组的下标必须必须相同否则就乱了。再将数组中元素按生产日期较近进行排序,最后一步将数组中的元素压到原来的栈中即可。
第四:函数输出,输出只是单纯的输出,不要求出战,故需要另写一个函数
第五:主函数因为可以循环使用,故用switch—case 语句即可实现
【模块划分】
进栈、出栈、倒货、输出和主函数
【数据结构】
栈:程序中使用的是链栈,链栈的好处是只要还有存储空间就会存储,结构体的next域指向下一个数据域,它的存储空间是随意的,可以连续,也可以不连续。
数组:数组的存储方式是连续的物理空间,下标即为存储位置,可以高效的运行
【测试情况】
小四宋体,行间距单倍行距
重点内容,每个功能抓图并且给予文字解释
【心得】
通过此次的课程设计让我深刻的了解到了数据结构是很难的,刚开始的写的时候,结构体定义就出错了,以至于后边的函数功能都出错了,就连输入都有错误,我刚开始以为是我的函数写错了呐!把进栈、出栈函数照着教材上的又重新写了一会,结果发现还是不行,后来请教班里学的比较还好的同学,发现我结构体定义的有问题,我年份用的是int类型,月、日用的是char类型,char类型只能接收一个字符,第二个就不能接收不了,所我的输入总有问题,后来我改成int类型的就没有这种情况了。后来又想边比较边压栈,弄了一段时间,后来由于时间关系就没实现,就借助数组实现的。也是一种遗憾。以后有时间写出来。
此次的课程设计,让我对栈有了更加深入的理解,因为结构体出错时写了好几遍,同时也感谢帮助我的老师和同学们,谢谢给我的帮助,才是顺利的完成此次课程设计。
【源程序】
5号,Times New Roman 字体
#include #include #define FALSE 0 #define TRUE 1 #define SIZE 3 #define NUM 100 //日期结构体定义 typedef struct Date { int year; int month; int day; } Date,*DATE; //链栈结构体定义 typedef struct Node { Date date; struct Node *next; }linkstacknode,*linkstack; //链栈初始化 void initstack(linkstack *S) { *S=(linkstacknode*)malloc(sizeof(linkstacknode)); (*S)->next=NULL; } //链栈进栈 int push(linkstacknode *S,Date date) { 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); } //链栈出栈 int Pop(linkstacknode *S,Date *date) { linkstacknode *temp; temp=S->next; if(temp==NULL) return 0; S->next=temp->next; date->year=temp->date.year; date->month=temp->date.month; date->day=temp->date.day; free(temp); return 1; } //链栈输出 void show_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; } } //删除 void delet(linkstacknode *S,Date *date) { int i=0,j=0,n=0;//temp0,temp1,temp2, int a[NUM]={0}; int b[NUM]={0}; int c[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); } } //排序压栈 void shuru(linkstacknode *S) { int i=0,j=0,n=0,temp0,temp1,temp2; int a[NUM]={0};//日期—年 数组 int b[NUM]={0};//日期—月 数组 int c[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 {
