#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<malloc.h>
typedef struct goods{char name[20]; //家电名称char trademark[20]; //品牌char pirce[20]; //单价char count[20]; //数量struct goods *next;
}GOODS;
void MEAN();
void CHECK();
char WELCOME();
GOODS *CREATLIST(GOODS *r);
GOODS *OUTLIST(GOODS *r);
GOODS *DELETELIST(GOODS *r);
GOODS *INSERTLIST(GOODS *r);
void SEARCHLIST(GOODS *r);
GOODS *UPDATELIST(GOODS *r);
void WRITELIST(GOODS *r);
GOODS *LOADLIST(GOODS *r);
GOODS *SORTLIST(GOODS *r);
FILE * fp;
void main(){ //主函数char select,t;GOODS *r;r=(GOODS *)malloc(sizeof(GOODS));r=NULL;MEAN();CHECK(); do{system("cls");do{select=WELCOME();switch(select){case '1':system("cls");r=CREATLIST(r);break;case '2':system("cls");r=LOADLIST(r);break;case '3':system("cls");r=INSERTLIST(r);break;case '4':system("cls");r=DELETELIST(r);break;case '5':system("cls");SEARCHLIST(r);break;case '6':system("cls");r=UPDATELIST(r);break;case '7':system("cls");r=OUTLIST(r);break;case '8':system("cls");WRITELIST(r);break;case '0':exit(0);default :system("pause");system("cls");printf(" * ===================================================================== *");printf("\n * 当前状态:请您重新选择! *\n");}}while(select<0 || select>8);printf("继续操作请输入(y):"); getchar();t=getchar();}while(t=='y');
}
void MEAN(){ //登入菜单1long t;struct tm *st;char *ch;time(&t);ch=ctime(&t);st=localtime(&t);printf(" * ================================================================== *");printf("\n * *");printf("\n * 欢迎使用家电库存管理系统 *");printf("\n * *");printf("\n * *");printf("\n * 当前系统日期:%d年%2d月%2d日 *",st->tm_year+1900,st->tm_mon+1,st->tm_mday);printf("\n * *");
}
void CHECK(){ //登入菜单2int check;char pass1[]="admin",pass[20],user[20];while(1){printf("\n * ================================================================== *");printf("\n * *");printf("\n * 登 录 界 面 *");printf("\n * *");printf("\n * ================================================================== *");printf("\n 1. 请输入帐号:");scanf ("%s",user);printf("\n 2. 请输入密码:");scanf ("%s",pass);check=strcmp(pass,pass1);if(check!=0){system("cls");printf(" * =================================================================== *");printf("\n * 当前状态:密码有误,请重新输入! *");}else{system("cls");break;}}
}
char WELCOME(){ //主菜单char select;_flushall();printf(" * ======================================================================================================= *");printf("\n * 家电库存管理系统 *");printf("\n * ======================================================================================================= *");printf("\n * 1.创建表 2.开始营业(读取文件) 3.进货(插入) 4.提货(删除) 5.查询 6.更新 7.信息 8.营业结束(保存文件) 0.退出 *");printf("\n * ======================================================================================================= *");printf("\n 2. 请输入您的选择:");scanf("%c",&select);return select;
}
GOODS *CREATLIST(GOODS *r){ //创建表int i,j=0,k,n;GOODS *p,*s;printf("需要输入多少数据?\n");scanf("%d",&n);printf("请输入数据:\n");for(i=1;i<=n;i++){s=(GOODS *)malloc(sizeof(GOODS));printf("编号%d的家电名称:",i);scanf("%s",&s->name);while(s->name[j]!='\0')j++;for(k=j+1;k<20;k++)s->name[k]=' ';printf("编号%d的品牌:",i);scanf("%s",&s->trademark);j=0;while(s->trademark[j]!='\0')j++;for(k=j+1;k<20;k++)s->trademark[k]=' ';printf("编号%d的价格为:",i);scanf("%s",&s->pirce);j=0;while(s->pirce[j]!='\0')j++;for(k=j+1;k<20;k++)s->pirce[k]=' ';printf("编号%d的数量:",i);scanf("%s",&s->count);j=0;while(s->count[j]!='\0')j++;for(k=j+1;k<20;k++)s->count[k]=' ';s->next=NULL;//链表末尾结点指针置空if(r==NULL) //若r=NULL,s直接赋给r;r=s;else{p=r; //r!=NULL,找到r链表最后结点while(p->next!=NULL)p=p->next;p->next=s;}p=s; //指针p总是指向链表结尾}return r;
}
GOODS *OUTLIST(GOODS *r){ //信息输出GOODS *p;int i=1;r=SORTLIST(r); //将排序后的链表重新赋给rp=r;if(p==NULL)printf("error\n");else{printf("编号 家电名称 品牌 价格 数量\n");while(p!=NULL){printf("编号%d ",i);printf("%s\t\t",p->name); printf("%s\t\t",p->trademark);printf("%s\t\t",p->pirce);printf("%s\t\t",p->count);printf("\n");p=p->next;i++;}}return r;
}
GOODS *DELETELIST(GOODS *r){ //删除int n,i=0;GOODS *p,*q;q=r;p=r;printf("你需要删除哪一位置?\n");scanf("%d",&n);if(n==1) //若删除头结点,r直接指向下一个结点r=r->next;else{for(i=1;i<n;i++){ //寻找第i个结点,由q指出p=q; //q所指结点的直接前驱由p指出q=q->next;if(q==NULL)printf("error\n"); //删除失败}p->next=q->next; //删除第i个结点}free(q);return r;
}
GOODS *INSERTLIST(GOODS *r){ //插入int i=1,k,n,m=0;GOODS *p,*q;printf("需要插入哪一位置\n");scanf("%d",&n); q=r;while(i<n && q!=NULL){q=q->next;i++;}if(i!=n || q==NULL)printf("error\n");else{p=(GOODS *)malloc(sizeof(GOODS));printf("编号%d的家电名称:",n);scanf("%s",&p->name);while(p->name[m]!='\0')m++;for(k=m+1;k<20;k++)p->name[k]=' ';printf("编号%d的品牌:",n);scanf("%s",&p->trademark);m=0;while(p->trademark[m]!='\0')m++;for(k=m+1;k<20;k++)p->trademark[k]=' ';printf("编号%d的价格:",n);scanf("%s",&p->pirce);m=0;while(p->pirce[m]!='\0')m++;for(k=m+1;k<20;k++)p->pirce[k]=' ';printf("编号%d的数量:",n);scanf("%s",&p->count);m=0;while(p->count[m]!='\0')m++;for(k=m+1;k<20;k++)p->count[k]=' ';if(n==1){//插入位置为头结点时,将r送给新结点的指针域,r指向新结点;p->next=r;r=p;}else{p->next=q->next;q->next=p;//将新链接点插在第i个链接点之后printf("\n");}}return r;
}
void SEARCHLIST(GOODS *r){ //搜索int i=1,n;GOODS *p;printf("你需要搜索哪一位置?\n");scanf("%d",&n);p=r;while(i<n && p!=NULL){ //找搜索结点p=p->next;i++;}if(i!=n || p==NULL)printf("error\n");else{printf("编号 家电名称 品牌 价格 数量\n");printf("编号%d ",n);printf("%s\t\t",p->name); printf("%s\t\t",p->trademark);printf("%s\t\t",p->pirce);printf("%s\t\t",p->count);printf("\n");}
}
GOODS *UPDATELIST(GOODS *r){ //更新int i=1,k,n,m=0;GOODS *p;printf("你想更新哪一位置?\n");scanf("%d",&n);p=r;while(i<n && p!=NULL){p=p->next;i++;}if(i!=n || p==NULL)printf("error\n");else{printf("编号%d的家电名称:",n);scanf("%s",&p->name);while(p->name[m]!='\0')m++;for(k=m+1;k<20;k++)p->name[k]=' ';printf("编号%d的品牌:",n);scanf("%s",&p->trademark);m=0;while(p->trademark[m]!='\0')m++;for(k=m+1;k<20;k++)p->trademark[k]=' ';printf("编号%d的价格:",n);scanf("%s",&p->pirce);m=0;while(p->pirce[m]!='\0')m++;for(k=m+1;k<20;k++)p->pirce[k]=' ';printf("编号%d的数量:",n);scanf("%s",&p->count);m=0;while(p->count[m]!='\0')m++;for(k=m+1;k<20;k++)p->count[k]=' '; }return r;
}
void WRITELIST(GOODS *r){ //保存FILE *fp;GOODS *s;if((fp=fopen("D:\\c语言\\data structure\\库存.txt","wb"))==NULL)printf("打开文件失败\n");else{GOODS *p;s=(GOODS *)malloc(sizeof(GOODS));p=r;while(p){memset(s,0,sizeof(GOODS));strcpy(s->name,p->name);strcpy(s->trademark,p->trademark);strcpy(s->pirce,p->pirce);strcpy(s->count,p->count);fwrite(s,sizeof(GOODS),1,fp);p=p->next;}printf("保存成功\n");}fclose(fp);
}
GOODS *LOADLIST(GOODS *r){ //载入FILE *fp;GOODS *p,*q,*s,*t;if((fp=fopen("D:\\c语言\\data structure\\库存.txt","ab+"))==NULL)printf("文件打开失败\n");else{s=(GOODS *)malloc(sizeof(GOODS));printf("家电名称 品牌 价格 数量\n");while(!feof(fp)){if(fread(s,sizeof(GOODS),1,fp)!=0){printf("%s\t\t%s\t\t%s\t\t%s\n",s->name,s->trademark,s->pirce,s->count);q=(GOODS *)malloc(sizeof(GOODS));strcpy(q->name,s->name);strcpy(q->trademark,s->trademark);strcpy(q->pirce,s->pirce);strcpy(q->count,s->count);p=q;p->next=NULL;if(r==NULL)r=p; //此时p指针作为头结点位elset->next=p;t=p; //指针变量t总是指向链表结尾}}fclose(fp);}return r;
}
GOODS *SORTLIST(GOODS *r){ //选择排序GOODS *pfirst,*ptail,*pminbefore,*pmin,*p;pfirst=NULL;while(r!=NULL){for(p=r,pmin=r;p->next!=NULL;p=p->next){//循环遍历链表中的结点,找出此时最小结点if(atoi(p->next->pirce)<atoi(pmin->pirce)){//atoi()字符串转换为整型,找到一个比当前pmin小的结点pminbefore=p; //保存找到结点的直接前驱pmin=p->next; //保存键值更小的结点}}if(pfirst==NULL){//如果有序链表为空链表pfirst=pmin; //第一次找到键值最小结点ptail=pmin; //尾指针指向最后结点} else{ //不为空链表ptail->next=pmin; //把找到的最小结点放到最后,让尾指针的next指向pminptail=pmin; //ptail也指向pmin}if(pmin==r) //如果最小结点为头结点r=r->next; elsepminbefore->next=pmin->next; //pmin离开原链表}if(pfirst!=NULL)//有序链表pfirstptail->next=NULL;//最后结点后驱为空r=pfirst;return r;
}
- 登入界面:设计一个管理员密码,仅管理员可进入;
- 创建表:建立一个链表,增加数据信息;
- 读入文件:将之前的信息从文件中提取出来,展示给管理员查看,并以此为基础继续增删改查;
- 插入:选择插入位置并将需要插入的信息输入;
- 删除:选择删除位置,删除该位置的数据信息;
- 更新:选择需要更新的数据信息位置,并重新输入数据信息;
- 查询:选择需要查询的数据信息位置,并展示;
- 排序:按单价遍历链表的所有数据信息,并以升序排好;
- 信息:向管理员展示全部的已按单价升序排好的数据信息;
- 保存文件:将每天的新数据信息保存至文件中。