队列
和栈相反,队列是一种先进先出的线性表,简称FIFO结构,它只允许在表的一端进行删除元素,另一端进行插入元素,允许插入的一端称为队尾,允许删除的一端称为队头
链式队列的实现
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//队列的链式存储结构
typedef struct Node
{
int data;
struct Node *pNext;
}NODE,*PNODE;
typedef struct Queue
{
PNODE front; //队头指针
PNODE rear; //队尾指针
}QUEUE,*PQUEUE;
void Init(PQUEUE pQ);//构造一个空队列
void Destroy(PQUEUE pQ);//销毁队列
void Clear(PQUEUE pQ);//清空队列
bool Empty(PQUEUE pQ);//判断队列是否为空
int Length(PQUEUE pQ);//返回队列长度
bool GetHead(PQUEUE pQ,int *e);//用e返回队头元素
void Enqueue(PQUEUE pQ,int val);//入队
bool Dequeue(PQUEUE pQ,int *e);//出队,用e返回其值
void Traverse(PQUEUE pQ);//遍历队列中的元素
int main()
{
int val;
QUEUE Q;
Init(&Q);
if(Empty(&Q))
printf("队列为空!\n");
else
printf("队列不为空!\n");
printf("入队后的元素为:");
Enqueue(&Q,1);
Enqueue(&Q,2);
Enqueue(&Q,3);
Enqueue(&Q,4);
Enqueue(&Q,5);
Enqueue(&Q,6);
Traverse(&Q);
GetHead(&Q,&val);
printf("队头的元素为:%d\n",val);
Dequeue(&Q,&val);
printf("出队的元素为:%d\n",val);
Dequeue(&Q,&val);
printf("出队的元素为:%d\n",val);
Dequeue(&Q,&val);
printf("出队的元素为:%d\n",val);
Clear(&Q);
if(Empty(&Q))
printf("队列为空!\n");
else
printf("队列不为空!\n");
Destroy(&Q);
return 0;
}
void Init(PQUEUE pQ)
{
PNODE pHead = (PNODE)malloc(sizeof(NODE));
if(NULL == pHead)
exit(-1);
pQ->front = pHead;
pQ->rear = pHead;
pHead->pNext = NULL;
}
void Destroy(PQUEUE pQ)
{
while(pQ->front != NULL)
{
pQ->rear = pQ->front->pNext;
free(pQ->front);
pQ->front = pQ->rear;
}
}
void Clear(PQUEUE pQ)
{
PNODE p = pQ->front->pNext,q;
while(p != NULL)
{
q = p->pNext;
free(p);
p = q;
}
pQ->rear = pQ->front;
pQ->front->pNext = NULL;
}
bool Empty(PQUEUE pQ)
{
if(pQ->front == pQ->rear)
return true;
else
return false;
}
int Length(PQUEUE pQ)
{
int count = 0;
PNODE p = pQ->front->pNext;
while(p != NULL)
{
count++;
p = p->pNext;
}
return count;
}
bool GetHead(PQUEUE pQ,int *e)
{
PNODE p;
if(pQ->front == pQ->rear)
return false;
p = pQ->front->pNext;
*e = p->data;
return true;
}
void Enqueue(PQUEUE pQ,int val)
{
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL == pNew)
exit(-1);
pNew->data = val;
pNew->pNext = NULL;
pQ->rear->pNext = pNew;
pQ->rear = pNew;
}
bool Dequeue(PQUEUE pQ,int *e)
{
PNODE p;
if(pQ->front == pQ->rear)
return false;
p = pQ->front->pNext;
*e = p->data;
pQ->front->pNext = p->pNext;
if(p == pQ->rear)
pQ->rear = pQ->front;
free(p);
return true;
}
void Traverse(PQUEUE pQ)
{
PNODE p = pQ->front->pNext;
while(p != NULL)
{
printf("%d ",p->data);
p = p->pNext;
}
printf("\n");
}