#include #include #include #include struct device { char num[10]; //设备编号 char kind[15]; //设备种类 char name[15]; //设备名称 char price[10]; //设备价格 char buydata[10]; //设备购买日期 char whether_scrap[10]; //是否报废 char scrapdata[15]; //报废日期 char whether_damage[5]; //是否损坏 char mendcost[10]; //维修价格 char handleway[5]; //处理方式 }; typedef struct node { struct device data; struct node *next; //建立一个链表。 }Node; void Add(Node *equip) //设备的录入 { Node *p,*r,*s; char id[10]; //先用于输入num,也用于判断是否跳出循环 r=equip; s=equip->next; //使s为第一个有用的结点 while(r->next!=NULL) //这个循环的作用是使r为最后一个有用的结点 r=r->next; //将指针置于最末尾 while(1) { printf("\t\t >>>>>>>>>>提示:输入0则返回主菜单!<<<<<<<<<<\n"); printf("\n请你输入设备num号:"); scanf("%s",id); if(strcmp(id,"0")==0) break; p=(Node *)malloc(sizeof(Node)); //申请空间 strcpy(p->data.num,id); printf("\n请输入设备种类:"); scanf("%s",p->data.kind); printf("\n请输入设备名称:"); scanf("%s",p->data.name); printf("\n请输入设备价格:"); scanf("%s",&p->data.price); printf("\n请输入设备购买时间:"); scanf("%s",&p->data.buydata); printf("\n请输入设备是否报废:"); scanf("%s",&p->data.whether_scrap); printf("\n请输入报废日期:"); scanf("%s",&p->data.scrapdata); strcpy(p->data.whether_damage,"-"); strcpy(p->data.mendcost,"-"); strcpy(p->data.handleway,"-"); printf("\t\t>>>>>>>>>>提示:已经完成一条记录的添加。<<<<<<<<<<\n\n"); p->next=NULL; r->next=p; //这一步是必需的,将p与先前的链表连起来构成一条新链表 r=p; //也是必需的.将r 又重设为新链的最后一个有用结点 } } void Modify(Node *equip)//设备的修改 { Node *p; char find[20]; if(!equip->next) { printf("\n\t\t>>>>>>>>>>提示:没有数据可以修改!<<<<<<<<<\n\n\n"); return; } printf("请输入要修改的设备num号:"); scanf("%s",find); p=equip->next; while(p!=NULL) { if(strcmp(p->data.num,find)==0) //如果找到的话返回的是符合要求 break; p=p->next; } if(p) //若找到 { int x; while(1) { printf("完成修改请输入0,否则输入任意数再进行修改:"); scanf("%d",&x); if(x==0) {break;} printf("请输入新设备号(原来是 %s ):",p->data.num); printf("请输入新设备名称(原来是 %s ):",p->data.name); scanf("%s",p->data.name); printf("请输入新设备设备种类名称(原来是 %s ):",p->data.kind); scanf("%s",p->data.kind); printf("请输入新设备报废日期名称(原来是 %s ):",p->data.scrapdata); scanf("%s",p->data.scrapdata); printf("请输入新设备是否报废(原来是 %s ):",p->data.whether_scrap); scanf("%s",p->data.whether_scrap); printf("请输入新设备购买时间(原来是 %s ):",p->data.buydata); scanf("%s",p->data.buydata); printf("请输入新设备价格(原来是 %s ):",p->data.price); scanf("%s",p->data.price); printf("\n\t\t>>>>>>>>>>提示:该项记录数据已经成功修改!<<<<<<<<<<\n"); } } else printf("\n\t\t>>>>>>>>>>提示:你要修改的信息不存在!<<<<<<<<<<\n"); } void Disp(Node *equip)//输出记录 { Node *p,*p1; p=equip->next; if(!p) { printf("\n\t\t>>>>>>>>>>提示:没有数据可以显示!<<<<<<<<<\n\n\n"); return; } printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐"); printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│"); printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│"); printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤"); int count=0,count1=0; p1=equip; while(p1!=NULL) { count++; p1=p1->next; while(p) { printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway); printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤"); count1++; p=p->next; } } printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘\n\n\n\n\n"); } void Statistics(Node *equip)//设备的分类统计 { Node *p; int sel;int flag2=0,ha=0; p=equip->next; char find[20]; if(!p) //若链表为空 { printf("\n\t\t>>>>>>>>>>提示:没有数据可以统计分类!<<<<<<<<<<\n"); return; } printf("\t提示:\n\t0:退出\n\t1:按设备种类统计\n\t2:按设备名称统计\n"); scanf("%d",&sel); if(sel==1) { printf("\n输入你要统计分类的设备种类:"); scanf("%s",find); while(p) { if(strcmp(p->data.kind,find)==0) //计算符合条件的个数 { flag2++; } p=p->next; } p=equip->next; if(flag2) { printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐"); printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│"); printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│"); printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤"); while(p) { if(strcmp(p->data.kind,find)==0) { printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway); printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤"); } p=p->next; } printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘"); } if(flag2) { printf("\n\t\t\t按设备种类%s统计分类的有%d条记录:\t\t\t\n\n\n\n\n",find,flag2); } else { printf("\n\t\t\t按设备种类%s统计的结果为0个\t\t\n\n\n\n",find); } } else if(sel==2) { printf("\n输入你要统计分类的设备名称:"); scanf("%s",find); while(p) { if(strcmp(p->data.name,find)==0) //计算符合条件的个数 { flag2++; } p=p->next; } p=equip->next; if(flag2) { printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐"); printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│"); printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│"); printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤"); while(p) { if(strcmp(p->data.name,find)==0) { printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway); printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤"); } p=p->next; } printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘"); } if(flag2) { printf("\n\t\t\t按设备名称%s统计分类的有%d条记录:\t\t\t\n\n\n\n\n",find,flag2); } else { printf("\n\t\t\t按设备名称%s统计的结果为0个\t\t\n\n\n\n",find); } } else if(sel==0) return; } void Cost_handleway(Node *equip) //设备的破损耗费和遗损处理 { Node *p; char find[20]; if(!equip->next) { printf("\n\t\t>>>>>>>>>>提示:没有资料可以修改!<<<<<<<<<<\n"); return; } printf("请输入要修改破损耗费和遗损处理的设备num号:"); scanf("%s",find); p=equip->next; while(p!=NULL) { if(strcmp(p->data.num,find)==0) //如果找到的话返回的是符合要求 break; p=p->next; } if(p) //若找到 { int x; printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐"); printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│"); printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│"); printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤"); printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway); printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘"); while(1) { printf("完成修改请输入0否则输入任意数再进行修改:"); scanf("%d",&x); if(x==0) {break;} printf("请输入该设备是否损坏(原来是 %s ):",p->data.whether_damage); scanf("%s",p->data.whether_damage); printf("请输入该设备的破损耗费(原来是 %s ):",p->data.mendcost); scanf("%s",p->data.mendcost); printf("请输入该设备的处理方式(原来是 %s ):",p->data.handleway); scanf("%s",p->data.handleway); printf("\n\t >>>>>>>>>>提示:该设备的破损耗费和遗损处理修改成功!<<<<<<<<<<\n"); } } else printf("\n\t\t>>>>>>>>>>提示:你要修改的信息不存在!<<<<<<<<<<\n"); } void Query(Node *equip) //设备的查询 { Node *p; char find[20]; if(!equip->next) { printf("\n\t\t>>>>>>>>>>提示:没有数据可以查询!<<<<<<<<<<\n"); return; } printf("查询完成后输入0退到主界面...\n"); printf("请输入要查询的设备num号:"); scanf("%s",find); p=equip->next; while(1) { if(find==0) {break;} while(p!=NULL) { if(strcmp(p->data.num,find)==0) //如果找到的话返回的是符合要求 break; p=p->next; } if(p) //若找到 { printf("┌──┬───┬────┬──┬─────┬──┬─────┬──┬──┬──┐"); printf("│设备│ 设备 │设备名称│设备│ 设备购入 │是否│ 报废日期 │是否│破损│处理│"); printf("│编号│ 种类 │ │价格│ 日期 │报废│ │损坏│耗费│方式│"); printf("├──┼───┼────┼──┼─────┼──┼─────┼──┼──┼──┤"); printf("│%4s│%6s│%8s│%4s│%10s│%4s│%10s│%4s│%4s│%4s│",p->data.num,p->data.kind,p->data.name,p->data.price,p->data.buydata,p->data.whether_scrap,p->data.scrapdata,p->data.whether_damage,p->data.mendcost,p->data.handleway); printf("└──┴───┴────┴──┴─────┴──┴─────┴──┴──┴──┘"); break; } else { printf("\n\t\t>>>>>>>>>>提示:你要修改的信息不存在!<<<<<<<<<<\n"); break; } } } void save(Node *equip) //二进制保存到文本 { Node *p1,*p2; p1=equip->next; FILE *fp1; if((fp1=fopen("d:/设备管理系统.txt","wb"))==NULL) {return;} else { while(p1!=NULL) { fwrite(p1,sizeof(p1->data),1,fp1); //将文件的内容放入接点中 p2=p1; p1=p1->next; free(p2); } } fclose(fp1); //关闭文件 } Node *load() //载入二进制文本 { Node *p,*pNode; FILE *fp1; pNode = NULL; if((fp1=fopen("d:/设备管理系统.txt","rb"))==NULL) { printf("硬盘中未存有数据!!\n\n"); return pNode; } else { int bFirst=1; long rs = 1; while (rs) { Node *p1 = (Node*)malloc(sizeof(Node)); memset(p1,0,sizeof(Node)); // 将新的空间清0 rs = fread(&p1->data,sizeof(p1->data),1,fp1); //将文件的内容放入接点中 if (rs) { if (bFirst) {// pNode 记录了链表的首位置 bFirst=0; pNode=p1; p=p1; } else {//p指向当前的最后一项,读取了数据就加到链表尾,然后再将p指向当前的尾 p->next=p1; p=p1; } } } } fclose(fp1);//关闭文件 return pNode; } int main()//主函数 { Node *equip; Node *p; int flag; equip=(Node*)malloc(sizeof(Node)); equip->next=NULL; p=equip; equip->next=load(); while(1) { printf("\t\t******************************************\n"); printf("\t\t* *\n"); printf("\t\t* 实验设备管理系统*\n"); printf("\t\t* *\n"); printf("\t\t* [1] 查看所有设备信息 *\n"); printf("\t\t* [2] 设备的录入 *\n"); printf("\t\t* [3] 设备的修改 *\n"); printf("\t\t* [4] 设备的分类统计 *\n"); printf("\t\t* [5] 设备的破损耗费和遗损处理 *\n"); printf("\t\t* [6] 设备的查询 *\n"); printf("\t\t* [0] 退出 *\n"); printf("\t\t* *\n"); printf("\t\t******************************************\n"); printf("\n\n请输入你要操作的序号:"); scanf("%d",&flag); switch(flag) { case 0: {printf("\n\t\t>>>>>>>>>>提示:已经退出系统,ByeBye!<<<<<<<<<<\n\n\n"); save(equip); exit(0);}break; //退出系统并保存数据 case 1: Disp(equip); break;//显示所有记录信息 case 2: Add(equip); break; //设备的录入 case 3: Modify(equip); break;//设备的修改 case 4: Statistics(equip); break;//设备的分类统计 case 5: Cost_handleway(equip); break;//设备的破损耗费和遗损处理 case 6: Query(equip); break;//设备的查询 default: printf("\n\t\t>>>>>>>>>>提示:输入错误!<<<<<<<<<<\n"); break; } } }