数据结构与算法课程设计C语言之体育器材管理系统

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//单链表数据类型/
typedef struct {
	int number; //编号
	char name[20]; //名称
	double price; //单价
	char kind[29]; //学号
	char state[20]; //姓名
	char factory[20]; //数量
	char date[20]; //日期
} datatype;

//单链表的结点类型/
typedef struct node {
	datatype data; //数据域
	struct node *next; //指针域
} LinkNode,*LinkList;


//单链表数据类型/
typedef struct {
	int numbera; //编号
	char namea[20]; //名称
	double pricea; //单价
	char kinda[29]; //数量
	char statea[20]; //状态
	char factorya[20]; //生产厂家
	char datea[20]; //购买日期
} datatypea;


//单链表的结点类型/
typedef struct nodea {
	datatypea data; //数据域
	struct nodea *next; //指针域
} LinkNodea,*LinkLista;


//单链表数据类型/
typedef struct {
	int number; //编号
	char name[20]; //名称
	double price; //单价
	char kind[29]; //学号
	char state[20]; //姓名
	char factory[20]; //数量
	char date[20]; //日期
} datatype2;


//单链表的结点类型/
typedef struct nodeb {
	datatype data; //数据域
	struct nodeb *next; //指针域
} LinkNodeb,*LinkListb;


LinkList initList() { //库存表
	LinkList p;
	p=(LinkList)malloc(sizeof(LinkNode));
	p->next=NULL;
	return p;
}

LinkLista initLista() { //借出表
	LinkLista p;
	p=(LinkLista)malloc(sizeof(LinkNodea));
	p->next=NULL;
	return p;
}


LinkListb initListb() { //归还表
	LinkListb p;
	p=(LinkListb)malloc(sizeof(LinkNodeb));
	p->next=NULL;
	return p;
}

void printList(LinkList head) { //浏览所有体育器材信息
	LinkList p=head->next;
	while(p!=NULL) {
		printf("%d %s %f %s %s %s %s\n",p->data.number,p->data.name,p->data.price,p->data.kind,p->data.state,p->data.factory,p->data.date);
		p=p->next;
	}
}


void printLista(LinkLista heada) { //浏览所有借出体育器材信息
	LinkLista p=heada->next;
	while(p!=NULL) {
		printf("%d %s %f %s %s %s %s\n",p->data.numbera,p->data.namea,p->data.pricea,p->data.kinda,p->data.statea,p->data.factorya,p->data.datea);
		p=p->next;
	}
}


void printListb(LinkListb headb) { //浏览所有归还体育器材信息
	LinkListb p=headb->next;
	while(p!=NULL) {
		printf("%d %s %f %s %s %s %s\n",p->data.number,p->data.name,p->data.price,p->data.kind,p->data.state,p->data.factory,p->data.date);
		p=p->next;
	}
}

//创建单链表
void createList(LinkList head) {
	FILE *fp;
	int number;                 //编号
	char name[20];              //名称
	float price;                //单价
	char kind[29];              //种类
	char state[20];             //数量
	char factory[20];           //生产厂家
	char date[20];              //购买日期
	LinkList p;
	if((fp=fopen("records.txt","r"))==NULL) {
		printf("can not open file !");
		return ;
	}
	while(!feof(fp)) {
		fscanf(fp,"%d %s %f %s %s %s %s",&number,name,&price,kind,state,factory,date);
		//读取文件数据
		p=(LinkList)malloc(sizeof(LinkNode));
		p->data.number=number;//赋值操作
		strcpy(p->data.name,name);//复制函数
		p->data.price=price;
		strcpy(p->data.kind,kind);
		strcpy(p->data.state,state);
		strcpy(p->data.factory,factory);
		strcpy(p->data.date,date);
		p->next=head->next;
		head->next=p;
	}
	fclose(fp);

}

void createLista(LinkLista heada) { //创建单链表
	int numbera;                 //编号
	char namea[20];              //名称
	float pricea;                //单价
	char kinda[29];              //学号
	char statea[20];             //姓名
	char factorya[20];           //数量
	char datea[20];              //日期
}


void createListb(LinkListb headb) { //创建单链表
	int number;                 //编号
	char name[20];              //名称
	float price;                //单价
	char kind[29];              //学号
	char state[20];             //姓名
	char factory[20];           //数量
	char date[20];              //日期
}

void deleteXjc(LinkList head) { //按编号删除已报废的体育器材的信息
	LinkList p,q,v;
	int number;
	printf("请输入要删除借出体育器材的编号:");
	scanf("%d",&number);
	printf("\n编号 名称 单价 学号 姓名 数量 日期 \n");
	q=head;
	p=head->next;
	while(p) {
		if(p->data.number==number) {
			v=p;
			p=p->next;
			q->next=p;
			free(v);
		} else {
			q=p;
			p=p->next;
		}
	}
	printList(head);
}

