队列的链式存储实现c语言

队列的链式存储

队列的基本操作c语言实现

与栈相反,队列是一种先进先出(FIFO)的线性表     FIFO:first in first out

#include<stdio.h>
#include<malloc.h>
using namespace std;
typedef int ElemType;
typedef struct QNode{    //结点的定义
ElemType data;
QNode *next;
}QNode,*QueuePtr;
typedef struct      //链式存储队列的定义
{
QueuePtr front;   //头指针
QueuePtr rear;    //尾指针
}LinkQueue;
bool InitQueue(LinkQueue &Q)  //队列的初始化
{
Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)); 
if(!Q.front) return false;
Q.front->next=NULL;
return true;
}
bool EmptyQueue(LinkQueue Q)  //判断队列是否为空
{
if(Q.front==Q.rear) return true;
else return false;
}
int GetNumber(LinkQueue Q)   //返回队列元素个数
{
int count=1;
QueuePtr q=Q.front->next; //将q指向第一个元素的结点
while(q!=NULL)
{
q=q->next;
count++;
}
return count;
}
bool ClearQueue(LinkQueue &Q)  //清空队列
{
QueuePtr q=Q.front->next;
if(!q) return false;
while(q!=NULL)
{
free(Q.front);   //释放结点
Q.front=q;
q=q->next;
}
return true;
}
bool DestoryQueue(LinkQueue &Q)
{
QueuePtr q=Q.front; 
if(!q) return false;
while(q!=NULL)
{
free(Q.front);
q=q->next;
Q.front=q;
}
return true;
}
bool EnQueue(LinkQueue &Q,ElemType elem)  //入队
{
QueuePtr q=(QueuePtr)malloc(sizeof(QNode));  //初始化新结点
if(!q) return false;
q->next=NULL;             //指针域赋空
q->data=elem;            
Q.rear->next=q;         //链接q结点
Q.rear=q;               //移动尾指针
return true;
}
bool DeQueue(LinkQueue &Q,ElemType &elem) //出队
{
QueuePtr q=Q.front->next;
if(!q) return false;
    Q.front=q->next;
elem=q->data;
free(q);      //释放结点
return true;
}
void QueueTraverse(LinkQueue Q)  //队列的遍历
{
QueuePtr q=Q.front->next;
while(q!=NULL)
{
printf("%3i",q->data);
q=q->next;
}
printf("\n");
}
int main()
{
int elem1=1;
int elem2=2;
int elem3=3;
LinkQueue Q;
InitQueue(Q);
EnQueue(Q,elem1);
EnQueue(Q,elem2);
EnQueue(Q,elem3);
printf("队列元素个数 %i\n",GetNumber(Q));
printf("队列的遍历:");
QueueTraverse(Q);
ClearQueue(Q);  
if(EmptyQueue(Q)) printf("队空");
DestoryQueue(Q);
return 0;
}

猜你喜欢

转载自blog.csdn.net/lin1094201572/article/details/78744561