一.多文件的基本要点
多文件结构便于代码的解读与改进
- 文件一般分为
(.h)文件一般包括函数的定义与声明。
(.cpp)函数的主要内容。
(main)主要体现函数的作用,对于函数的调用。
2.(.cpp)文件对于(.h)函数的调用需要在(.cpp)文件头加上#include"LinkQueue.h"(双引号中为.h函数的函数名)。
3.对于复杂的多文件,往往是多个份文件,为了防止头文件的重复定义与冲突则需要采用
前两句在(.h)文件头,后一句为文件尾。
其中前两句语言后部代码为该文件文件名的大写形式。
二.简单的医院的就诊系统
主要包括候诊,就诊,查看排队情况(输入病历号查看之前候诊人数),查看看诊(是否有人候诊)。其中能够引用队列的基本知识,候诊为入队,就诊为出队。
1.结构的定义(与队列有一些不同)
主要差别在于队列中数据类型为int,此时数据类型为结构体
typedef struct
{
char str[20];
int num;
}ElemType;
指针结构体多定义一个int zong以记录就诊总人数。
typedef struct
{
int Qzong;
Queue front;
Queue rear;
}LinkQueue;
候诊,就诊与上一个队列中的要点相同可查看上一个文章。
2.查看排队情况
定义一个指针指向节点,定义i=0.
采用while循环当当节点数据域的病历号与所输入病历号不同时i++,指针向后移动。
i则为之前人数,在采用循环输出名称病历号。
status search(LinkQueue &Q,ElemType &e,int num)
{
if(Q.front==Q.rear) return ERROR;
QNode *p;
p=Q.front->next;
int i=0;
while(p->data.num!=num)
{
i++;
p=p->next;
}
cout<<"之前还有"<<i<<"人候诊"<<endl;
p=Q.front->next;
for(i;i>0;i--)
{
cout<<"姓名:"<<p->data.str<<endl;
cout<<"病历号:"<<p->data.num<<endl;
p=p->next;
}
return OK;
}
3.剩余人数
定义一个指针指向头指针,定义i=0.
采用while循环,当P不等于Q.real(尾指针)时即还在候诊,令i++,p向后移动。
status renshu(LinkQueue Q)
{
if(Q.rear==Q.front) return ERROR;
int i=0;
QNode *p;
p=Q.front;
while(p!=Q.rear)
{
i++;
p=p->next;
}
cout<<"还有"<<i<<"个人候诊"<<endl;
return OK;
}
总函数:(分为多文件形式)
以下文件名依次为:LinkQueue.h LinkQueue.cpp function.h function.cpp main1.cpp
#include"LinkQueue.h"
status InitQueue(LinkQueue &Q)
{
Q.Qzong=0;
QNode *p=new QNode;
Q.front=Q.rear=p;
Q.front->next=NULL;
return OK;
}
status push(LinkQueue &Q,ElemType e)
{
QNode *p;
p=new QNode;
if(!p) return ERROR;
p->data=e;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
Q.Qzong++;
return OK;
}
status pop(LinkQueue &Q,ElemType &e)
{
QNode *p;
if(Q.rear==Q.front) return ERROR;
p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p) Q.rear=Q.front;
delete p;
return OK;
}
status Get(LinkQueue &Q,ElemType &e)
{
if(Q.rear==Q.front) return ERROR;
e=(Q.front->next)->data;
return OK;
}
status search(LinkQueue &Q,ElemType &e,int num)
{
if(Q.front==Q.rear) return ERROR;
QNode *p;
p=Q.front->next;
int i=0;
while(p->data.num!=num)
{
i++;
p=p->next;
}
cout<<"之前还有"<<i<<"人候诊"<<endl;
p=Q.front->next;
for(i;i>0;i--)
{
cout<<"姓名:"<<p->data.str<<endl;
cout<<"病历号:"<<p->data.num<<endl;
p=p->next;
}
return OK;
}
status renshu(LinkQueue Q)
{
if(Q.rear==Q.front) return ERROR;
int i=0;
QNode *p;
p=Q.front;
while(p!=Q.rear)
{
i++;
p=p->next;
}
cout<<"还有"<<i<<"个人候诊"<<endl;
return OK;
}
void show(ElemType e)
{
cout<<"病历号:"<<e.num<<endl;
cout<<"姓名:"<<e.str<<endl;
}
#ifndef FUNCTION_H
#define FUNCTION_H
#include"LinkQueue.h"
#include<stdlib.h>
status shangban(LinkQueue &Q,int &flat);
void houzhen(LinkQueue &Q);
void jiuzhen(LinkQueue &Q);
void chakan(LinkQueue Q);
void xiaban(LinkQueue &Q);
void menu();
#endif
#include"function.h"
status shangban(LinkQueue &Q,int &flat)
{
if(InitQueue(Q)==OK)
{
cout<<"准备成功"<<endl;
flat=1;
}
else cout<<"准备失败"<<endl;
}
void houzhen(LinkQueue &Q)
{
ElemType e;
cout<<"输入病历号:";
cin>>e.num;
cout<<"输入姓名:";
cin>>e.str;
if(push(Q,e)==OK) cout<<"挂号成功"<<endl;
else cout<<"挂号失败";
}
void jiuzhen(LinkQueue &Q)
{
if(Q.front==Q.rear) cout<<"暂时无人候诊"<<endl;
ElemType e;
if(pop(Q,e)==OK)
{
cout<<"成功"<<endl;
show(e);
}
}
void chakan(LinkQueue Q)
{
ElemType e;
int num;
cout<<"输入病历号:";
cin>>num;
if(search(Q,e,num)==ERROR) cout<<"暂无人就诊"<<endl;
}
void xiaban(LinkQueue &Q)
{
cout<<"今日总就诊人数为:"<<Q.Qzong<<endl;
}
void menu()
{
int flat=0;
LinkQueue Q;
int choice;
while(1)
{
cout<<"1.上班 2.候诊 3.就诊 "<<endl;
cout<<"4.查看排队情况 5.查看是否有人候诊 6.下班 "<<endl;
cout<<"请输入操作序号:";
cin>>choice;
switch(choice)
{
case 1:
shangban(Q,flat);
break;
case 2:
if(flat==0)cout<<"医生未上班"<<endl;
else houzhen(Q);
break;
case 3:
if(flat==0)cout<<"医生未上班"<<endl;
else jiuzhen(Q);
break;
case 4:
if(flat==0)cout<<"医生未上班"<<endl;
else chakan(Q);
break;
case 5:
if(flat==0)cout<<"医生未上班"<<endl;
else renshu(Q);
break;
case 6:
if(flat==0)cout<<"医生未上班"<<endl;
else xiaban(Q);
break;
default :
cout<<"序号不合法,请重新选择"<<endl;
}
system("pause");
system("cls");
}
}
#include"function.h"
int main()
{
menu();
return 0;
}