链表模拟实现链队列

96 阅读2分钟

链表模拟实现链队列,以下代码出自《大话数据结构》,用于模仿和学习:

#include <bits/stdc++.h>
using namespace std;
#define MAXSIZE 20;
//节点结构
typedef struct QNode
{
    int data;
    struct QNode *next;
}QNode,*QueuePtr;
//链队列结构
typedef struct
{
    QueuePtr front,rear;
}LinkQueue;
//访问
int visit(int c)
{
    cout<<c<<" ";
    return 1;
}
//构造空队列
int InitQueue(LinkQueue *Q)
{
    Q->front=Q->rear=new QNode;
    if(!Q->front) exit(OVERFLOW);//储存分配失败
    Q->front->next=NULL;
    return 1;
}
//销毁队列
int DestoryQueue(LinkQueue *Q)
{
    while(Q->front)
    {
        Q->rear=Q->front->next;
        free(Q->front);
        Q->front=Q->rear;
    }
    return 1;
}
//清空队列
int ClearQueue(LinkQueue *Q)
{
    QueuePtr q,p;
    Q->rear=Q->front;
    p=Q->front->next;
    Q->front->next=NULL;
    while(p)
    {
        q=p;
        p=p->next;
        free(q);
    }
    return 1;
}
//判空
int QueueEmpty(LinkQueue Q)
{
    if(Q.front==Q.rear) return 1;
    else return 0;
}
//返回队列长度
int QueueLength(LinkQueue Q)
{
    QueuePtr p;
    p=Q.front;
    int i=0;
    while(Q.rear!=p)
    {
        i++;
        p=p->next;
    }
    return i;
}
//不空则返回头元素
int GetHead(LinkQueue Q,int *e)
{
    if(Q.rear==Q.front) return 0;
    *e=Q.front->next->data;
    return 1;
}
//插入e为队尾新元素
int EnQueue(LinkQueue *Q,int e)
{
    QueuePtr s=new QNode;
    if(!s) exit(OVERFLOW);
    s->data=e;
    s->next=NULL;
    Q->rear->next=s;
    Q->rear=s;
    return 1;
}
//不空则删除头元素,用e返回
int DeQueue(LinkQueue *Q,int *e)
{
    if(Q->front==Q->rear) return 0;
    QueuePtr p;
    p=Q->front->next;
    *e=p->data;
    Q->front->next=p->next;
    if(Q->rear==p) Q->rear=Q->front;
    free(p);
    return 1;
}
//遍历输出
int QueueTraverse(LinkQueue Q)
{
    QueuePtr p;
    p=Q.front->next;
    while(p)
    {
        visit(p->data);
        p=p->next;
    }
    cout<<endl;
    return 1;
}
//主函数
int main()
{
    int i;
    int d;
    LinkQueue q;
    i=InitQueue(&q); 
    if(i) cout<<"构建空队列成功!"<<endl;
    cout<<"空?"<<QueueEmpty(q)<<endl;
    cout<<"队列长度为:"<<QueueLength(q)<<endl;
    EnQueue(&q,-5);
    EnQueue(&q,5);
    EnQueue(&q,10);
    cout<<"插入3个元素(-5,5,10)后,队列的长度为"<<QueueLength(q)<<endl;
    cout<<"空?"<<QueueEmpty(q)<<endl;
    cout<<"队列元素依次为:";
    QueueTraverse(q);
    i=GetHead(q,&d);
    if(i) cout<<"队头元素:"<<d<<endl;
    DeQueue(&q,&d);
    cout<<"删除了队头元素:"<<d<<endl;
    i=GetHead(q,&d);
    if(i) cout<<"新队头元素:"<<d<<endl;
    ClearQueue(&q);
    cout<<"清空队列后,依次输出,front,rear,front->next:"<<q.front<<" "<<q.rear<<" "<<q.front->next<<endl;
    DestoryQueue(&q);
    cout<<"销毁后,依次输出front,rear:"<<q.front<<" "<<q.rear<<endl;
    system("pause");
    return 0;
}

以上代码比较简单,熟悉链表之后便信手拈来了。