您的位置:首页 > 其它

单链队列——队列的链式存储结构

2015-11-28 20:26 344 查看
#include<iostream>

#include<stdlib.h>

using namespace std;

#define TURE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define INFEASIBLE -1

#define OVERFLOW -2

typedef int Status;

typedef struct QNode

{

int data;

struct QNode *next;

}QNode,*QueuePtr;

typedef struct

{

QueuePtr front;//对头指针

QueuePtr rear;//队尾指针

}LinkQueue;

Status InitQueue(LinkQueue &Q)

{

//构造一个队列

Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));

if(!Q.front) exit(OVERFLOW);

Q.front->next=NULL;

return OK;

}

Status DestroyQueue(LinkQueue &Q)

{

//销毁队列Q

while(Q.front)

{

Q.rear=Q.front->next;

free(Q.front);

Q.front=Q.rear;

}

return OK;

}

Status EnQueue(LinkQueue &Q,int e)

{

//插入元素e为Q新的队尾元素

QueuePtr p=(QueuePtr)malloc(sizeof(QNode));

if(!p) exit(OVERFLOW); //存储失败

p->data=e;

p->next=NULL;

Q.rear->next=p;

Q.rear=p;

return OK;

}

Status DeQueue(LinkQueue &Q,int &e)

{

//若队列不空,则删除Q的对头元素,用e返回其值,并返回OK;

//否则返回ERROE

if(Q.front==Q.rear) return ERROR;

QueuePtr p=Q.front->next;

e=p->data;

Q.front->next=p->next;

if(Q.rear==p) Q.rear=Q.front;

free(p);

return OK;

}

void QueueEmpty(LinkQueue Q)

{

//判断队列是否是空队列

if(Q.front==Q.rear) cout<<"队列是空队列"<<endl;

else cout<<"队列不空"<<endl;

}

void QueueLength(LinkQueue Q)

{

//统计队列元素的个数

int i=0;

QueuePtr p;

p=Q.front->next;

if(Q.front==Q.rear) cout<<'0'<<endl;

else

{

while(p)

{

p=p->next;

i++;

}

cout<<i<<endl;

}

}

void pri_(LinkQueue Q)

{

//输出队列中的元素

QueuePtr p=Q.front->next;

while(p)

{

cout<<p->data<<' ';

p=p->next;

}

cout<<endl;

}

int main()

{

LinkQueue str;

if(InitQueue(str)) cout<<"构造队列成功"<<endl;

else cout<<"构造队列失败"<<endl;

cout<<"请输入想构造队列的长度"<<endl;

int n,c;

cin>>n;

for(int i=0;i<n;i++)

{

cin>>c;

if(EnQueue(str,c)!=1) cout<<"插入元素失败"<<endl;

}

cout<<"队列的长度是:";

QueueLength(str);

cout<<"队列中的元素为:";

pri_(str);

if(DestroyQueue(str)==1) cout<<"销毁队列成功"<<endl;

return 0;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: