//链队列的定义
typedef struct LinkNode{//链式队列结点
int data;//数据域
struct LinkNode *next;//指针域
}LinkNode;
typedef struct{//链式队列
LinkNode *front,*rear;//队列的队头和队尾指针
}LinkQueue;
//带头结点的基本操作
//初始化
void InitQueue(LinkQueue &Q)
{
Q.rear=Q.front=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
//判空
bool IsEmpty(LinkQueue Q)
{
return Q.front==Q.rear;//(或者Q.front->next==NULL)
}
void testQueue()
{
LinkQueue Q;
InitQueue(Q);
}
//插入结点(只能在队尾插入结点)(入队)
bool InsertQueue(LinkQueue &Q,int e)
{
LinkNode *s =(LinkNode*)malloc(sizeof(LinkNode));
s->data=e;
s->next=NULL;
Q.rear->next=s;//将新结点插入到rear之后
Q.rear=s;//修改表尾指针
return true;
}
//删除结点(只能删除队头结点)
bool DeleteQueue(LinkQueue &Q,int &e)
{
if(Q.front->next==NULL)
{
return false;
}
LinkNode* p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(p==Q.rear){
Q.rear=Q.front;
}
free(p);
return true;
}
//获取队头元素
bool GetElem(LinkQueue Q,int &e)
{
if(Q.front==Q.rear){
return false;
}
LinkNode* p=Q.front->next;
e=p->data;
return true;
}
//计算队列长度
int Length(LinkQueue Q)
{
LinkNode* p=Q.front->next;
int len=0;
while(p->next!=NULL)
{
p=p->next;
len++;
}
free(p);
return len;
}
//不带头结点的基本操作
typedef struct LinkNode{//链式队列结点
int data;
struct LinkNode* next;
}LinkNode;
typedef struct{//链式队列
LinkNode *front,*rear;//队列的队头和队尾指针
}LinkQueue;
//初始化
void InitQueue(LinkQueue &Q)
{
Q.front=NULL;
Q.rear=NULL;
}
//判空
bool IsEmpty(LinkQueue Q)
{
return (Q.front==NULL);
}
//入队(只能在队尾入队)
bool InsertQueue(LinkQueue &Q,int e)
{
LinkNode* s =(LinkNode*)malloc(sizeof(LinkNode));
s->data=e;
s->next=NULL;
if(Q.front==NULL)//在空队列中插入第一个元素
{
Q.front=s;//修改队头队尾指针(不带头结点的队列,第一个元素入队时需要特别处理)
Q.rear=s;
}else{
Q.rear->next=s;//新结点插入到rear结点之后
Q.rear=s; //修改rear指针
}
return true;
}
//出队(只能在队头删除)
bool DeleteQueue(LinkQueue &Q,int &e)
{
if(Q.front==NULL)
{
return false;//空队
}
LinkNode* p=Q.front;//p指向此次出队的结点
e=p->data;//用变量x返回队头元素
Q.front=p->next;//修改front指针
if(p==Q.rear){//此次是最后一个结点
Q.rear=NULL;//front指向NULL
Q.front=NULL;//rear指向NULL
}
free(p);//释放结点空间
return true;
}
//获取队头元素
bool GetElem(LinkQueue Q,int &e)
{
if(Q.front==NULL)
{
return false;
}
LinkNode* p=Q.front;
e=p->data;
free(p);
return true;
}
//计算队列长度
int Length(LinkQueue Q)
{
int len = 0;
LinkNode *p=Q.front;
while(p->next!=NULL)
{
p=p->next;
len++;
}
free(p);
return len;
}