代码用.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
#include
#include
#include
#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';
}
}
}
}