![在这里插入图片描述](https://img-blog.csdnimg.cn/b2ed8b50adba40a789a4accdf48e9d34.png#pic_center)
#include"goods.h"
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
void menue_create(){
printf("请输入您的需求:\n");
printf("0.退出系统\n");
printf("1.继续向表中添加元素\n");
printf("2.按名字查询该商品的过期时间\n");
printf("3.将商品所有信息移除(按商品名查询)\n");
printf("4.商品信息修改\n");
printf("5.展示已有所有商品信息\n");
printf("6.在一个商品后插入新商品信息\n");
printf("7.输出最贵或者最便宜的商品的信息\n");
printf("8.输入要将所有商品按价格升序排列(1)还是降序排列(0)\n");
}
void menue_create_ch(){
printf("0.取消\n");
printf("1.修改商品名称\n");
printf("2.修改商品产地\n");
printf("3.修改商品的品牌\n");
printf("4.修改商品价格\n");
printf("5.修改商品生产日期\n");
printf("6.修改商品保质期\n");
}
void show_or_not(int flag,seqlist_ptr S){
if(flag){
listShow(S);
}
}
seqlist_ptr listCreate(){
seqlist_ptr S = (seqlist_ptr)malloc(sizeof(seqlist));
if(NULL == S){
printf("顺序表创建失败\n");
return NULL;
}
memset(S->data,0,sizeof(S->data));
S->len = 0;
printf("顺序表创建成功\n");
return S;
}
int listFULL(seqlist_ptr S){
if(NULL == S){
printf("所给顺序表不合法\n");
return 0;
}
return S->len == MAX;
}
int listEmpty(seqlist_ptr S){
if(NULL == S){
printf("所给顺序表不合法\n");
return 0;
}
return S->len == 0;
}
datatype data_input(){
datatype e;
printf("请输入商品的名称:");
scanf("%s",e.name);
printf("请输入商品的产地:");
scanf(" %s",e.position);
printf("请输入商品的品牌:");
scanf(" %s",e.brand);
printf("请输入商品的价格:");
scanf("%lf",&e.price);
while(1){
printf("请输入商品的生产日期(年 月 日):");
scanf("%d%d%d",&e.DOP.year,&e.DOP.month,&e.DOP.day);
printf("请输入商品的保质期(天):");
scanf("%d",&e.EXP);
printf("请输入今天的日期(年 月 日):");
scanf("%d%d%d",&e.updatas.year,&e.updatas.month,&e.updatas.day);
if(e.DOP.year<=e.updatas.year&&e.DOP.month>0&& e.DOP.month<=12&&\
e.DOP.day>0&& e.DOP.day<32&&\
e.updatas.month>=0&& e.updatas.month<=12&& e.updatas.day>0&&\
e.updatas.day<32){
if(e.DOP.year==e.updatas.year){
if(e.DOP.month==e.updatas.month&&e.DOP.day<=e.updatas.day){
break;
}
if(e.DOP.month<e.updatas.month){
break;
}
}else{
break;
}
}
printf("输入有误,请重新输入\n");
}
e.expriation = data_caculate(e.DOP,e.EXP);
printf("输入成功\n");
return e;
}
int listAdd(seqlist_ptr S,datatype e){
if(NULL == S||listFULL(S)){
printf("添加失败\n");
return 0;
}
S->data[S->len] = e;
S->len++;
printf("添加成功\n");
return 1;
}
void listShow(seqlist_ptr S){
if(NULL == S||listEmpty(S)){
printf("遍历失败\n");
return;
}
printf("当前顺序表的元素分别是:\n");
int i = 0;
for(i=0; i<S->len; i++){
data_output(S->data[i]);
printf("*********************************************\n");
}
putchar(10);
}
void data_output(datatype e){
printf("******************************************\n");
printf("商品的名称:%s\n",e.name);
printf("商品的产地:%s\n",e.position);
printf("商品的品牌:%s\n",e.brand);
printf("商品的价格:%.2f\n",e.price);
printf("商品的生产日期:%d年%d月%d日\n",e.DOP.year,e.DOP.month,e.DOP.day);
printf("商品的保质期(天):%d\n",e.EXP);
printf("商品信息更新的日期:%d年%d月%d日\n",e.updatas.year,e.updatas.month,e.updatas.day);
printf("商品过期的日期:%d年%d月%d日\n",e.expriation.year,e.expriation.month,e.expriation.day);
}
datas data_caculate(datas e,int day){
int flag = 0;
int i = 0;
for(i=0; i<day; i++){
if(e.year%4==0&& e.year%100!=0|| e.year%400==0){
flag = 1;
}else{
flag = 0;
}
e.day += 1;
switch(e.month){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
if(32 == e.day){
e.day = 1;
e.month++;
}
break;
case 4:
case 6:
case 9:
case 11:
if(31 == e.day){
e.day = 1;
e.month++;
}
break;
case 2:
if(29+flag == e.day){
e.day = 1;
e.month++;
}
break;
case 12:
if(32 == e.day){
e.day = 1;
e.month = 1;
e.year++;
}
break;
}
}
return e;
}
int listInsertByPos(seqlist_ptr S,int pos,datatype e){
if(NULL == S||listFULL(S)||pos<0||pos>S->len){
printf("插入失败\n");
return 0;
}
int i = 0;
for(i=S->len-1; i>=pos; i--){
S->data[i+1] = S->data[i];
}
S->data[pos] = e;
S->len++;
printf("插入成功\n");
return 1;
}
int listDeletPos(seqlist_ptr S,int pos){
if(NULL == S||listEmpty(S)||pos<0||pos>S->len){
printf("删除失败\n");
return 0;
}
int i = 0;
for(i=pos+1; i<S->len; i++){
S->data[i-1] = S->data[i];
}
S->len--;
printf("删除成功\n");
return 1;
}
#if 0
int listUpdataPos(seqlist_ptr S,int pos, datatype e){
if(NULL == S||listEmpty(S)||pos<0||pos>S->len){
printf("修改失败\n");
return 0;
}
S->data[pos] = e;
printf("更新成功\n");
return 1;
}
datatype *listSearchByPos(seqlist_ptr S,int pos){
if(NULL == S||listEmpty(S)||pos<0||pos>=S->len){
printf("查找失败\n");
return NULL;
}
return &S->data[pos];
}
#endif
int listSearchByValue(seqlist_ptr S,datatype e){
if(NULL == S || listEmpty(S)){
printf("查找失败\n");
return -1;
}
for(int i=0; i<S->len; i++){
if(!strcmp(e.name,S->data[i].name)){
return i;
}
}
return -1;
}
#if 0
int listUpdataValue(seqlist_ptr S,datatype old_e,datatype new_e){
if(NULL == S || listEmpty(S) || old_e == new_e){
printf("修改失败\n");
return 0;
}
int index = 0;
while((index = listSearchByValue(S,old_e)) >=0 ){
listUpdataPos(S,index,new_e);
}
printf("修改成功\n");
return 1;
}
#endif
void listSort(seqlist_ptr S,int flag){
if(NULL == S){
printf("所给顺序表不合法\n");
return;
}
int i = 0;
int j = 0;
int index = 0;
datatype tmp;
for(i=1; i<S->len; i++){
index = 0;
if(1 == flag){
for(j=0; j<=S->len-i; j++){
if(S->data[index].price<S->data[j].price){
index = j;
}
}
if(index!=S->len-i){
tmp = S->data[index];
S->data[index] = S->data[S->len-i];
S->data[S->len-i] = tmp;
}
}else{
for(j=0; j<=S->len-i; j++){
if(S->data[index].price>S->data[j].price){
index = j;
}
}
if(index!=S->len-i){
tmp = S->data[index];
S->data[index] = S->data[S->len-i];
S->data[S->len-i] = tmp;
}
}
}
}
#if 0
void listUnique(seqlist_ptr S){
if(NULL == S || S->len <= 1){
printf("进入失败\n");
return;
}
int i = 0;
int j = 0;
for(i=0; i<S->len; i++){
for(j=i+1; j<S->len; j++){
if(S->data[i] == S->data[j]){
listDeletPos(S,j);
j--;
}
}
}
printf("去重成功\n");
}
#endif
int listMoValue(seqlist_ptr S,int flag){
int pos = 0;
double value = S->data[0].price;
int i = 0;
for(i=0; i<S->len; i++){
if(1 == flag){
if(value< S->data[i].price){
value = S->data[i].price;
pos = i;
}
}else{
if(value> S->data[i].price){
value = S->data[i].price;
pos = i;
}
}
}
return pos;
}
void most_output(seqlist_ptr S,int flag){
if(NULL == S|| S->len==0){
printf("最值查找失败\n");
return ;
}
if(1 == flag){
printf("最贵的商品信息为:\n");
}else{
printf("最便宜的商品信息为:\n");
}
int pos = 0;
pos = listMoValue(S,flag);
int i = 0;
for(i=0; i<S->len; i++){
if(S->data[i].price==S->data[pos].price){
data_output(S->data[i]);
}
}
}
#if 0
void listReverse(seqlist_ptr S){
if(NULL == S){
printf("所给顺序表不合法\n");
return;
}
int i = 0;
datatype tmp = 0;
for(i=0; i<S->len/2; i++){
tmp = S->data[i];
S->data[i] = S->data[S->len-1-i];
S->data[S->len-1-i] = tmp;
}
}
#endif
void listFree(seqlist_ptr S){
if(NULL != S){
free(S);
S = NULL;
}
}
#ifndef _GOODS_H_
#define _GOODS_H_
#define MAX 40
typedef struct
{
int year;
int month;
int day;
}datas;
typedef struct
{
char name[32];
char position[32];
char brand[32];
double price;
datas DOP;
int EXP;
datas updatas;
datas expriation;
}datatype;
typedef struct
{
datatype data[MAX];
int len;
}seqlist,*seqlist_ptr;
void menue_create();
void menue_create_ch();
void show_or_not(int flag,seqlist_ptr S);
seqlist_ptr listCreate();
int listEmpty(seqlist_ptr S);
int listFULL(seqlist_ptr S);
datatype data_input();
datas data_caculate(datas e,int day);
int listAdd(seqlist_ptr S,datatype e);
void listShow(seqlist_ptr S);
void data_output(datatype e);
int listInsertByPos(seqlist_ptr S,int pos,datatype e);
int listDeletPos(seqlist_ptr S,int pos);
int listUpdataPos(seqlist_ptr S,int pos, datatype e);
int listUpdataValue(seqlist_ptr S,datatype old_e,datatype new_e);
datatype *listSearchByPos(seqlist_ptr S,int pos);
int listSearchByValue(seqlist_ptr S,datatype e);
void listSort(seqlist_ptr S,int flag);
void listUnique(seqlist_ptr S);
int listMoValue(seqlist_ptr S,int flag);
void most_output(seqlist_ptr S,int flag);
void listReverse(seqlist_ptr S);
void listFree(seqlist_ptr S);
#endif
#include"goods.h"
#include<stdio.h>
int main(int argc, const char *argv[])
{
seqlist_ptr S = listCreate();
if(NULL == S){
printf("顺序表创建失败\n");
return 0;
}
int choice = 0;
datatype e;
int pos;
int flag = 0;
while(1){
menue_create();
scanf("%d",&choice);
switch(choice){
case 0:
goto LOOP;
break;
case 1:
printf("请输入要添加的元素内容:\n");
e = data_input();
flag=listAdd(S,e);
break;
case 2:
printf("请输入要查询的商品名:");
scanf("%s",e.name);
pos = listSearchByValue(S,e);
if(-1==pos){
printf("不存在该商品\n");
continue;
}else{
printf("其过期日期为:%d年%d月%d日\n",S->data[pos].expriation.year,S->data[pos].expriation.month,S->data[pos].expriation.day);
}
break;
case 3:
printf("请输入要删除的商品名:");
scanf("%s",e.name);
pos = listSearchByValue(S,e);
if(-1==pos){
printf("商品本就不存在\n");
continue;
}else{
flag=listDeletPos(S,pos);
printf("删除成功\n");
}
break;
case 4:
printf("请输入要修改的商品名:");
scanf("%s",e.name);
pos = listSearchByValue(S,e);
printf("请输入今天的日期(年 月 日):");
scanf("%d%d%d",&e.updatas.year,&e.updatas.month,&e.updatas.day);
printf("请输入要修改的内容:\n");
menue_create_ch();
int choice4;
scanf("%d",&choice4);
switch(choice4){
case 0:
printf("并未进行修改\n");
break;
case 1:
printf("修改前商品的名字为:%s\n",S->data[pos].name);
printf("请输入修改后的商品名字:");
scanf("%s",S->data[pos].name);
printf("修改后商品的名字为:%s\n",S->data[pos].name);
break;
case 2:
printf("修改前商品的产地为:%s\n",S->data[pos].position);
printf("请输入修改后的商品产地:");
scanf("%s",S->data[pos].name);
printf("修改后商品的产地为:%s\n",S->data[pos].position);
break;
case 3:
printf("修改前商品的品牌为:%s\n",S->data[pos].brand);
printf("请输入修改后的商品品牌:");
scanf("%s",S->data[pos].brand);
printf("修改后商品的品牌为:%s\n",S->data[pos].brand);
break;
case 4:
printf("修改前商品的价格为:%.2f\n",S->data[pos].price);
printf("请输入修改后的商品价格:");
scanf("%lf",&S->data[pos].price);
printf("修改后商品的价格为:%.2f\n",S->data[pos].price);
break;
case 5:
printf("修改前商品的生产日期:%d年%d月%d日\n",S->data[pos].DOP.year,S->data[pos].DOP.month,S->data[pos].DOP.day);
printf("修改前商品过期的日期:%d年%d月%d日\n",S->data[pos].expriation.year,S->data[pos].expriation.month,S->data[pos].expriation.day);
while(1){
printf("要将商品的生产日期(年 月 日)改为:");
scanf("%d%d%d",&e.DOP.year,&e.DOP.month,&e.DOP.day);
if(S->data[pos].DOP.year<=S->data[pos].updatas.year&&S->data[pos].DOP.month>0&& S->data[pos].DOP.month<=12&&\
S->data[pos].DOP.day>0&& S->data[pos].DOP.day<32&&\
S->data[pos].updatas.month>=0&& S->data[pos].updatas.month<=12&& S->data[pos].updatas.day>0&&\
S->data[pos].updatas.day<32){
if(S->data[pos].DOP.year==S->data[pos].updatas.year){
if(S->data[pos].DOP.month==S->data[pos].updatas.month&&S->data[pos].DOP.day<=S->data[pos].updatas.day){
break;
}
if(S->data[pos].DOP.month<S->data[pos].updatas.month){
break;
}
}else{
break;
}
}
printf("输入有误,请重新输入\n");
}
e.expriation = data_caculate(S->data[pos].DOP,S->data[pos].EXP);
printf("输入成功\n");
printf("修改后商品的生产日期:%d年%d月%d日\n",S->data[pos].DOP.year,S->data[pos].DOP.month,S->data[pos].DOP.day);
printf("修改后商品过期的日期:%d年%d月%d日\n",S->data[pos].expriation.year,S->data[pos].expriation.month,S->data[pos].expriation.day);
break;
case 6:
printf("修改前商品的保质期(天):%d\n",S->data[pos].EXP);
printf("修改后商品过期的日期:%d年%d月%d日\n",S->data[pos].expriation.year,S->data[pos].expriation.month,S->data[pos].expriation.day);
printf("请输入要将商品的保质期修改为(天):");
scanf("%d",&S->data[pos].EXP);
e.expriation = data_caculate(S->data[pos].DOP,S->data[pos].EXP);
printf("修改后商品的保质期(天):%d\n",S->data[pos].EXP);
printf("修改后商品过期的日期:%d年%d月%d日\n",S->data[pos].expriation.year,S->data[pos].expriation.month,S->data[pos].expriation.day);
break;
default:
printf("输入不规范,亲人两行泪,请重新输入\n");
break;
}
printf("修改后该商品的信息为\n");
data_output(S->data[pos]);
break;
case 5:
listShow(S);
break;
case 6:
printf("请输入想要在那个商品后插入新商品:\n");
scanf("%s",e.name);
pos = listSearchByValue(S,e);
if(-1==pos){
printf("商品不存在\n");
continue;
}else{
printf("请输入要插入的商品信息:\n");
e = data_input();
flag=listInsertByPos(S,pos,e);
printf("插入成功\n");
}
break;
case 7:
while(1){
printf("请输入要找最贵的还是最便宜的(1求最贵,0求便宜):");
scanf("%d",&flag);
if(1==flag||0==flag){
break;
}
printf("输入不规范,亲人两行泪,请重新输入\n");
}
most_output(S,flag);
break;
case 8:
while(1){
printf("请输入升序排列的还是降序排列的(1升,0奖):");
scanf("%d",&flag);
if(1==flag||0==flag){
break;
}
printf("输入不规范,亲人两行泪,请重新输入\n");
}
listSort(S,flag);
break;
default:
printf("输入不规范,亲人两行泪,请重新输入\n");
break;
}
}
LOOP:
printf("感谢使用,再见\n");
listFree(S);
S = NULL;
return 0;
}