链表的维护与文件形式的保存

#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;
}                     
  1. 登入界面:设计一个管理员密码,仅管理员可进入;
  2. 创建表:建立一个链表,增加数据信息;
  3. 读入文件:将之前的信息从文件中提取出来,展示给管理员查看,并以此为基础继续增删改查;
  4. 插入:选择插入位置并将需要插入的信息输入;
  5. 删除:选择删除位置,删除该位置的数据信息;
  6. 更新:选择需要更新的数据信息位置,并重新输入数据信息;
  7. 查询:选择需要查询的数据信息位置,并展示;
  8. 排序:按单价遍历链表的所有数据信息,并以升序排好;
  9. 信息:向管理员展示全部的已按单价升序排好的数据信息;
  10. 保存文件:将每天的新数据信息保存至文件中。
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未满3岁

我爱你,你爱我,蜜雪冰城甜蜜蜜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值