新冠疫情病人信息管理系统,用到了结构体和链表实现了增删改查。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define KESOU 2//咳嗽的权重
#define FARE 3//发热的权重
#define GANMAO 1//感冒的权重
//时间点结构体
typedef struct datepoint
{
int year;
int month;
int day;
}datepoint;
datepoint date2;
//病人结构体
struct patient
{
int num;
char name[20];
char sex[4];
int age;
char zhengzhuang[3];
datepoint date1;
int time;
float chengdu;
};
//链表节点
struct Node
{
struct patient data;//数据域
struct Node* next;//指针域
};
//创建链表
struct Node* createList()
{
struct Node* headNode=(struct Node*)malloc(sizeof(struct Node));//headnode成为了结构体变量
headNode->next=NULL;
return headNode;
}
//增加新结点
struct Node* createNode(struct patient data)
{
struct Node* newNode=(struct Node*)malloc(sizeof(struct Node));
newNode->data=data;
newNode->next=NULL;
return newNode;
}
int TIME(); //计算时间
void INPUT_INF();//输入
void OUTPUT_INF();//输出
void CALC();//计算
void DELETE();//删除
void PSORT();//排序
void EXIT();//退出
int DAY(int n1,int y1,int r1,int n2,int y2,int r2);
int run_or_ping(int x);//判断闰年平年
inline int yue_r(int n,int y);//内联函数
void insertNodeByHead(struct Node* headNode, struct patient data);
void printList(struct Node* headNode);
void deleteNodeByAppoinnum(struct Node* headNode, int num) ;
int chengdu(float a);
struct Node* list=createList();
struct patient info[3];
//主函数
int main()
{
int n;
while(n!=6)//打印菜单
{ printf("*********************新冠肺炎病人基础信息管理*************************\n");
printf("1:输入病人信息\n");
printf("2:显示所有病人信息\n");
printf("3:计算并输出目前病人平均年龄和平均住院时长\n");
printf("4:病人治疗紧急程度排序\n");
printf("5:删除出院病人\n");
printf("6:结果存入文件patient information.txt\n");
printf("7:退出系统\n");
printf("***********************************************************************\n");
printf("病毒无情,人间有爱;勇毅笃定,战无不胜。病毒无情,人间有爱;勇毅笃定,战无不胜。\n");
printf("***********************************************************************\n");
printf("输入选项代码:");
scanf("%d",&n);
switch(n)
{
case 1:INPUT_INF();break;
case 2:OUTPUT_INF();break;
case 3:CALC();break;
case 4:PSORT();break;
case 5:DELETE();break;
case 6:EXIT();break;
case 7:printf("\n*******************谢谢使用!*******************\n");break;
break;
}
}
getchar();
}
//插入结点(插入哪个链表,插入的数据)
void insertNodeByHead(struct Node* headNode, struct patient data)
{
//创建插入的结点
struct Node* newNode=createNode(data);
newNode->next=headNode->next;
headNode->next=newNode;
}
//打印链表
void printList(struct Node* headNode)
{
struct Node* pMove=headNode->next;
printf("编号\t姓名\t性别\t年龄\t症状\t入院时间\t住院时长\n");
while(pMove)
{
printf("%d\t%s\t%s\t%d\t%s\t%d年%d月%d日\t%d\n",pMove->data.num,pMove->data.name,pMove->data.sex,pMove->data.age,pMove->data.zhengzhuang,pMove->data.date1.year,pMove->data.date1.month,pMove->data.date1.day,pMove->data.time);
pMove=pMove->next;
}
printf("\n");
}
//删除结点(删除哪个链表,删除的数据)
void deleteNodeByAppoinnum(struct Node* headNode, int num)
{
struct Node* postNode=headNode->next;
struct Node* postNodeFront=headNode;
if(postNode==NULL)
{
printf("无法删除,列表为空\n");
}
else
{
while(postNode->data.num!=num)
{
postNodeFront=postNode;
postNode=postNodeFront->next;
if(postNode==NULL)
{
printf("未找到指定数据,无法删除\n");
break;
}
}
postNodeFront->next=postNode->next;
free(postNode);
}
}
void INPUT_INF() /* 输入一组病人的信息*/
{
int i;
for(i=0;i<3;i++)
{
printf("请输入病号、姓名、性别、年龄、症状、入院时间: ");
scanf("%d%s%s%d%s%d%d%d",&info[i].num,&info[i].name,&info[i].sex,&info[i].age,&info[i].zhengzhuang,&info[i].date1.year,&info[i].date1.month ,&info[i].date1.day);
insertNodeByHead(list, info[i]);
}
}
void OUTPUT_INF()/* 显示所有记录*/
{
int i;
struct Node* p;
p=list->next;
printf("请输入当前日期\n");
scanf("%d%d%d",&date2.year,&date2.month ,&date2.day );
for(i=0;i<3;i++)
{
info[i].time =DAY(info[i].date1.year,info[i].date1.month,info[i].date1.day,date2.year,date2.month,date2.day);
p->data=info[i];
p=p->next;
}
printList(list);
}
void CALC()/*计算平均年纪和平均住院时长 */
{
int a[3]={0,1,2};
int i,j;
double total1=0,total2=0,ave_age=0,ave_time=0;
double ave;
for(i=0;i<3;i++)
{
total1=total1+info[i].age;
}
ave_age=total1/3.0;
printf("病人平均年纪为%f\n",ave_age);
printf("请输入当前日期");
scanf("%d%d%d",&date2.year,&date2.month ,&date2.day );
for(i=0;i<3;i++)
{
info[i].time =DAY(info[i].date1.year,info[i].date1.month,info[i].date1.day,date2.year,date2.month,date2.day);
}
for(i=0;i<3;i++)
{
total2=total2+info[i].time;
}
ave_time=total2/3.0;
printf("病人平均住院时长为%f\n",ave_time);
}
//时间计算函数
int DAY(int n1,int y1,int r1,int n2,int y2,int r2)
{
int i,j,z,sum=0,flag=0,sum1=0;
for(i=n1;i!=n2;i++)
{
if(run_or_ping(i)==1)
sum=sum+366;
else sum=sum+365;
}
if(y1<y2)
for(j=y1;j!=y2;j++)
{
sum=sum+yue_r(n2,j);
}
else
{
for(j=y2;j!=y1;j++)
sum1=sum1+yue_r(n2,j);
sum=sum-sum1;
}
sum=sum+r2-r1;
return sum;
}
int run_or_ping(int x)
{
if(x%4==0)
{
if(x%100==0)
if(x%400!=0)
return 0;
return 1;
}
else return 0;
}
int yue_r(int n,int y)
{
if(y==2)
{
if(run_or_ping(n)==1)
return 29;
else return 28;
}
else if(y==4||y==6||y==9||y==11)
return 30;
else return 31;
}
//删除数据函数
void DELETE()
{
int num;
printf("请输入出院病人编号\n");
scanf("%d",&num);
deleteNodeByAppoinnum(list, num);
printList(list);
}
//病人紧急程度
void PSORT()
{
struct Node* p;
p=list->next;
int a[3]={0,1,2 };
int i,j,temp;
for(j=0;j<2;j++)
{
for(i=0;i<2-j;i++)
if(info[a[i]].time>info[a[i+1]].time)
{
temp=a[i];a[i]=a[i+1];
a[i+1]=temp;
}
}
printf("请输入当前日期");
scanf("%d%d%d",&date2.year,&date2.month ,&date2.day );
for(i=0;i<3;i++)
{
info[i].time =DAY(info[i].date1.year,info[i].date1.month,info[i].date1.day,date2.year,date2.month,date2.day);
info[i].chengdu=info[i].time*0.3+chengdu(info[i].chengdu);
p->data=info[i];
p=p->next;
}
printf("顺序为:\n");
printf("病号\t姓名\t总住院时长(天)\t紧急程度\n");
for(i=0;i<3;i++)
printf("%d\t%s\t%d\t%f\n",info[a[i]].num,info[a[i]].name,info[a[i]].time,info[a[i]].chengdu);
printf("\n");
}
void EXIT()
{int i;
FILE *fp;
fp=fopen("patient information.txt","w");
fprintf(fp,"病号\t姓名\t性别\t年龄\t症状\t入院日期\t住院时长\n");
for(i=0;i<3;i++)
fprintf(fp,"%d\t%s\t%f\t%f\t%f\t%f\n",info[i].num,info[i].name,info[i].sex,info[i].age,info[i].date1,info[i].time);
printf("\n\n*******************恭喜,保存完成!*******************\n\n");
}
int chengdu(float a)
{
if(a==KESOU)
return 2*0.15;
else if(a==FARE)
return 3*0.3;
else
return 1*0.15;
}