您的位置:首页 > 其它

链队列--队列的链式表示和实现

2015-12-09 15:23 330 查看
和栈一样,队列也是操作受限的线性表,只允许在队尾插入元素,在队头删除元素。对于链队列结构,为了便于插入元素,设立了队尾指针。这样,插入元素的操作与队列长度无关。

//链队列--队列的链式表示和实现
#include<stdio.h>
#include<malloc.h>
#include<process.h>

#define TRUE 1
#define FALSE 0
#define ERROR 0
typedef int Status;
#define OVERFLOW -2
#define OK 1
//队列的链式存储结构
struct QNode
{
int data;
QNode *next;//指向QNode类型的next指针
};
typedef QNode* QueuePtr;

struct LinkQueue
{
QueuePtr front,rear;
};
//队列是操作受限的线性表,只允许在对头删除元素,在队尾插入元素

//构造一个空的队列
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q.front)
exit(OVERFLOW);
Q.front->next=NULL;
}
//销毁队列Q
void DestroyQueue(LinkQueue &Q)//&Q 引用
{
while(Q.front)
{
Q.rear=Q.front->next;
free(Q.front);
Q.front=Q.rear;
}
}
//若Q为空队列,返回TRUE
Status QueueEmpty(LinkQueue Q)
{
if(Q.front->next == NULL)
return TRUE;
else
return FALSE;
}
//求队列的长度(该队列带有头结点)
int QueueLength(LinkQueue Q)
{
int i=0;
QNode *p;
p=Q.front;
while(p != Q.rear)
{
i++;
p=p->next;
}
return i;
}
//为了插入元素设立了队尾指针,这样插入元素的操作就与队列的长度无关
//插入元素e为新的队尾元素(入队列)
void EnQueue(LinkQueue &Q,int e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)
exit(OVERFLOW);
p->data=e;
p->next=NULL;
Q.rear->next=p;//讲结点链入队列中
Q.rear=p;//队尾指针指向队尾元素
}
//如果队列不空,删除Q的队头元素,用e返回其值,并返回OK(出队列)
Status DeQueue(LinkQueue &Q,int &e)
{
QueuePtr p;
if(Q.front == Q.rear)
return ERROR;
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 PrintQueue(LinkQueue Q)
{
QNode *p;
p=Q.front->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//主函数
void main()
{
int i,e;
LinkQueue q;
InitQueue(q);
EnQueue(q,-5);
EnQueue(q,5);
EnQueue(q,10);
printf("是否为空队列%d(1:是,0:否)\n",QueueEmpty(q));
printf("队列中的元素个数为 %d\n",QueueLength(q));
printf("打印队列:q=");
PrintQueue(q);
i=DeQueue(q,e);
if(i)
printf("出队列一个元素为:%d",e);
else
printf("出队列失败!");
printf("\n");
printf("队列中的元素个数为 %d\n",QueueLength(q));
}


(1)

单链队列的节点的类型:

struct QNode

{

int data;

QNode *next;//指向QNode类型的next指针

};



(2)

LinkQueue类型:

struct LinkQueue

{

QueuePtr front,rear;

};



具有2个节点的单链队列的示例:



(3)空队列和销毁后的队列





销毁后的队列 空队列

(4)入队列:



(5)出队列:



(6)程序的运行结果:

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