#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(){ //登入菜单1
long 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(){ //登入菜单2
int 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); //将排序后的链表重新赋给r
p=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指针作为头结点位
else
t->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指向pmin
ptail=pmin; //ptail也指向pmin
}
if(pmin==r) //如果最小结点为头结点
r=r->next;
else
pminbefore->next=pmin->next; //pmin离开原链表
}
if(pfirst!=NULL)//有序链表pfirst
ptail->next=NULL;//最后结点后驱为空
r=pfirst;
return r;
}
- 登入界面:设计一个管理员密码,仅管理员可进入;
- 创建表:建立一个链表,增加数据信息;
- 读入文件:将之前的信息从文件中提取出来,展示给管理员查看,并以此为基础继续增删改查;
- 插入:选择插入位置并将需要插入的信息输入;
- 删除:选择删除位置,删除该位置的数据信息;
- 更新:选择需要更新的数据信息位置,并重新输入数据信息;
- 查询:选择需要查询的数据信息位置,并展示;
- 排序:按单价遍历链表的所有数据信息,并以升序排好;
- 信息:向管理员展示全部的已按单价升序排好的数据信息;
- 保存文件:将每天的新数据信息保存至文件中。