void deleteX(LinkList head) { //按编号删除已报废的体育器材的信息
	LinkList p,q,v;
	int number;
	printf("请输入要删除指定体育器材的编号:");
	scanf("%d",&number);
	printf("\n编号 名称 单价 类别 数量 生产厂家 购买日期 \n");
	q=head;
	p=head->next;
	while(p) {
		if(p->data.number==number) {
			v=p;
			p=p->next;
			q->next=p;
			free(v);
		} else {
			q=p;
			p=p->next;
		}
	}
	printList(head);
}

void deleteXgh(LinkLista heada) { //按编号删除已报废的体育器材的信息
	LinkLista p,q,v;
	int number;
	printf("请输入要删除归还体育器材的编号:");
	scanf("%d",&number);
	printf("\n编号 名称 单价 学号 姓名 数量 日期 \n");
	q=heada;
	p=heada->next;
	while(p) {
		if(p->data.numbera==number) {
			v=p;
			p=p->next;
			q->next=p;
			free(v);
		} else {
			q=p;
			p=p->next;
		}
	}
	printLista(heada);
}


void sort(LinkList head) { //排序函数的设计

	LinkList q,p,u;
	p=head->next;
	head->next=NULL;//利用原表头结点建新的空表
	while(p) {
		q=p;//q为被插入的结点
		p=p->next;//用p记录后继结点
		//遍历新链表查找插入位置
		u=head;
		while(u->next!=NULL) { //查找插入位置(降序)
			if(u->next->data.number>q->data.number)
				break;
			u=u->next;
		}
		//插入在u结点的后面
		q->next=u->next;
		u->next=q;
	}
	printList(head);  //输出排序后的单链表

}

void find(LinkList head) { //查询函数的设计(7个数据的查询)
	int number,num;
	float price;
	char name[20],kind[29],state[20],factory[20],date[20];
	LinkList p;
	p=head->next;//将p指向头结点的next
	printf("\n(1.编号 2.名称 3.单价 4.类别 5.数量 6.生产厂家 7.购买日期)\n");
	printf("请选择您要查询的信息项(输入序号):");
	scanf("%d",&number);//输入查询的信息项(大方向)

	if(number==1) { //编号查询
		printf("请输入您要查询的体育器材编号:");
		scanf("%d",&num);//输入第几个编号
		while(p) { //输出新链表
			if(p->data.number==num) {
				printf(" %d   %s   %f    %s   %s  %s    %s  \n",
				       p->data.number,p->data.name,p->data.price,
				       p->data.kind,p->data.state,p->data.factory,p->data.date);
			}
			p=p->next;
		}
	} else if(number==2) { //名称查找
		printf("请输入您要查询的体育器材名称:");
		scanf("%s",name);
		while(p) { //同理
			if(strcmp(p->data.name,name)==0) { //字符数组用strcmp函数 即相等的话则输出
				printf(" %d   %s   %f    %s   %s  %s    %s  \n",
				       p->data.number,p->data.name,p->data.price,
				       p->data.kind,p->data.state,p->data.factory,p->data.date);
			}
			p=p->next;
		}
	}

	else if(number==3) { //单价查找
		printf("请输入您要查询的体育器材单价:");
		scanf("%f",&price);
		printf("编号  名称  单价  类别  数量  生产厂家  购买日期  \n\n");
		while(p) {
			if(p->data.price==price) {
				printf(" %d   %s   %f    %s   %s  %s    %s  \n",
				       p->data.number,p->data.name,p->data.price,
				       p->data.kind,p->data.state,p->data.factory,p->data.date);
			}
			p=p->next;
		}
	} else if(number==4) { //类别查找
		printf("请输入您要查询的体育器材类别:");
		scanf("%s",kind);
		while(p) {
			if(p->data.kind==kind) {
				printf(" %d   %s   %f    %s   %s  %s    %s  \n",
				       p->data.number,p->data.name,p->data.price,
				       p->data.kind,p->data.state,p->data.factory,p->data.date);
			}
			p=p->next;
		}
	} else if(number==5) { //职业查找
		printf("请输入您要查询的体育数量状态:");
		scanf("%s",state);
		while(p) {
			if(strcmp(p->data.state,state)==0) {
				printf(" %d   %s   %f    %s   %s  %s    %s  \n",
				       p->data.number,p->data.name,p->data.price,
				       p->data.kind,p->data.state,p->data.factory,p->data.date);
			}
			p=p->next;
		}
	} else if(number==6) { //爱好查找
		printf("请输入您要查询的体育器材生产厂家:");
		scanf("%s",factory);
		while(p) {
			if(strcmp(p->data.factory,factory)==0) {
				printf(" %d   %s   %f    %s   %s  %s    %s  \n",
				       p->data.number,p->data.name,p->data.price,
				       p->data.kind,p->data.state,p->data.factory,p->data.date);
			}
			p=p->next;
		}
	} else if(number==7) { //发帖数量查找
		printf("请输入您要查询的体育器材购买日期:");
		scanf("%s",date);
		while(p) {
			if(p->data.date==date) {
				printf(" %d   %s   %f    %s   %s  %s    %s  \n",
				       p->data.number,p->data.name,p->data.price,
				       p->data.kind,p->data.state,p->data.factory,p->data.date);
			}
			p=p->next;
		}
	} else { //如果都不是 则输出错误 并再进入到inquire函数中
		printf("\n您的输入有误,请重新输入。\n");
		find(p);
	}
}

