单链队列——队列的链式存储结构
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;
}
#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;
}
相关文章推荐
- hdu1077模拟
- 抄书问题
- vim中的杀手级插件: vundle
- Docker镜像
- Oracle数据库共享内存分配不足问题的解决
- iOS_UIImageView的contentMode属性--照片的显示模式
- 第三章:基本HTML结构
- 接口测试工具Postman(chrome插件)
- 【LeetCode从零单刷】Minimum Depth of Binary Tree
- Hibernate的配置文件
- Cassandra监控 - OpsCenter手册
- 学会调节自己
- 信息安全系统设计基础第十一周总结
- 字母图形
- 话题14--井然有序 运算顺序的详细挖掘
- 478B. Random Teams
- 「构建之法」与机械工程
- oc对象初始化
- 一起talk C栗子吧(第六十六回:C语言实例--DIY字符串比较函数)
- 字符串对比