为时一个礼拜的课设终于完成了
来小小的记录一下我的成果~(虽然系统功能很简单,甚至有些功能还有点问题 )
医院为了能实现日常的运营,经常涉及到的功能是:医生信息录入(医生入职时)、医院排号、查看排号情况、医生信息管理、医院叫号等功能。
为了保存医生信息表,需要在程序结束时将表中的医生信息保存到硬盘中,故需建立doctordata.txt文件来保存数据。而在程序运行时,需要将该文件中的数据读入内存,才可供程序使用,故需要读文件、写文件两个文件操作模块。所有的功能操作都围绕着顺序表doctor_list和链表(链表指针)LinkList作为数据基础,顺序表doctor_list和链表(链表指针)LinkList的数据来自文件doctordata.txt,顺序表doctor_list和链表(链表指针)LinkList数据的变化,最终也要保存在该文件。
该系统需要模拟病人看病的步骤,由于病人看病一般规则都是先到先排,排在队前的先就诊。根据这个特点可以采取链表队列(先进先出)的形式来存储数据元素构建数据结构。由于一般的医院都不止一个科室因此需设计多个链表队列。依据该系统需求实现的排队、就诊、查看排队人数等功能。可以抽象出需要设计的算法有:链表队列数据结构的定义、队列的初始化、队列的插入操作、队列的删除操作、求队列长度等基本操作。
#include
#include
#include
#include
#include
#define MAXNUM 100 /*医生信息表可能达到的最大长度*/
typedef struct Node //节点类型定义
{
int data; //数据域
struct Node* next; //指针域
}Node,*LinkList;
typedef struct /*医生信息定义*/
{char dtno[10]; /*科室*/
char dtname[20]; /*医生*/
char time[10]; /*时间段*/
int totalnum; /*总号数*/
LinkList p;
} DOCTOR;
typedef struct
{
DOCTOR dt[MAXNUM]; /*通过类型定义变量,科室及医生信息数组*/
int TotalDoctor; /*最后一个元素在数组中的位置,即下标,空表为-1 */
}DoctorList; /*医生信息表的顺序存储结构类型为DoctorList */
DoctorList doctor_list; /*定义科室及医生信息顺序表*/
void search_queue(LinkList L);
void InitList(LinkList *L) //初始化单链表
{
*L=(LinkList)malloc(sizeof(Node)); //建立头结点,为头结点分配存储空间
(*L)->next=NULL;
(*L)->data=0; //链表的头结点做标记
}
LinkList p1,p2,p3,p4,p5,p6,p7,p8; //8个链表对应八个头指针
void ReadList(LinkList L, FILE *p)
{
LinkList tail=L;
int temp;
char temp2;
fread(&temp2, sizeof(char), 1, p);
// InitList(L);
if(temp2=='*')
while (fread(&temp, sizeof(int), 1, p))//每次读出一个Elemtype 型的temp通过尾插法创建链表
{
// printf("%d",temp);getch();
LinkList node = (LinkList)malloc(sizeof(Node));
node->data = temp;
tail->next = node;
tail = node;
tail->next = NULL;
}
}
void ReadData() //将硬盘doctordata文件中的数据读入内存顺序表doctor_list中
{
FILE *fp;
int i;
if ((fp=fopen("doctordata.txt","rb"))==NULL)
{printf("Can not open the file!\n");return;}
fread(&doctor_list.TotalDoctor,sizeof(int),1,fp);
// printf("%d",doctor_list.TotalDoctor);getch();
for(i=0;inext;
char b='#';
char c='*';
if(head==NULL)
fwrite(&b,sizeof(char), 1, p);
else
{fwrite(&c,sizeof(char), 1, p);
while (head)
{
//printf("%d",head->data);
fwrite(&head->data,sizeof(int), 1, p);
head = head->next;
}
}
}
void WriteData() //将内存中顺序表doctor_list的变化,存入硬盘文件doctordata中
{
FILE *fp;
int i;
if ( (fp=fopen("doctordata.txt","wb"))==NULL)
{printf("Can not open the file!\n");return;}
fwrite(&doctor_list.TotalDoctor , sizeof(int) , 1 ,fp);
for(i=0;iL.TotalDoctor) printf("查无此人!"); /*若没找到,则输出无*/
}
void InsList(DoctorList *L,int i,DOCTOR e) /*插入医生信息*/
{ int k;
if( (i<1)||(i>L->TotalDoctor+2) ) /*首先判断插入位置是否合法*/
{
printf("插入位置i值不合法\n");
printf("信息插入失败!\n");
}
if(L->TotalDoctor>=MAXNUM-1)
{
printf("表已满无法插入\n");
printf("信息插入失败!\n");
}
for(k=L->TotalDoctor-1;k>=i-1;k--) /*其后元素后移*/
L->dt[k+1]=L->dt[k];
L->dt[i-1]=e; /*数据插入,第i个元素的下标为i-1*/
InitList(&L->dt[i-1].p);
L->TotalDoctor++;
printf("信息插入成功!\n");
WriteData();
}
void DelList(DoctorList *L,int i,DOCTOR *e) /*删除*/
/*在顺序表L中删除第i个数据元素,并用指针参数e返回其值*/
{ int k;
if((i<1)||(i>L->TotalDoctor+1))
{
printf("删除位置不合法!\n");
printf("信息删除失败!\n");
}
*e= L->dt[i-1]; /* 将删除的元素存放到e所指向的变量中*/
for(k=i;kTotalDoctor;k++)
L->dt[k-1]=L->dt[k]; /*将后面的元素依次前移*/
L->TotalDoctor--;
printf("信息删除成功!\n");
WriteData();
}
int showx(DoctorList L) //打印清单(查找页面)
{
int i,x;
printf("\t\t%-8s%-20s%-10s%-8s\n",
"科室","医生","时间段","总号数");
printf("\t\t--------------------------------------------------\n");
for (i=0;inext; //p指向第一个结点
i=0;
while(p)
{//遍历单链表,统计结点数
i++;
p=p->next;
}
return i;
}
Node* ListLength_p(LinkList L) //求表尾结点
{ //返回L中数据元素个数
LinkList p;
p=L; //p指向第一个结点
while(p->next!=NULL)
{//遍历单链表
p=p->next;
}
return p;
}
void CreateFromTail(LinkList L,DoctorList Q,int x) //排号 (判断是否还有剩余号码,显示排号成功或失败)
{ Node *r,*s;
int a; //a为链表L的长度
r=ListLength_p(L); /*r指针始终动态指向链表的当前表尾*/
a=ListLength_L(L); //返回L中数据元素个数到a中
if(adata=(r->data)+1; //排号数由上一号加一
r->next=s;
s->next=NULL;
printf("排号成功!");
L->data=s->data;
}
else printf("排号失败,该医生该时段已排满!");
WriteData();
}
void search_queue(LinkList L) //显示已排好情况
{
LinkList p;
if(L->next==NULL)
{
printf("现在还没有排队的病人呦");
return ;
}
else
{
p=L->next;
printf("正在排队的病人号码分别是");
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
}
}
int showuser(DoctorList L) //排号选择页面
{
int ph,i,s=0;
printf("\t\t%-8s%-20s%-10s%-8s\n",
"科室","医生","时间段","总号数");
printf("\t\t--------------------------------------------------\n");
for (i=0;inext==NULL)
{
printf("没有病人排队");
}
else if(L->next==ListLength_p(L))
{
printf("%d号病人请进来就诊",L->next->data);
p=L->next;
L->next=NULL;
free(p);
}
else
{
printf("%d号病人请进来就诊",L->next->data);
p=L->next;
L->next=p->next;
free(p);
}
}
void dtsearch() //排号查看功能
{
int user;
system("cls"); //清屏
user=showuser(doctor_list);
dttake(doctor_list.dt[user].p);
}
int showsel() //显示主菜单
{ int sel;
printf("\t\t简易医院排号系统\n");
printf("\t---------------------------------\n");
printf("\t\t0. 退出\n");
printf("\t\t1. 查看科室及医生信息\n");
printf("\t\t2. 排号\n");
printf("\t\t3. 查看已排号情况\n");
printf("\t\t4. 医生取号\n");
printf("\t----------------------------------\n");
printf("\t\t请输入要选择的功能编号:");
scanf("%d",&sel);
return sel;
}
int main()
{ int sel;
ReadData(); //先将硬盘中doctordata记事本中的数据读入到顺序表doctor_list中
do
{ system("cls"); //清屏
sel=showsel(); //返回主菜单中的选择项
switch(sel) //根据选择项调用对应的函数
{ case 0: break;
case 1:
system("cls");
doctorlist();
getch();break; /*查看科室及医生信息功能*/
case 2:
system("cls");
rnumber();
getch();break; //排号功能
case 3:
system("cls");
rsearch();
getch();break; //查看排号情况
case 4:
system("cls");
dtsearch(); //医生取号功能
getch();break;
case 5:
system("cls");
dtsearch();
getch();break; //后序用户可进入查询、删除并重新预约(未完成)
}
}while(sel); //当选择主菜单中序号0时,结束程序
return 0;
}