void switchfind(LinkList head,LinkLista heada,LinkListb headb) {
	int i;
	printf("请输入查询类型:\n 1:库存查询 2:借出查询 3:归还查询 : ");
	scanf("%d",&i);
	switch(i) {
		case 1:
			printf("编号  名称  单价  类别  状态  生产厂家  购买日期  \n\n");
			find(head);
			break;
		case 2:
			printf("编号  名称  单价  数量  学号  姓名  日期  \n\n");
			printLista(heada);
			break;
		case 3:
			printf("编号  名称  单价  数量  学号  姓名  日期  \n\n");
			printListb(headb);
			break;
	}
}

void update(LinkList head) { //更新函数
	LinkList p;
	p=head->next;
	int number;
	float price;
	char name[20],kind[10],state[19],factory[10],date[19];
	printf("请输入你要更新的体育器材编号:");
	scanf("%d",&number);
	while(p) {
		if(p->data.number==number) { //字符数组用strcmp比较函数 即相等的话则输出
			printf("编号 名称 单价 类别 数量 生产厂家 购买日期 \n");
			scanf("%d %s %f %s %s %s %s",&number,name,&price,kind,state,factory,date);
			p->data.number=number;
			strcpy(p->data.name,name);
			p->data.price=price;
			strcpy(p->data.kind,kind);
			strcpy(p->data.state,state);
			strcpy(p->data.factory,factory);
			strcpy(p->data.date,date);
			printf("编号 名称 单价 类别 数量 生产厂家 购买日期 \n\n");
			printList(head);
		}
		p=p->next;
	}
}

void insertX(LinkList head) { //(尾插)插入函数
	int flag=0;
	datatype New;//数据类型
	LinkList p,q,lp;//指针类型
	int number;
	float price;
	char name[20],kind[29],state[20],factory[20],date[20];
	scanf("%d %s %d %s %s %s %s",&New.number,New.name,&New.price,New.kind,New.state,New.factory,New.date);
	lp=(LinkList)malloc(sizeof(LinkNode));//建立一个结点
	lp->data=New;
	q=head;
	p=head->next;
	while(p!=NULL) {
		if(p->data.number == New.number) {
			lp->next=q->next;
			q->next=lp;
			printf("\n插入新的体育器材信息成功!\n");
			flag=1;
			break;
		} else {
			p=p->next;
			q=q->next;
		}
	}
	if(flag==0) {
		lp->next=q->next;
		q->next=lp;
		printf("\n插入新的体育器材信息成功!\n");
	}
	printList(head);
}

void insertXa(LinkLista heada) { //(尾插)插入函数
	int flag=0;
	datatypea New;//数据类型
	LinkLista p,q,lp;//指针类型
	int number;
	float price;
	char namea[20],kinda[29],statea[20],factorya[20],datea[20];
	scanf("%d %s %d %s %s %s %s",&New.numbera,New.namea,&New.pricea,New.kinda,New.statea,New.factorya,New.datea);
	lp=(LinkLista)malloc(sizeof(LinkNodea));//建立一个结点
	lp->data=New;
	q=heada;
	p=heada->next;
	while(p!=NULL) {
		if(p->data.numbera == New.numbera) {
			lp->next=q->next;
			q->next=lp;
			printf("\n插入新的体育器材信息成功!\n");
			flag=1;
			break;
		} else {
			p=p->next;
			q=q->next;
		}
	}
	if(flag==0) {
		lp->next=q->next;
		q->next=lp;
		printf("\n插入新的借出体育器材信息成功!\n");
	}
	printLista(heada);

}

