Data Structure 链队列(一道)

数据结构 课堂作业 实验六 实验报告

  • 第一题
    • 题目
    • 代码

第一题

题目

采用链队列实现病人看病的模拟程序。
(1)定义队列的存储结构;
(2)实现队列的初始化、判断是否为空、入队、出队等基本操作;
(3)调用队列的基本操作实现病人看病模拟程序包括排队、就诊、查询、退出等功能;

代码

//头文件
#include 
#include 
#include 
using namespace std;

//结构体设计
//节点单元
typedef struct QNode
{
    int data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct LinkQueue
{
    //链队列头节点
    QueuePtr front;
    //链队列尾节点
    QueuePtr rear;
}LinkQueue;
//初始化
void InitQueue_L(LinkQueue &Q)
{
	QueuePtr p=new QNode;
	p->next=NULL;
    Q.front=Q.rear=p;
}
//销毁操作
void DestroyQueue_L(LinkQueue &Q)
{
    //当Front还存在时
    while(Q.front)
    {
        //利用已有的尾指针
        //省空间
        //移动并且一步一步删除掉对应的空间
        Q.rear=Q.front->next;
        delete Q.front;
        Q.front=Q.rear;
    }
}
//清空操作
void ClearQueue_L(LinkQueue &Q)
{
    //和销毁相比为什么这个要重新设置指针
    //因为清空还要保存着这个队列
    //包括头尾两个指针
    //但是销毁就全部清空
    //所以不一样
    QueuePtr p,q;
    p=Q.front->next;
    while(p)
    {
        q=p;
        p=p->next;
        delete q;
    }
    Q.front->next=NULL;
    Q.rear=Q.front;
}
//求队列长度
int QueueLength_L(LinkQueue Q)
{
    QueuePtr p;
    p=Q.front;
    int length;
    length=0;
    while(p->next)
    {
        length++;
        p=p->next;
    }
    return length;
}
//取队首元素
void GetHead_L(LinkQueue Q,int &e)
{
    if(Q.front->next==NULL)
    {
        cout<<"The Queue is EMPTY."<<endl;
        return;
    }
    else
    {
        e=Q.front->next->data;
        return;
    }
}
//入队操作
void EnQueue_L(LinkQueue &Q,int &e)
{
    //存放元素的房间
    QueuePtr p;
    p->data=e;
    p->next=NULL;
    //准备进入链中
    Q.rear->next=p;
    Q.rear=p;
    return;
}
//出队操作
void DeQueue_L(LinkQueue &Q,int &e)
{
    if(Q.front->next==NULL)
    {
        cout<<"The Queue is EMPTY."<<endl;
        return;
    }
    QueuePtr p;
    //p是front后面的元素
    p=Q.front->next;
    e=p->data;
    Q.front->next=p->next;
    //如果只有一个元素
    if(Q.rear==p)
    {
        Q.rear=Q.front;
    }
    delete p;
}


void SeeDoctor()
{
    LinkQueue Q;
// 模拟病人在医院等候就诊的过程
    InitQueue_L(Q);			// 初始化链队列Q
    int flag=1;			// flag=1:接收病人;=0:停止就诊
    char ch;
    while(flag)
    {
        cout<<"请输入命令:";
        cin>>ch;
        switch(ch)
        {
            case 'a' :
            case 'A' :
                cout<<"病历号:";
                int n;
				cin>>n;
				cout<<endl;
                EnQueue_L(Q,n);// 入队等候就诊
                break;
            case 'n' :
            case 'N' :
                if(Q.front->next)
                {
                	int n;
                    DeQueue_L(Q,n); 		// 病人出队就诊
                    cout<<"病历号为"<<n<<"的病人就诊"<<endl;
                }
                else
                    cout<<"无病人等候就诊。"<<endl;
                break;
            case 's' :
            case 'S' :
                cout<<"下列排队的病人依次就诊:";
                while(Q.front->next)
                {// 所有病人依次出队就诊
                	int n;
                    DeQueue_L(Q,n);
                    cout<<n<<" ";
                }
                cout<<endl<<"今天不再接收病人排队!"<<endl;
                flag=0;
                break;
            default:
                cout<<"输入命令不合法!"<<endl;
        }
    }
} // SeeDoctor
int main()
{
    void SeeDoctor();
    SeeDoctor();
    return 0;
}

你可能感兴趣的:(寒假,数据结构,队列)