C语言实现病例管理系统
时间:2021-10-18 10:05:25|栏目:C代码|点击: 次
本文实例为大家分享了C语言实现病例管理系统的具体代码,供大家参考,具体内容如下
通过十字交叉链表实现一个病例管理系统,可以查找、删除、更新信息。
#include"stdio.h" #include"stdlib.h" #include"string.h" typedef struct hospital_info{ char dise_num[10]; /*病历编号*/ char ke[10]; /*门诊科别*/ char date[11]; /*门诊时间*/ char symptom[60]; /*症状*/ char diagnosis[60]; /*诊断*/ char treatment[60]; /*治疗意见*/ char doctor[10]; /*医师姓名*/ struct hospital_info *next; }hospitals; typedef struct disease_info{ char dise_num[10]; /*病历编号*/ char employee[10]; /*姓名*/ char sex; /*性别*/ char unit[30]; /*工作单位*/ char date[11]; /*出生日期*/ char drug_allergy[30]; /*药物过敏史*/ char phone[12]; /*联系电话*/ char addr[30]; /*住址*/ hospitals *head_hosp; struct disease_info *next; }diseases; typedef struct unit_info{ char unit_num[10]; /*单位编号*/ char unit[30]; /*单位名称*/ char manager[20]; /*负责人*/ char phone[12]; /*联系电话*/ int total; diseases *head_disease; struct unit_info *next; }units; void create_cross_list(units**head); void save_cross_list(units*head); void traverse_cross_list(units*head); void load_cross_list(units **head); void Revise_unit(units *head); void Revise_dise(units *head); void Revise_hosp(units *head); void Insert_unit(units *head); void Insert_dise(units *head); void Insert_hosp(units *head); void Delete_unit(units *head); void Delete_dise(units *head); void Delete_hosp(units *head); void Search_unit(units *head); void Search_dise(units *head); void Search_hosp(units *head); void Display_no_hosp(units *head); void Sortmonth(units *head); void SortTotal(units *head); void Sortpeople(units *head); void main(void) { units *head=NULL; short choice; printf("-----the unit information manage system!------\n"); printf("< 1----------create the cross list >\n"); printf("< 2----------save the cross list >\n"); printf("< 3----------traverse the cross list >\n"); printf("< 4----------load the cross list >\n"); printf("< 5-----------Revise information >\n"); printf("< 6-----------Insert information >\n"); printf("< 7-----------Delete information >\n"); printf("< 8-----------Search information >\n"); printf("< 9--------------- tong ji >\n"); printf("< 10---------------退出 >\n"); printf("--------------------------------------------->\n"); f: while(1){ printf("请选择要进行的操作:(1-10)"); scanf("%hd",&choice); getchar(); /*用于吸收换行符*/ switch(choice) { case 1:create_cross_list(&head); break; case 2:save_cross_list(head);break; case 3:traverse_cross_list(head); break; case 4:load_cross_list(&head);break; case 5: { printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); printf(" ---------修改函数菜单-----------\n"); printf(" 1----------------Revise_unit\n"); printf(" 2----------------Revise_dise\n"); printf(" 3----------------Revise_hosp\n"); printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); while(1){ printf("**请选择子菜单操作:(1-4)"); scanf("%hd",&choice); getchar(); /*用于吸收换行符*/ switch(choice) { case 1:Revise_unit(head);break; case 2:Revise_dise(head);break; case 3:Revise_hosp(head);break; case 4:goto f; } } } case 6: { printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); printf(" ---------插入函数菜单-----------\n"); printf(" 1----------------Insert_unit\n"); printf(" 2----------------Insert_dise\n"); printf(" 3----------------Insert_hosp\n"); printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); while(1){ printf("**请选择子菜单操作:(1-4)"); scanf("%hd",&choice); getchar(); /*用于吸收换行符*/ switch(choice) { case 1:Insert_unit(head);break; case 2:Insert_dise(head);break; case 3:Insert_hosp(head);break; case 4:goto f; } } } case 7: { printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); printf(" ---------删除函数菜单-----------\n"); printf(" 1---------------Delete_unit\n"); printf(" 2---------------Delete_dise\n"); printf(" 3---------------Delete_hosp\n"); printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); while(1){ printf("**请选择子菜单操作(1-4):"); scanf("%hd",&choice); getchar(); /*用于吸收换行符*/ switch(choice) { case 1:Delete_unit(head);break; case 2:Delete_dise(head);break; case 3:Delete_hosp(head);break; case 4:goto f; } } } case 8: { printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); printf(" ---------查询函数菜单-----------\n"); printf(" 1---------------Search_unit\n"); printf(" 2---------------Search_dise\n"); printf(" 3---------------Search_hosp\n"); printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); while(1){ printf("**请选择子菜单操作(1-4):"); scanf("%hd",&choice); getchar(); /*用于吸收换行符*/ switch(choice) { case 1:Search_unit(head);break; case 2:Search_dise(head);break; case 3:Search_hosp(head);break; case 4:goto f; } } } case 9: { printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); printf(" ---------统计函数菜单-----------\n"); printf(" 1---------------Display_no_hosp\n"); printf(" 2---------------Sortmonth\n"); printf(" 3---------------SortTotal\n"); printf(" 4---------------Sortpeople\n"); printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); while(1){ printf("**请选择子菜单操作(1-5):"); scanf("%hd",&choice); getchar(); /*用于吸收换行符*/ switch(choice) { case 1:Display_no_hosp(head);break; case 2:Sortmonth(head);break; case 3:SortTotal(head);break; case 4:Sortpeople(head);break; case 5:goto f; } } } case 10:goto down; } } down: ; } /*创建十字交叉链表,并录入信息*/ void create_cross_list(units **head) { units *hp=NULL,*p; diseases *pcrs; hospitals *phs; char ch; loop: p=(units *)malloc(sizeof(units)); /*创建单位信息结点*/ printf("请输入单位的编号:"); scanf("%s",p->unit_num); printf("请输入单位名称:"); scanf("%s",p->unit); printf("请输入负责人:"); scanf("%s",p->manager); printf("请输入联系电话:"); scanf("%s",p->phone);/*输入各项数据*/ getchar(); /*用于读scanf输入中的换行符*/ p->head_disease=NULL; p->next=hp; hp=p; printf("继续输入%s下单位的病例基本信息(Y/N)?\n",p->unit); scanf("%c",&ch); getchar(); while(ch=='y'||ch=='Y') { pcrs=(diseases *)malloc(sizeof(diseases)); printf("请输入病例编号:"); gets(pcrs->dise_num); printf("请输入病人姓名:"); gets(pcrs->employee); printf("请输入性别:"); scanf("%s",&pcrs->sex); getchar(); printf("请输入出生日期:"); gets(pcrs->date); printf("请输入药物过敏史:"); gets(pcrs->drug_allergy); printf("请输入联系电话:"); gets(pcrs->phone); printf("请输入住址:"); gets(pcrs->addr); /*输入各项数据*/ strcpy(pcrs->unit,p->unit); pcrs->head_hosp=NULL; pcrs->next=p->head_disease; /*头指针值赋给新结点的指针域*/ p->head_disease=pcrs; /*头指针指向新结点*/ printf("继续输入%s的门诊信息(Y/N)?\n",pcrs->employee); ch=getchar(); getchar(); while(ch=='y'||ch=='Y') { /*是,循环创建信息链*/ phs=(hospitals *)malloc(sizeof(hospitals)); printf("请输入门诊科别:"); scanf("%s",phs->ke); printf("请输入门诊时间:"); scanf("%s",phs->date); printf("请输入症状:"); scanf("%s",phs->symptom); printf("请输入诊断:"); scanf("%s",phs->diagnosis); printf("请输入治疗意见:"); scanf("%s",phs->treatment); printf("请输入医师姓名:"); scanf("%s",phs->doctor); /*输入各项数据*/ getchar(); strcpy(phs->dise_num,pcrs->dise_num); phs->next=pcrs->head_hosp; /*头指针值赋给新结点的指针域*/ pcrs->head_hosp=phs; /*头指针指向新结点*/ printf("继续输入%s的下一条病例信息(Y/N)?\n",pcrs->employee); ch=getchar(); getchar(); /*是否继续创建下一个基本信息结点*/ } printf("继续输入下一个病例的基本信息(Y/N)?\n"); ch=getchar(); getchar(); /*是否继续创建下一个基本信息结点*/ } printf("继续输入下一个单位的信息(Y/N)?\n"); ch=getchar(); getchar(); if(ch=='y'||ch=='Y') goto loop; (*head)=hp; p=(*head); } /*保存十字交叉链表数据到磁盘文件*/ void save_cross_list(units *head) { FILE *out1,*out2,*out3; units *p=head; diseases *pcrs; hospitals *phs; if((out1=fopen("c:\\unit.dat","wb+"))==NULL) /*以只写方式将单位基本信息文件创建在c盘下的unit.text文本文件,并使out1指向它*/ exit(-1); if((out2=fopen("c:\\disease.dat","wb+"))==NULL) /*打开病历信息文件*/ exit(-1); if((out3=fopen("c:\\hospital.dat","wb+"))==NULL) /*打开门诊信息文件*/ exit(-1); while(p!=NULL) { fwrite(p,sizeof(units),1,out1);/*写单位基本信息记录*/ pcrs=p->head_disease; /*病历遍历指针指向病历链链头*/ while(pcrs!=NULL) { /*遍历病历信息链*/ fwrite(pcrs,sizeof(diseases),1,out2); /*写病历记录*/ phs=pcrs->head_hosp; /*门诊遍历指针指向门诊链链头*/ while(phs!=NULL) { fwrite(phs,sizeof(hospitals),1,out3); /*写门诊链*/ phs=phs->next; } pcrs=pcrs->next; /*指向下一个病历链*/ } p=p->next; /*指向下一个单位基本信息结点*/ } fclose(out1); /*关闭基本信息文件*/ fclose(out2); /*关闭病历信息文件*/ fclose(out3); /*关闭门诊信息文件*/ printf("记录已被保存.\n"); } /*遍历十字交叉链表,输出各项基本信息*/ void traverse_cross_list(units *head) { units *p=head; diseases *pcrs; hospitals *phs; printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); while(p!=NULL) { /*遍历单位基本信息链*/ printf("%s\t%s\t%s\t%s\n",p->unit_num,p->unit,p->manager,p->phone); pcrs=p->head_disease; while(pcrs!=NULL) { /*遍历病历基本信息链与门诊信息链*/ printf("%s\t%s\t%c\t%s\t%s\t%s\t%s\t%s\n",pcrs->dise_num,pcrs->employee,\ pcrs->sex,pcrs->unit,pcrs->date,pcrs->drug_allergy,pcrs->phone,pcrs->addr); phs=pcrs->head_hosp; while(phs!=NULL) { printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\n",phs->dise_num,phs->ke,phs->date,\ phs->symptom,phs->diagnosis,phs->treatment,phs->doctor); phs=phs->next; } pcrs=pcrs->next; } p=p->next; } printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); } /*从磁盘文件中读取*/ void load_cross_list(units **head) { FILE *in1,*in2,*in3; units *hp=NULL,*p; diseases *pcrs; hospitals *phs; if((in1=fopen("c:\\unit.dat","rb"))==NULL) exit(-1); if((in2=fopen("c:\\disease.dat","rb"))==NULL) exit(-1); if((in3=fopen("c:\\hospital.dat","rb"))==NULL) exit(-1); while(!feof(in1)) { p=(units *)malloc(sizeof(units)); fread(p,sizeof(units),1,in1); if(!feof(in1)) { p->head_disease=NULL; p->next=hp; hp=p; } } (*head)=hp; while(!feof(in2)) { pcrs=(diseases *)malloc(sizeof(diseases)); fread(pcrs,sizeof(diseases),1,in2); if(!feof(in2)) { p=(*head); pcrs->head_hosp=NULL; while(p!=NULL) { if(!strcmp(p->unit,pcrs->unit)) { pcrs->next=p->head_disease; p->head_disease=pcrs; break; } else p=p->next; } } } (*head)=hp; while(!feof(in3)) { phs=(hospitals *)malloc(sizeof(hospitals)); fread(phs,sizeof(hospitals),1,in3); if(!feof(in3)) { p=(*head); while(p!=NULL) { pcrs=p->head_disease; while(pcrs!=NULL) { if(!strcmp(phs->dise_num,pcrs->dise_num)) { phs->next=pcrs->head_hosp; pcrs->head_hosp=phs; break; } else pcrs=pcrs->next; } p=p->next; } } } fclose(in1); fclose(in2); fclose(in3); } //修改一个单位基本信息 void Revise_unit(units *head) { units *p,*q; char num[10]; char choice; char update[30]; p=q=head; printf("please input 要修改的单位编号:"); scanf("%s",num); getchar(); while(strcmp(num,p->unit_num)!=0&&p->next!=0) /*查找需要修改信息的单位编号*/ { q=p; p=p->next; } if(strcmp(num,p->unit_num)==0) { printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); printf(" ***a---------to revise unit_num\n"); printf(" ***b---------to revise unit_name\n"); printf(" ***c---------to revise unit_manager\n"); printf(" ***d---------to revise unit_phone\n"); printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); loop: printf("please input要选择的操作:(a-d)"); choice=getchar(); getchar(); printf("please input更新后的信息:"); switch(choice) { case 'a': scanf("%s",update); strncpy(p->unit_num,update,strlen(update)+1); goto loop; case 'b': scanf("%s",update); strncpy(p->unit,update,strlen(update)+1); goto loop; case 'c': scanf("%s",update); strncpy(p->manager,update,strlen(update)+1); goto loop; case 'd': scanf("%s",update); strncpy(p->phone,update,strlen(update)+1); goto loop; default:break; } printf("修改成功!\n"); } else printf("not find!\n"); } //修改一个病历基本信息 void Revise_dise(units *head) { units *p; diseases *pcrs; char num[10]; char update[30]; char choice; p=head; printf("please input 要修改信息的员工编号:"); scanf("%s",num); getchar(); pcrs=p->head_disease; while(p!=NULL) { while(pcrs!=NULL) { if(strcmp(pcrs->dise_num,num)==0) goto loop1; pcrs=pcrs->next; } p=p->next; pcrs=p->head_disease->next; } if(p==NULL) { printf("not find the unit"); goto end; } loop1: printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); printf(" ***a--------to revise the dise num\n"); printf(" ***b--------to revise the employee\n"); printf(" ***c--------to revise the sex\n"); printf(" ***d--------to revise the unit\n"); printf(" ***e--------to revise the date\n"); printf(" ***f---------to revise the drug_allergy\n"); printf(" ***g---------to revise the phone\n"); printf(" ***h---------to revise the addr\n"); printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); loop2: printf("please input要选择的操作:(a-h)"); choice=getchar(); getchar(); printf("请输入修改后的信息:"); switch (choice) { case 'a': scanf("%s",update); strncpy(pcrs->dise_num,update,sizeof(update)+1); goto loop2; case 'b': scanf("%s",update); strncpy(pcrs->employee,update,sizeof(update)+1); goto loop2; case 'c': scanf("%c",&pcrs->sex); goto loop2; case 'd': scanf("%s",update); strncpy(pcrs->unit,update,strlen(update)+1); goto loop2; case 'e': scanf("%s",update); strncpy(pcrs->date,update,strlen(update)+1); goto loop2; case 'f': scanf("%s",update); strncpy(pcrs->drug_allergy,update,strlen(update)+1); goto loop2; case 'g': scanf("%s",update); strncpy(pcrs->phone,update,strlen(update)+1); goto loop2; case 'h': scanf("%s",update); strncpy(pcrs->addr,update,strlen(update)+1); goto loop2; default:break; } printf("修改成功!\n"); end: ; } /*修改一个门诊基本信息*/ void Revise_hosp(units *head) { units *p; diseases *pcrs; hospitals *phs; char num[10],date[11]; char choice; char update[30]; p=head; printf("please input 要修改信息的病历编号:"); scanf("%s",num); pcrs=p->head_disease; while(p!= NULL) { while(pcrs!= NULL) { if(strcmp(pcrs->dise_num,num)==0) goto loop1; pcrs=pcrs->next; } p=p->next; pcrs=p->head_disease->next; } if(p==NULL) { printf("not find the unit"); goto end; } loop1: printf("please input 要修改信息的门诊时间:"); scanf("%s",date); phs=pcrs->head_hosp; while(phs!= NULL) { if(strcmp(phs->date,date)==0) goto loop2; phs=phs->next; } if(phs==NULL) { printf("not find "); goto end; } loop2: printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); printf(" ***a---------revise the dise_num\n"); printf(" ***b--------revise the ke\n"); printf(" ***c--------revise the date\n"); printf(" ***d--------revise the symptom\n"); printf(" ***e--------revise the diagnosis\n"); printf(" ***f--------revise the treatment\n"); printf(" ***g--------revise the doctor\n"); printf(" <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n"); loop3: printf("please input要进行的操作:"); choice=getchar(); getchar(); printf("please input the update information:"); scanf("%s",update); switch(choice) { case 'a': strncpy(phs->dise_num,update,strlen(update)+1); goto loop3; case 'b': strncpy(phs->ke,update,strlen(update)+1); goto loop3; case 'c': strncpy(phs->date,update,strlen(update)+1); goto loop3; case 'd': strncpy(phs->symptom,update,strlen(update)+1); goto loop3; case 'e': strncpy(phs->diagnosis,update,strlen(update)+1); goto loop3; case 'f': strncpy(phs->treatment,update,strlen(update)+1); goto loop3; case 'g': strncpy(phs->doctor,update,strlen(update)+1); goto loop3; default:break; } printf("修改成功!\n"); end: ; } //按单位编号由小到大在链表中插入一个单位新结点 void Insert_unit(units *head) { units *p1,*p2; int state; loop: p1=head; p2=malloc(sizeof(units)); p2->next=NULL; p2->head_disease=malloc(sizeof(diseases)); p2->head_disease->next=NULL; printf("请输入单位编号:"); scanf("%s",p2->unit_num); a: while(p1->next!=NULL) { p1=p1->next; if(strcmp(p1->unit_num,p2->unit_num)==0) { state = 1; break; } else { state=0; break; } } switch(state) { case 0:if(strcmp(p1->unit_num,p2->unit_num)>0) { if(p1==head->next) { head->next=p2; p2->next=p1; } else { p1->next=p2; p2->next=p1->next; } break; } else goto a; case 1:printf("the unit num already exit,pleae input another one\n"); goto loop; } printf("请输入单位名称:"); scanf("%s",p2->unit); printf("请输入负责人:"); scanf("%s",p2->manager); printf("请输入联系电话:"); scanf("%s",p2->phone); printf("插入成功!\n"); } //按病历编号由小到大插入一个员工病历信息结点 void Insert_dise(units *head) { units *p; diseases *pcrs1,*pcrs2; int state; char name[30]; printf("请输入单位名称:"); scanf("%s",name); p=head; while(p->next!= NULL) { p=p->next; if (strcmp(p->unit,name)==0) break; } if(p==NULL) { printf("not find the unit!"); goto end; } pcrs1=p->head_disease; pcrs2=malloc(sizeof(diseases)); pcrs2->next = NULL; pcrs2->head_hosp= malloc(sizeof(hospitals)); pcrs2->head_hosp->next=NULL; strcpy(pcrs2->unit,name); loop: printf("请输入病例编号:"); scanf("%s",pcrs2->dise_num); if (pcrs1==NULL) p->head_disease->next = pcrs2; else { a: while (pcrs1 ->next != NULL) { pcrs1= pcrs1->next; if (strcmp(pcrs1->dise_num,pcrs2->dise_num)==0) { state = 1; break; } else { state=0; break; } } switch(state) { case 0:if(strcmp(pcrs1->dise_num,pcrs2->dise_num)>0) { if(pcrs1=p->head_disease->next) { p->head_disease->next=pcrs2; pcrs2->next=pcrs1; } else { pcrs1->next=pcrs2; pcrs2->next=pcrs1->next; } break; } else goto a; case 1:printf("the disease number already exit,please input another one\n"); goto loop; } } printf("请输入姓名:"); scanf("%s",pcrs2->employee); printf("请输入性别:"); scanf("%c",pcrs2->sex); printf("请输入出生日期"); scanf("%s",pcrs2->date); printf("请输入药物过敏史:"); scanf("%s",pcrs2->drug_allergy); printf("请输入联系电话:"); scanf("%s",pcrs2->phone); printf("请输入住址:"); scanf("%s",pcrs2->addr); printf("插入成功!\n"); end: ; } //按门诊时间由小到大插入一个员工门诊信息结点 void Insert_hosp(units *head) { units *p; diseases *pcrs; hospitals *phs1,*phs2; char number[10]; printf("请输入单位编号:"); scanf("%s",number); p=head; while(p->next!= NULL) { p=p->next; if(strcmp(p->unit_num,number)==0) break; } if(p==NULL) { printf("not find the unit\n"); goto end; } pcrs=p->head_disease; printf("请输入病例编号:"); scanf("%s",number); while(pcrs->next!=NULL) { pcrs=pcrs->next; if (strcmp(pcrs->dise_num,number)==0) break; } if (pcrs==NULL) { printf("not find the question \n"); goto end; } phs1=pcrs->head_hosp->next; phs2=malloc(sizeof(hospitals)); phs2->next=NULL; if(phs1==NULL) pcrs->head_hosp->next =phs2; else { while(phs1->next!=NULL) phs1=phs1->next; phs1->next=phs2; } strncpy(phs2->dise_num,number,strlen(number)+1); printf("请输入科别:"); scanf("%s",phs2->ke); printf("请输入诊断时间:"); scanf("%s",phs2->date); printf("请输入主诉:"); scanf("%s",phs2->symptom); printf("请输入初步诊断:"); scanf("%s",phs2->diagnosis); printf("请输入治疗意见:"); scanf("%s",phs2->treatment); printf("请输入医师姓名:"); scanf("%s",phs2->doctor); printf("插入成功!\n"); end: ; } /*删除一条单位信息记录*/ void Delete_unit(units *head) { units *p,*q; char name[30]; printf("please input 要删除的单位名称:"); scanf("%s",name);getchar(); p=q=head; while(strcmp(name,p->unit)!=0&&p->next!=0)/*p指的不是要找的结点,并且后面还有结点*/ { q=p; p=p->next; } /*p后移一个结点*/ if(strcmp(name,p->unit)==0) { /*找要删除位置*/ if(p==head) head=p->next; /*若p指向的是首结点,把第二个结点地址赋予head*/ else q->next=p->next; /*否则将下一个结点地址赋给前一结点地址*/ free(p); printf("删除成功!\n"); } else printf("%s not been found!\n",name); /*找不到该结点*/ } /*删除一条病历信息记录*/ void Delete_dise(units *head) { units *p,*q; diseases *pcrs,*t; char name[10],employee[30]; printf("please input 要删除信息的单位名称:"); scanf("%s",name); getchar(); p=q=head; while(strcmp(name,p->unit)!=0&&p->next!=0) /*p指的不是要找的结点,并且后面还有结点*/ { q=p; p=p->next; } /*p后移一个结点*/ if(strcmp(name,p->unit)==0) { printf("please input 要删除信息的员工姓名:"); scanf("%s",employee); getchar(); pcrs=t=p->head_disease; while(strcmp(employee,pcrs->employee)!=0&&pcrs->next!=0) { t=pcrs; pcrs=pcrs->next; } /*pcrs后移一个结点*/ if(strcmp(employee,pcrs->employee)==0) { if(pcrs==p->head_disease) p->head_disease=pcrs->next; /*若pcrs指向的是首结点,把第二个结点地址赋予head*/ else t->next=pcrs->next; /*否则将下一个结点地址赋给前一结点地址*/ free(pcrs); printf("删除成功!\n"); } } else printf("%s not been found!\n",employee); } //删除一条门诊信息记录 void Delete_hosp(units *head) { units *p,*q; diseases *pcrs,*t1; hospitals *phs,*t2; char name[30],employee[10],date[11]; printf("please input 要删除信息的单位名称:"); scanf("%s",name); getchar(); p=q=head; while(strcmp(name,p->unit)!=0&&p->next!=0)/*p指的不是要找的结点,并且后面还有结点*/ { q=p; p=p->next; } /*p后移一个结点*/ if(strcmp(name,p->unit)==0) { printf("please input 要删除信息的员工姓名:"); scanf("%s",employee); getchar(); pcrs=t1=p->head_disease; while(strcmp(employee,pcrs->employee)!=0&&pcrs->next!=0) { t1=pcrs; pcrs=pcrs->next; } /*pcrs后移一个结点*/ if(strcmp(employee,pcrs->employee)==0) { printf("please input 要删除信息的病历时间:"); scanf("%s",date); getchar(); phs=t2=pcrs->head_hosp; while(strcmp(date,phs->date)!=0&&phs->next!=0) { t2=phs; phs=phs->next; } if(strcmp(date,phs->date)==0) { if(phs==pcrs->head_hosp) pcrs->head_hosp=phs->next; else t2->next=phs->next; free(phs); printf("删除成功!\n"); } } } else printf("%s not been found!\n",date); } /*查询一条单位信息记录并输出信息*/ void Search_unit(units *head) { units *p,*q; char num[10]; p=q=head; printf("please input 要查询的单位编号:"); scanf("%s",num); getchar(); while(strcmp(num,p->unit_num)!=0&&p->next!=0)/*p指的不是要查询的结点并且后面还有结点*/ { q=p; p=p->next; } /*p后移一个结点*/ if(strcmp(num,p->unit_num)==0) {/*找要查询的结点,输出各项基本信息*/ printf("单位编号:%s\n",p->unit_num); printf("单位名称:%s\n",p->unit); printf("负责人:%s\n",p->manager); printf("联系电话:%s\n",p->phone); } else printf("%s not been found!\n",num); /*找不到要查询的结点*/ } //查询一条病历信息链并输出信息 void Search_dise(units *head) { units *p,*q; diseases *pcrs,*t; char name[10],num[10]; p=q=head; printf("please input 要查询的单位名称:"); scanf("%s",name); getchar(); while(strcmp(name,p->unit)!=0&&p->next!=0) { q=p; p=p->next; } /*p后移一个结点*/ if(strcmp(name,p->unit)==0) /*找要查询的结点*/ { pcrs=t=p->head_disease; printf("please input 要查询的病历编号:"); scanf("%s",num); getchar(); while(strcmp(num,pcrs->dise_num)!=0&&pcrs->next!=0) { t=pcrs; pcrs=pcrs->next; } /*p后移一个结点*/ if(strcmp(num,pcrs->dise_num)==0) {/*找要查询的结点*/ printf("病历编号:%s\n",pcrs->dise_num); printf("姓名:%s\n",pcrs->employee); printf("性别:%c\n",pcrs->sex); printf("工作单位:%s\n",pcrs->unit); printf("出生日期:%s\n",pcrs->date); printf("药物过敏史:%s\n",pcrs->drug_allergy); printf("联系电话:%s\n",pcrs->phone); printf("住址:%s\n",pcrs->addr); } } else printf("not been found!\n"); /*找不到要查询的结点*/ } //查询一条门诊信息链并输出信息 void Search_hosp(units *head) { units *p,*q; diseases *pcrs,*t1; hospitals *phs,*t2; char name[10],num[10],date[11]; p=q=head; printf("please input 要查询的单位名称:"); scanf("%s",name); getchar(); while(strcmp(name,p->unit)!=0&&p->next!=0) { q=p; p=p->next; } /*p后移一个结点*/ if(strcmp(name,p->unit)==0) /*找要查询的结点*/ { pcrs=t1=p->head_disease; printf("please input 要查询的病历编号:"); scanf("%s",num); getchar(); while(strcmp(num,pcrs->dise_num)!=0&&pcrs->next!=0) { t1=pcrs; pcrs=pcrs->next; } /*p后移一个结点*/ if(strcmp(num,pcrs->dise_num)==0) /*找要查询的结点*/ { phs=t2=pcrs->head_hosp; printf("please input 要查询的门诊时间:"); scanf("%s",date); getchar(); while(strcmp(date,phs->date)!=0&&phs->next!=0) { t2=phs; phs=phs->next; } /*p后移一个结点*/ if(strcmp(date,phs->date)==0) { printf("病历编号:%s\n",phs->dise_num); printf("诊断科别:%s\n",phs->ke); printf("门诊时间:%s\n",phs->date); printf("主诉:%s\n",phs->symptom); printf("初步诊断:%s\n",phs->diagnosis); printf("治疗意见:%s\n",phs->treatment); printf("医师姓名:%s\n",phs->doctor); } } } else printf("not been found!\n"); /*找不到要查询的结点*/ } /*列出从未门诊的员工信息(单位.姓名.住址.电话)*/ void Display_no_hosp(units *head) { units *p=head; diseases *pcrs; hospitals *phs; while(p!=NULL) { printf("%s\n",p->unit); //输出各个单位名称 printf("员工姓名\t电话\t住址\n"); pcrs=p->head_disease; while(pcrs!=NULL) { phs=pcrs->head_hosp; //如果phs是空链,则该员工从未门诊过 if(phs==NULL) printf("%s\t%s\t%s\n",pcrs->employee,pcrs->phone,pcrs->addr); else ; //否则门诊过,执行空语句 pcrs=pcrs->next; } p=p->next; } } /*统计一年中各月的门诊量并按降序排列后输出*/ void Sortmonth(units *head) { units *p=head; diseases *pcrs; hospitals *phs; int s[12],i,j,t,count; char year[10],month[10]; for(i=0;i<12;i++) s[i]=0; printf("--请输入要统计的年份:"); //手动输入要统计的年份 scanf("%s",year); getchar(); printf("--请输入要统计的月份:"); for(i=0;i<12;i++) { count=0; //统计一年中各月的门诊量 scanf("%s",month); while(p!=NULL) { pcrs=p->head_disease; while(pcrs!=NULL) { phs=pcrs->head_hosp; while(phs!=NULL) { j=0; while(phs->date[j]==year[j]&&(j<4)) j++;//判断是否为要统计的年份 if(j==4) //是,比较是否为在该月的门诊 if(phs->date[j+1]==month[0]&&phs->date[j+2]==month[1]) count++; else ; //不是,执行空语句 phs=phs->next; } pcrs=pcrs->next; } p=p->next; } s[i]=count; } for(i=0;i<12;i++) //输出各月的总门诊量 printf("%d\t",s[i]); printf("\n"); for(i=0;i<11;i++) //降序排序 for(j=0;j<11-i;j++) if(s[j]<s[j+1]) t=s[j],s[j]=s[j+1];s[j+1]=t; printf("请输出按降序排列后的统计量:\n"); for(i=0;i<12;i++) //输出排列后的各月总门诊量 printf("%d\t",s[i]); printf("\n"); } /*统计各单位员工的总门诊量并按降序排列后输出*/ void SortTotal(units *head) { units *p=head,*q; diseases *pcrs; hospitals *phs; int count,i,j,t,len=0; while(p!=NULL) { //计算各单位员工的总门诊量 p->total=0; count=0; pcrs=p->head_disease; while(pcrs!=NULL) { phs=pcrs->head_hosp; while(phs!=NULL) { count++; phs=phs->next; } pcrs=pcrs->next; } p->total=count; printf("%s\t",p->unit); //输出各个单位名称 p=p->next; } printf("\n"); p=head; //遍历指针p指向头指针 while(p!=NULL) { //输出统计数 printf("%d\t",p->total); p=p->next; } printf("\n"); p=head; while(p!=NULL) { //计算单位信息链表长度 len++; p=p->next; } for(i=0,p=head;i<len-1;i++,p=p->next) //对统计量降序排序 for(j=i+1,q=p->next;j<len;j++,q=q->next) if(p->total<q->total) { t=p->total; p->total=q->total; q->total=t; } p=head; printf("请输出按降序排列后的统计量:\n"); while(p!=NULL) { //输出排序后的统计量 printf("%d\t",p->total); p=p->next; } printf("\n"); } //统计各单位员工总人数并输出 void Sortpeople(units *head) { units *p=head; diseases *pcrs; int count; while(p!=NULL) { p->total=0; count=0; pcrs=p->head_disease; while(pcrs!=NULL) { count++; pcrs=pcrs->next; } p->total=count; p=p->next; } p=head; while(p!=NULL) { printf("输出单位名称:%s",p->unit); printf("统计单位总人数:%d\n",p->total); p=p->next; } }
更多学习资料请关注专题《管理系统开发》。