void insertXb(LinkListb headb) { //(尾插)插入函数
	int flag=0;
	datatype New;//数据类型
	LinkListb p,q,lp;//指针类型
	int number;
	float price;
	char name[20],kind[29],state[20],factory[20],date[20];
	scanf("%d %s %d %s %s %s %s",&New.number,New.name,&New.price,New.kind,New.state,New.factory,New.date);
	lp=(LinkListb)malloc(sizeof(LinkNodeb));//建立一个结点
	lp->data=New;
	q=headb;
	p=headb->next;
	while(p!=NULL) {
		if(p->data.number == New.number) {
			lp->next=q->next;
			q->next=lp;
			printf("\n插入新的归还体育器材信息成功!\n");
			flag=1;
			break;
		} else {
			p=p->next;
			q=q->next;
		}
	}
	if(flag==0) {
		lp->next=q->next;
		q->next=lp;
		printf("\n插入新的归还体育器材信息成功!\n");
	}
	printListb(headb);
}



void amount(LinkList head) { //统计函数
	LinkList p;
	p=head->next;
	int count=0;
	char factory[10],kind[10];
	printf("请输入你要搜索的生产厂家和种类:");
	scanf("%s %s",factory,kind);
	while(p) {
		if(strcmp(p->data.factory,factory)==0) {
			if(strcmp(p->data.kind,kind)==0) {
				count++;
			}
		}
		p=p->next;
	}
	printf("输出%s厂家的%s器材数量为:%d\n",factory,kind,count);
}

void amounta(LinkLista heada) { //统计函数
	LinkLista p;
	p=heada->next;
	int count=0;
	char factory[10],kind[10];
	printf("请输入你要搜索的生产厂家和种类:");
	scanf("%s %s",factory,kind);
	while(p) {
		if(strcmp(p->data.factorya,factory)==0) {
			if(strcmp(p->data.kinda,kind)==0) {
				count++;
			}
		}
		p=p->next;
	}
	printf("输出%s厂家的%s器材数量为:%d\n",factory,kind,count);
}

void save(LinkList head,char a[]) { //保存文件函数
	FILE *fp;
	LinkList p;
	if((fp=fopen("records.txt","w"))==NULL) {
		printf("不能打开文件!");
	}
	p=head->next;
	while(p!=NULL) {
		fprintf(fp,"%d %s %f %s %s %s %s\n",p->data.number,p->data.name,p->data.price,p->data.kind,p->data.state,p->data.factory,p->data.date);
		p=p->next;
	}
	fclose(fp);
}

void jiechu(LinkLista heada, LinkList head) {
	printf("编号  名称  单价  数量  学号  姓名  日期  \n\n");
	insertXa(heada);
	deleteXjc(head);
}

void gh(LinkListb headb,LinkList head,LinkLista heada) {
	printf("编号  名称  单价  数量  学号  姓名  日期  \n\n");
	insertXb(headb);
	insertX(head);
	deleteXgh(heada);
}

void insertX1(LinkList head) {
	printf("\n编号 名称 单价 类别 数量 生产厂家 购买日期 \n");
	insertX(head);
}

void welcome(LinkList head,LinkLista heada,LinkListb headb) { //欢迎界面
	LinkList p;
	char a[]= {"records.txt"};
	int i;
	p=head;
	printf("\n<功能选择>");
	printf("\n******************************");
	printf("\n1.排序 2.查询 3.更新 \n4.插入 5.删除 6.浏览 \n7.统计 8.保存 \n9.借出登记 10.归还登记 0.结束\n");
	printf("******************************\n\n");
	printf("请选择要进行的操作(序号对应,输入序号): ");
	scanf("%d",&i);
	switch(i) {
		case 1:
			sort(head);
			break;
		case 2:
			switchfind(head,heada,headb);
			break;
		case 3:
			update(head);
			break;
		case 4:
			insertX1(head);
			break;
		case 5:
			deleteX(head);
			break;
		case 6:
			printList(head);
			break;
		case 7:
			amount(head);
			break;
		case 8:
			save(head,a);
			break;
		case 9:
			jiechu(heada,head);
			break;
		case 10:
			gh(headb,head,heada);
			break;
		case 0:
			return ;
			break;
			break;
		default:
			printf("\n您输入的信息有误,请重新输入\n");
			welcome(head,heada,headb);
	}
	welcome(head,heada,headb);
}

int main() {
	LinkList head; //定义链表指针
	LinkLista heada;
	LinkListb headb;
	head=initList(); //初始化头结点
	createList(head); //建立一个单链表
	heada=initLista(); //初始化头结点
	createLista(heada); //建立一个单链表
	headb=initListb(); //初始化头结点
	createListb(headb); //建立一个单链表
	printf("初始体育器材信息:\n");
	printf("\n编号 名称 单价 类别 数量 生产厂家 购买日期 \n");
	printList(head); //浏览体育器材信息
	welcome(head,heada,headb); //使用体育器材管理系统
	return 0;
}

这个课程设计仅供大家参考,如有疑问可以随时垂询! 

 

 

  • 5
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

扎心小指针0

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值