#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;
}
这个课程设计仅供大家参考,如有疑问可以随时垂询!