C语言课程设计:新冠疫情管理系统
代码用.c文件存储
功能模块图
函数调用图
不足与改进
1.1不足:密码系统是用二维数组来实现的,导致注册账户是临时的,退出程序时不会保存。
改进:若想账户永久可用,需要把密码功能改为用文件来存username和password
1.2不足:代码没有加密
改进:密码可以用异或运算来进行加密与解密
2.2不足:输入18位身份证号只是用整数存储,若末尾X无法存储。
改进:身份证号需用字符数组存储,之后,判断前17位是否为0至9,最后一位是否为0至9外加X
2.2不足:输入电话号只是用整数存储,只是判断它是否是数字1开始的11位整数,即大于等于10000000000小于等于19999999999
改进:电话号需用字符数组存储,之后,判断第1位是否1,剩余10位是否为0至9
3.不足:添加功能:如再一次使用此功能将会请空先前的数据
改进:需用把原链表复制到新链表,之后进行尾插法
4.不足:修改、插入、删除功能:只是根据结点的添加序号来进行的
改进:可以按照类似简单统计(即对温度查询)的方法来实现对某一关键字类进行修改、插入、删除的功能
5.不足:读取文件有乱码
/** 用户只能添加、修改、插入、打印报表 name yonghu1 yonghu2 password yonghu1 yonghu2 管理员可以添加、修改、插入、删除、查询、功能(统计、排序)、打印报表、文件操作 name guanli1 guanli2 password guanli1 guanli2 */ /** 1.数据录入:录入系统基本数据,用链表组织;//1 添加 2.数据存储:用文件的形式将录入的数据存储; //8 文件 1 3.数据读写:对文件中的数据可以进行读写操作; //8 文件 2 4.数据修改:可以对已存在的旧数据进行修改操作;//2 修改 5.数据插入:可以将新数据插入到任意指定的位置;//3 6.数据删除:可以对已存在的旧数据进行删除操作;//4 7.数据查询:按要求对数据进行查询,至少含两项//5 简单查询以及一项组合查询; 8.数据统计:按要求对数据进行统计//6功能 1 含简单统计及综合统计; 9.数据排序:按要求对数据进行排序//6功能 1 含升序排序及降序排序; 10.数据报表:按要求对数据打印报表,//7 依规定的报表格式对数据打印报表; 11.界面:设计总体菜单界面。 */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include <conio.h> #define N 10 /** 数据结构体 */ struct Data{ //信息 char name[20]; //姓名 int number; //学号 double temperature; //体温 (35-42) long long int id; //身份证号(18位) long long int phone;//电话号 (11位) char address[20]; //地址 }; /** 链表 */ typedef struct node{ struct Data data; struct node *next; }Node,*LinkList; /** 链表初始化 */ LinkList InitList(){ LinkList head; head=(Node*)malloc(sizeof(Node)); head->next=NULL; return head; } int readInt(int n1,int n2); long long int readLong(long long int n1,long long int n2); char readConfirmSelection(); void systemmain(); void help(); void User (); void Admin(); void mi(char word[]); struct Data DataInput();//1.1 void CreatByRear(LinkList head);//1.2 void Modify(LinkList head,int i);//2.1 void viewModify(LinkList head);//2.2 void Insert (LinkList head,int i);//3.1 void viewInsert(LinkList h);//3.2 void Delete (LinkList head,int pos);//4.1 void viewDelete(LinkList h);//4.2 void SearchName(LinkList head,char name[]);//5.1.1 void viewSearchName(LinkList head);//5.1.2 void SearchNum(LinkList head,int number);//5.2.1 void viewSearchNum(LinkList h);//5.2.2 void SearchNameNum(LinkList head,char name[],int num);//5.3.1 void viewSearchNameNum(LinkList head);//5.3.2 void viewSearch(LinkList head);//5 void easycount(LinkList h,double t);//6.1.1 void vieweasycount(LinkList h);//6.1.2 void count(LinkList h,double t1,double t2);//6.2.1 void viewcount(LinkList h);//6.2.2 void viewascendingsort(LinkList h);//6.3 void viewdescendingsort(LinkList h);//6.4 void Fuction(LinkList h);//6 void DataOutput(struct Data data);//7.1 void OutPut(LinkList head);//7.2 void storage(); //8.1 LinkList read();//8.2.1 LinkList viewread(LinkList h);//8.2.2 void write();//8.3 LinkList file(LinkList h);//8 void adminview(LinkList h); /** main (创建单链表,调用view) */ int main(){ LinkList h; h=InitList(); systemmain(h); } /** 用于从键盘中获取指定范围的整数,用于选择操作 */ int readInt(int n1,int n2){ int n; scanf("%d",&n); while(n<n1||n>n2){ printf("请重新输入:"); scanf("%d",&n); } return n; } /** 用于从键盘中获取指定范围的长整数,用于输入操作 */ long long int readLong(long long int n1,long long int n2){ long long int n; scanf("%lld",&n); while(n<n1||n>n2){ printf("请重新输入:"); scanf("%lld",&n); } return n; } /** 用于从键盘中获取指定范围的实数,用于输入操作 */ double readDouble(double n1,double n2){ double n; scanf("%lf",&n); while(n<n1||n>n2){ printf("请重新输入:"); scanf("%lf",&n); } return n; } /** 用于从键盘中获取'y'或'n' */ char readConfirmSelection(){ char c; for(; ;) { fflush(stdin); scanf("%c",&c); if(c=='y'||c=='n') { break; }else { printf("选择错误,请重新输入:"); } } return c; } //用于密码输入 void mi(char word[]){ int i=0; int is_b=0; char c; while(1){ c=_getch(); if(c=='\r'){ if(is_b==1){ word[i]=0; } break; }else if(c=='\b'){ is_b=1; printf("\b \b"); --i; }else{ word[i++]=c; printf("*"); } } printf("\n"); } //倒计时 void daojishi (int a){ // printf("请在%d秒后执行下一操作",a); // system("color 0a"); //指定倒计时在运行时的颜色 while(a>=0) { // system("cls");//清屏 printf("%d ",a); Sleep(1000); a=a-1; } // system("pause");//暂停程序 printf("\n"); } /** 用户界面 参数 LinkList h */ void userview(LinkList h){ char isFlag='y'; while(isFlag!='n'){ printf("****************用户管理系统****************\n"); printf(" 1 添加\n"); printf(" 2 插入\n"); printf(" 3 修改\n"); printf(" 4 列表\n"); printf(" 5 退出\n"); printf("请选择(1-5):"); int selection; selection=readInt(1,5); switch(selection){ case 1: printf("*************添加*************\n"); CreatByRear(h); break; case 2: printf("*************插入*************\n"); viewInsert(h); break; case 3: printf("*************修改*************\n"); viewModify(h); break; case 4: printf("*************列表*************\n"); OutPut(h); break; case 5:{ getchar(); printf("请确认是否退出(y或n):"); char isExit; isExit=readConfirmSelection(); if(isExit=='y'){ isFlag='n'; } } } } } /** 管理员界面 参数 LinkList h */ void adminview(LinkList h){ char isFlag='y'; while(isFlag!='n'){ printf("******************管理员系统******************\n"); printf(" 1 添加\n"); printf(" 2 修改\n"); printf(" 3 插入\n"); printf(" 4 删除\n"); printf(" 5 查询\n"); printf(" 6 功能\n"); printf(" 7 列表\n"); printf(" 8 文件\n"); printf(" 9 退出\n"); printf("请选择(1-9):"); int selection; selection=readInt(1,9); switch(selection){ case 1: printf("*************添加*************\n"); CreatByRear(h); break; case 2: printf("*************修改*************\n"); viewModify(h); break; case 3: printf("*************插入*************\n"); viewInsert(h); break; case 4: printf("*************删除*************\n"); viewDelete(h); break; case 5: // printf("*************查询*************\n"); viewSearch(h); break; case 6: // printf("*************功能*************\n"); Fuction(h); break; case 7: printf("*************列表*************\n"); OutPut(h); break; case 8: // printf("*************文件*************\n"); h=file(h); break; case 9:{ getchar(); printf("请确认是否退出(y或n):"); char isExit; isExit=readConfirmSelection(); if(isExit=='y'){ isFlag='n'; } } } } } /** 系统界面 */ void systemmain(LinkList h){ while(1){ printf("*******************新冠疫情管理系统*******************\n"); printf(" 1用户登录\n"); printf(" 2管理员登录\n"); printf(" 3 帮助\n"); printf(" 4 退出\n"); printf("请输入(1-4):"); int selection=0; selection=readInt(1,4); switch(selection){ case 1: User(h); break; case 2: Admin(h); break; case 3: help(); break; case 4:{ printf("请确认是否退出(y或n):"); char isExit; isExit=readConfirmSelection(); if(isExit=='y'){ return; } } } } } //帮助 void help(){ printf("帮助\n"); printf("用户手册:\n"); printf("用户只能添加、修改、插入、打印报表\n"); printf("管理员手册:\n"); printf("管理员可以添加、修改、插入、删除、查询、功能(统计、排序)、打印报表、文件操作\n\n"); } //用户登录界面 void User(LinkList h){ char username[10][N] = {"yonghu1","yonghu2"}; char password[10][N] = {"yonghu1","yonghu2"}; char name[10]; char word[10]; int n=2; while(1){ printf("****************用户登录系统****************\n"); printf(" 1登录\n"); printf(" 2注册\n"); printf(" 3退出\n"); printf("请选择(1-3):"); int choice; choice=readInt(1,3); switch(choice){ case 1:{ printf("登录\n"); int signin=0; while(1){ printf("\t请输入账户名:\n"); printf("\t账户名:"); scanf("%s",name); printf("\n"); int i=0; int isThree=1; for(i=0;i<n;i++){ if( strcmp(username[i] , name) == 0) { printf("\t请输入密码:\n"); printf("\t密码:"); // scanf("%s",word); mi(word); for(isThree=1;isThree<4;isThree++){ if( strcmp( password[i] , word) == 0 ) { printf("\n\n"); printf("\t*******************************\n"); printf("\t***** 欢迎用户\"%s\"! *****\n",name); printf("\t*******************************\n"); printf("\n\n"); userview(h); signin=1; break; } else { // puts(word); if(isThree==3){ printf("\t密码错误超过3次\n\n"); break; } printf("\t密码错误,请在5秒后再次输入密码\n"); printf("\t"); daojishi(5); printf("\t请重新输入密码!\n"); printf("\t密码:"); mi(word); if( strcmp( password[i] , word) == 0 ){ printf("\n\n"); printf("\t*******************************\n"); printf("\t***** 欢迎用户\"%s\"! *****\n",name); printf("\t*******************************\n"); printf("\n\n"); userview(h); signin=1; break; } } } } } if(signin==1){ break; } if(i==n){ printf("\t账户名或密码错误\n"); printf("\t 1重新输入账户名\n"); printf("\t 2临时注册账户名\n"); printf("\t 3 退出\n"); printf("\t请输入:"); int selection; selection=readInt(1,3); if(selection==1){ ; }else if(selection==2){ while(1){ printf("\t注册\n"); printf("\t输入账户名:"); scanf("%s",&username[n]); printf("\t输入密码:"); mi(password[n]); printf("\t请再次输入,以确认密码:"); char twiceword[18]; mi(twiceword); if(strcmp(password[n],twiceword)==0){ printf("\t注册成功\n\n"); n++; break; }else{ printf("\t确认密码失败,重新注册\n"); } } }else{ break; } } } break; } case 2:{ while(1){ printf("\t注册\n"); printf("\t输入账户名:"); scanf("%s",&username[n]); printf("\t输入密码:"); mi(password[n]); printf("\t请再次输入,以确认密码:"); char twiceword[18]; mi(twiceword); if(strcmp(password[n],twiceword)==0){ printf("\t注册成功\n\n"); n++; break; }else{ printf("\t确认密码失败,重新注册\n"); } } break; } case 3:{ printf("请确认是否退出(y或n):"); char isExit; isExit=readConfirmSelection(); if(isExit=='y'){ return; } } } } } //管理员登录界面 void Admin(LinkList h){ char name[10]; char word[10]; char username[10][N] = {"guanli1","guanli2"}; char password[10][N] = {"guanli1","guanli2"}; int n=2; while(1){ printf("****************管理员登录系统****************\n"); printf(" 1登录\n"); printf(" 2注册\n"); printf(" 3退出\n"); printf("请选择(1-3):"); int choice; choice=readInt(1,3); switch(choice){ case 1:{ printf("登录\n"); int signin=0; while(1){ printf("\t请输入账户名:\n"); printf("\t账户名:"); scanf("%s",name); printf("\n"); int i=0; int isThree=1; for(i=0;i<n;i++){ if( strcmp(username[i] , name) == 0) { printf("\t请输入密码:\n"); printf("\t密码:"); mi(word); for(isThree=1;isThree<4;isThree++){ if( strcmp( password[i] , word) == 0 ) { printf("\n\n"); printf("\t*******************************\n"); printf("\t***** 欢迎管理员\"%s\"! *****\n",name); printf("\t*******************************\n"); printf("\n\n"); adminview(h); signin=1; break; } else { if(isThree==3){ printf("\t密码错误超过3次\n\n"); break; } printf("\t密码错误,请在10秒后再次输入密码\n"); printf("\t"); daojishi(10); printf("\t请重新输入!\n"); printf("\t密码:"); mi(word); if( strcmp( password[i] , word) == 0 ){ printf("\n\n"); printf("\t*******************************\n"); printf("\t***** 欢迎管理员\"%s\"! *****\n",name); printf("\t*******************************\n"); printf("\n\n"); adminview(h); signin=1; break; } } } } } if(signin==1){ break; } if(i==n){ printf("\t账户名或密码错误\n"); printf("\t 1重新输入账户名\n"); printf("\t 2临时注册账户名\n"); printf("\t 3 退出\n"); printf("\t请输入:"); int selection; selection=readInt(1,3); if(selection==1){ ; }else if(selection==2){ while(1){ printf("\t注册\n"); printf("\t输入账户名:"); scanf("%s",&username[n]); printf("\t输入密码:"); mi(password[n]); printf("\t请再次输入,以确认密码:"); char twiceword[18]; mi(twiceword); if(strcmp(password[n],twiceword)==0){ printf("\t注册成功\n\n"); n++; break; }else{ printf("\t确认密码失败,重新注册\n"); } } }else{ break; } } } break; } case 2:{ while(1){ printf("\t注册\n"); printf("\t输入账户名:"); scanf("%s",&username[n]); printf("\t输入密码:"); mi(password[n]); printf("\t请再次输入,以确认密码:"); char twiceword[18]; mi(twiceword); if(strcmp(password[n],twiceword)==0){ printf("\t注册成功\n\n"); n++; break; }else{ printf("\t确认密码失败,重新注册\n"); } } break; } case 3:{ printf("请确认是否退出(y或n):"); char isExit; isExit=readConfirmSelection(); if(isExit=='y'){ return; } } } } } /** 1.1数据输入 返回类型 struct Data data */ struct Data DataInput(){ struct Data data; printf("姓名:"); scanf("%s",data.name); printf("学号:"); data.number=readInt(1,1000000000); printf("体温(35-42):"); double temperature; temperature=readDouble(35,42); data.temperature=temperature; printf("身份证号(18位):"); data.id=readLong(100000000000000000,999999999999999999); printf("电话号(11位):"); data.phone=readLong(10000000000,19999999999); printf("地址:"); scanf("%s",data.address); return data; } /** 1.2 尾插法 参数类型LinkList head */ void CreatByRear(LinkList head){ Node *r,*s; r=head; printf("**输入**\n"); char isNext='y'; int c=0; while(isNext=='y'){ struct Data data; c+=1; printf("**%d**\n",c); data=DataInput(); s=(Node*)malloc(sizeof(Node)); s->data=data; r->next=s; r=s; printf("是否下一个(y或n):"); getchar(); isNext=readConfirmSelection(); } r->next=NULL; } /** 2.1修改 参数类型 LinkList head,int i */ void Modify(LinkList head,int i) { Node *p=head,*q; int j=0; while(j<i-1&&p){ p=p->next; j++; } if(p==NULL||p->next==NULL){ printf("无\n"); return; } q=p->next; struct Data olddata,newdata; olddata=q->data; printf("输入新姓名(%s):",olddata.name); scanf("%s",newdata.name); printf("输入新学号(%d):",olddata.number); newdata.number=readInt(1,1000000000); printf("输入新体温(35-42)(%.2f):",olddata.temperature); double temperature; temperature=readDouble(35,42); newdata.temperature=temperature; printf("身份证号(18位)(%lld):",olddata.id); newdata.id=readLong(100000000000000000,999999999999999999); printf("电话号(11位)(%lld):",olddata.phone); newdata.phone=readLong(10000000000,19999999999); printf("地址(%s):",olddata.address); scanf("%s",newdata.address); q->data=newdata; } /** 2.2 view 修改 参数类型 LinkList head */ void viewModify(LinkList head){ printf("请输入修改第几个用户:"); int n; scanf("%d",&n); Modify(head,n); } /** 3.1插入 参数类型 LinkList head,int i */ void Insert (LinkList head,int i){ Node *p=head,*s; int j=0; while(j<i-1&&p){ p=p->next; j++; } if(p==NULL){ printf("不能插入到第%d个\n",i); return; } if(p){ struct Data data; printf("输入:\n"); s=(Node*)malloc(sizeof(Node)); data=DataInput(); s->data=data; s->next=p->next; p->next=s; } } /** 3.2 view 插入 参数类型 LinkList h */ void viewInsert(LinkList h){ printf("添加到第几个:"); int i; scanf("%d",&i); Insert(h,i); } /** 4.1删除 参数类型 LinkList head,int pos */ void Delete (LinkList head,int pos){ Node *p=head,*q; int j=0; while(j<pos-1&&p){ p=p->next; j++; } if(p==NULL||p->next==NULL){ printf("无此用户\n"); } else{ q=p->next; p->next=q->next; free(q); } } /** 4.2 view删除 参数类型 LinkList h */ void viewDelete(LinkList h){ printf("删除第几个:"); int pos; scanf("%d",&pos); getchar(); printf("是否删除第%d个(y或n):",pos); char isDelete; isDelete=readConfirmSelection(); if(isDelete=='y'){ Delete(h,pos); } } /** 5.1.1查询 姓名 参数类型 LinkList head,char name[] */ void SearchName(LinkList head,char name[]){ Node *p=head->next; int isFound=0; while(p){ if(strcmp(p->data.name,name)!=0){ p=p->next; } else{ DataOutput(p->data); isFound=1; p=p->next; } } if(p==NULL&&isFound==0){ printf("没有找到姓名是%s的人\n",name); } } /** 5.1.2 view 查询 姓名 参数类型 LinkList h */ void viewSearchName(LinkList h){ printf("请输入查询的名字:"); char name[20]; scanf("%s",name); SearchName(h,name); } /** 5.2.1查询 学号 参数类型 LinkList head,int number */ void SearchNum(LinkList head,int number){ Node *p=head->next; int isFound=0; while(p){ if(p->data.number!=number){ p=p->next; } else{ DataOutput(p->data); isFound=1; p=p->next; } } if(p==NULL&&isFound==0){ printf("没有找到学号是%d的人\n",number); } } /** 5.2.2 view 查询 学号 参数类型 LinkList h */ void viewSearchNum(LinkList h){ printf("请输入查询的学号:"); int num; scanf("%d",&num); SearchNum(h,num); } /** 5.3.1 查询 姓名&学号 参数类型 LinkList head,char name[],int num */ void SearchNameNum(LinkList head,char name[],int num){ Node *p=head->next; int isFound=0; while(p){ if(strcmp(p->data.name,name)!=0||num!=p->data.number){ p=p->next; } else{ DataOutput(p->data); isFound=1; p=p->next; } } if(p==NULL&&isFound==0){ printf("没有找到姓名是%s并且学号是%d的人\n",name,num); } } /** 5.3.2 view 查询 姓名&学号 参数类型 LinkList h */ void viewSearchNameNum(LinkList h){ printf("请输入查询的名字:"); char name[20]; scanf("%s",name); printf("请输入查询的学号:"); int num; scanf("%d",&num); SearchNameNum(h,name,num); } /** 5 查询 姓名 或 学号 按要求对数据进行查询,至少含两项简单查询以及一项组合查询; 参数类型 LinkList h */ void viewSearch(LinkList h){ char isFlag='y'; while(isFlag!='n'){ printf("*************查询*************\n"); printf(" 1 查询 姓名\n"); printf(" 2 查询 学号\n"); printf(" 3 查询 姓名&学号\n"); printf(" 4 查询 退出\n"); printf("请选择(1-4):"); int searchSelection; searchSelection=readInt(1,4); switch(searchSelection){ case 1: printf("******查询 姓名******\n"); viewSearchName(h); break; case 2: printf("******查询 学号******\n"); viewSearchNum(h); break; case 3: printf("****查询 姓名&学号****\n"); viewSearchNameNum(h); break; case 4: getchar(); printf("请确认是否退出查询(y或n):"); char isExit; isExit=readConfirmSelection(); if(isExit=='y'){ isFlag='n'; } } } } /** 6.1.1 数据统计:按要求对温度 进行简单统计 参数类型 LinkList h,double t */ void easycount(LinkList h,double t){ Node *p=h->next; char isNull='y'; while(p){ if(p->data.temperature==t){ DataOutput(p->data); isNull='n'; } p=p->next; } if(isNull=='y'){ printf("没有温度是%.2f的人\n",t); } } /** 6.1.2 数据统计:按要求对温度进行简单统计 参数类型 LinkList h */ void vieweasycount(LinkList h){ printf("请输入温度(35-42):"); double temperature; temperature=readDouble(35,42); easycount(h,temperature); } /** 6.2.1 数据统计:按要求对温度进行综合统计 参数类型 LinkList h,double t1,double t2 */ void count(LinkList h,double t1,double t2){ Node *p=h->next; char isNull='y'; while(p){ if(p->data.temperature>=t1&&p->data.temperature<=t2){ DataOutput(p->data); isNull='n'; } p=p->next; } if(isNull=='y'){ printf("没有温度是%.2f-%.2f的人\n",t1,t2); } } /** 6.2 数据统计:按要求对温度进行综合统计 参数类型 LinkList h */ void viewcount(LinkList h){ printf("请输入一个温度范围:\n"); printf("请输入小温度(35-42):"); double temperature1; temperature1=readDouble(35,42); printf("请输入大温度(%.2f-42):",temperature1); double temperature2; temperature2=readDouble(temperature1,42); count(h,temperature1,temperature2); } /** 升序(学号) */ void viewascendingsort(LinkList head){ Node *pb,*pf,temp; pf=head->next; if(head->next==NULL){ printf("链表为空\n"); return; } if(head->next->next==NULL){ printf("链表只存在一个结点,无需排序\n"); OutPut(head); return; } while(pf->next!=NULL){ pb=pf->next; while(pb!=NULL){ if(pf->data.number>pb->data.number){ temp=*pf; *pf=*pb; *pb=temp; temp.next=pf->next; pf->next=pb->next; pb->next=temp.next; } pb=pb->next; } pf=pf->next; } OutPut(head); } /** 降序(温度) */ void viewdescendingsort(LinkList head){ Node *pb,*pf,temp; pf=head->next; if(head->next==NULL){ printf("链表为空\n"); return; } if(head->next->next==NULL){ printf("链表只存在一个结点,无需排序\n"); OutPut(head); return; } while(pf->next!=NULL){ pb=pf->next; while(pb!=NULL){ if(pf->data.temperature<pb->data.temperature){ temp=*pf; *pf=*pb; *pb=temp; temp.next=pf->next; pf->next=pb->next; pb->next=temp.next; } pb=pb->next; } pf=pf->next; } OutPut(head); } /** 6 功能 参数 LinkList h */ void Fuction(LinkList h){ char isFlag='y'; while(isFlag!='n'){ printf("*************功能*************\n"); printf(" 1 简单统计\n"); printf(" 2 综合统计\n"); printf(" 3 升序(学号)\n"); printf(" 4 降序(温度)\n"); printf(" 5 退出\n"); printf("请选择(1-5):"); int selection; selection=readInt(1,5); switch(selection){ case 1: printf("******简单 统计******\n"); vieweasycount(h); break; case 2: printf("******综合 统计******\n"); viewcount(h); break; case 3: printf("*********升序********\n"); viewascendingsort(h); break; case 4: printf("*********降序*********\n"); viewdescendingsort(h); break; case 5: getchar(); printf("请确认是否退出(y或n):"); char isExit; isExit=readConfirmSelection(); if(isExit=='y'){ isFlag='n'; } } } } /** 7.1数据输出 参数 struct Data data */ void DataOutput(struct Data data){ printf("姓名\t学号\t体温\t身份证号\t\t电话号\t\t地址\n"); printf("%s \t%d \t%.2f\t %lld \t%lld \t%s\n",data.name,data.number,data.temperature,data.id,data.phone,data.address); } /** 7.2 链表输出 参数 LinkList head */ void OutPut(LinkList head){ Node *p; p=head->next; int c=0; if(p==NULL){ printf("尚未添加\n"); } while(p){ c+=1; printf("**%d**\n",c); DataOutput(p->data); p=p->next; } } /** 8.1数据存储:用文件的形式将录入的数据存储; 参数 LinkList head */ void storage(LinkList h){ Node* p ; FILE* fp; char fileName[20]; printf("请输入文件名:"); scanf("%s",fileName); //异常预处理 if (h->next == NULL) { printf("节点为空,保存失败\n"); return; } //打开文件 fp = fopen(fileName, "wt"); if (fp== NULL) { printf("打开文件失败\n"); return; } //保存操作 for(p=h->next;p!=NULL;p=p->next){ // fwrite(&(p->data), sizeof(struct Data), 1, fp); fprintf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s\n",p->data.name,p->data.number,p->data.temperature,p->data.id,p->data.phone,p->data.address); // fprintf(fp,"%s %d %.2f %lld %lld %s\n",p->data.name,p->data.number,p->data.temperature,p->data.id,p->data.phone,p->data.address); } //关闭文件 fclose(fp); printf("已保存\n"); } /**8.2.1 读取:对文件中的数据可以进行读取操作;读入到链表里 返回 LinkList head */ LinkList read(){ LinkList head; Node *r,*s; FILE *fp; char fileName[40]; printf("请输入要读取的文件名:"); scanf("%s",fileName); fp=fopen(fileName,"rt"); if(fp==NULL){ printf("读文件错误"); return NULL; } head=InitList(); r=head; // while(!feof(fp)){ while(1){ s=(Node*)malloc(sizeof(Node)); // struct Data data; struct Data * data; //存放读取数据 // if(fscanf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s\n",data.name,&data.number,&data.temperature,&data.id,&data.phone,data.address)==EOF){ // break; // } if(fscanf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s\n",data->name,&data->number,&data->temperature,&data->id,&data->phone,data->address)==EOF){ free(data); break; } // fread(&data,sizeof(struct Data),1,fp);// // fscanf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s",data.name,&data.number,&data.temperature,&data.id,&data.phone,data.address); // fscanf(fp,"%s %d %.2f %lld %lld %s\n",data.name,&data.number,&data.temperature,&data.id,&data.phone,data.address); // char name[20]; // int number; // double temperature; // long long int id; // long long int phone; // char address[20]; // fscanf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s",name,&number,&temperature,&id,&phone,address); // strcpy(data.name,name); // data.number=number; // data.temperature=temperature; // data.id=id; // data.phone=phone; // strcpy(data.address,address); // s->data=*data; // s->data=data; r->next=s; r=s; } r->next=NULL; fclose(fp); return head; } /** 8.2.2 view 读取 参数 LinkList h */ LinkList viewread(LinkList h){ h=read(); OutPut(h); return h; } /** 8.3 写入:对文件中的数据可以进行追加操作; */ void write(){ FILE *fp; char fileName[20]; printf("请输入要写入的文件名:"); scanf("%s",fileName); fp=fopen(fileName,"ab"); if (fp== NULL) { printf("打开文件失败\n"); return; } struct Data data; data=DataInput(); // fwrite(&data,sizeof(struct Data),1,fp); fprintf(fp,"%s %d% .2f %lld% lld %s\n",data.name,data.number,data.temperature,data.id,data.phone,data.address); // fprintf(fp,"%s\t%d\t%.2f\t%lld\t%lld\t%s\n",data.name,data.number,data.temperature,data.id,data.phone,data.address); fclose(fp); printf("已写入\n"); } /** 8 文件 参数 LinkList h */ LinkList file(LinkList h){ char isFlag='y'; while(isFlag!='n'){ printf("*************文件*************\n"); printf(" 1 存储\n"); printf(" 2 读取\n"); printf(" 3 写入\n"); printf(" 4 退出\n"); printf("请选择(1-4):"); int selection; selection=readInt(1,5); switch(selection){ case 1: printf("*********存储********\n"); storage(h); break; case 2: printf("*********读取*********\n"); h=viewread(h); return h; break; case 3: printf("*********写入*********\n"); write(); break; case 4: getchar(); printf("请确认是否退出(y或n):"); char isExit; isExit=readConfirmSelection(); if(isExit=='y'){ isFlag='n'; } } } }