链表模拟实现链队列,以下代码出自《大话数据结构》,用于模仿和学习:
#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;
}
以上代码比较简单,熟悉链表之后便信手拈来了。