数据结构(6): 链队——队列的链式表示和实现

/* 语言:C++ 编译环境:Visual C++6.0 链队——队列的链式表示和实现 */
#include <iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
// Status是函数返回值类型,其值是函数结果状态代码
typedef int Status;
// 自定义数据类型别名
typedef int QElemType;
using namespace std;

// 队列的链式存储结构
typedef struct QNode
{
    QElemType data;
    struct QNode *next;
}QNode, *QueuePtr;

typedef struct
{
    QueuePtr front; // 队头指针
    QueuePtr rear;  // 队尾指针
}LinkQueue;

// 链队的初始化
Status InitQueue(LinkQueue &Q)
{   // 构造一个空队列Q
    // 生成新结点作为头结点,队头和队尾指针指向此结点
    Q.front = Q.rear = new QNode;   
    Q.front->next = NULL;           // 头结点的指针域置空
    return OK;
}

// 链队的入队
Status EnQueue(LinkQueue &Q, QElemType e)
{   // 插入元素e为Q的新的队尾元素
    QueuePtr p;
    p = new QNode;  // 为入队元素分配结点空间,用指针p指向
    p->data =e;     // 将新结点数据域置为e
    p->next = NULL; // 将新结点插入到队尾
    Q.rear->next = p;
    Q.rear = p;     // 修改队尾指针
    return OK;
}

// 链队的出队
Status DeQueue(LinkQueue &Q, QElemType &e)
{   // 删除Q的队头元素,用e返回其值
    QueuePtr p;
    if(Q.front == Q.rear) return ERROR; // 若队列空,则返回ERROR
    p = Q.front->next;                   // p指向队头元素
    e = p->data;                         // e保存队头元素的值
    Q.front->next = p->next;             // 修改头指针
    // 最后一个元素被删,队尾指针指向头结点
    if(Q.rear == p) Q.rear = Q.front;    
    delete p;                            // 释放原队头元素的空间
    cout<<"Deleted."<<endl; // 可无视... 
    return OK;
}

// 取链队的队头元素
QElemType GetHead(LinkQueue Q)
{   // 返回Q的队头元素,不修改队头指针
    if(Q.front != Q.rear)           // 队列非空
        return Q.front->next->data; // 返回队头元素都值
    return ERROR;
}

int main()
{
    LinkQueue Q;
    // 列表菜单
    cout<<"1 InitQueue"<<endl;
    cout<<"2 EnQueue"<<endl;
    cout<<"3 DeQueue"<<endl;
    cout<<"4 GetHead"<<endl;

    int choice,e;
    while(1)
    {
        cout<<"Input a choice: ";
        cin>>choice;

        // 选择
        switch(choice)
        {
            case 1:
                InitQueue(Q);
                continue;
            case 2:
                EnQueue(Q,3);
                continue;
            case 3:
                DeQueue(Q,e);
                continue;
            case 4:
                cout<<"GetHead: "<<GetHead(Q)<<endl;
                continue;
            default:
                cout<<"End..."<<endl;
                break;
        }
        break;
    }
    return 0;
}

你可能感兴趣的:(数据结构)