分别定义两个结构体——数值链队列、头尾结点队
typedef struct Qnode{
QElemType data;
struct Qnode *next;
}Qnode,*QueuePtr;
typedef struct{
Qnode *front;
Qnode *rear;
}LinkQueue;
问题:
1、编写函数,实现链式队列的基本操作;
2、编写函数,实现循环队列的基本操作。
一、各函数代码如下
解题一:
//链队的初始化
int InitQueue(LinkQueue &Q){
Q.front = Q.rear = new Qnode;//生成一个新结点,队头队尾指针指向此结点
Q.front->next = NULL;//头结点的指针域置空
return 1;
}
//入队
int enQueue(LinkQueue &Q,int e){
Qnode *p = new Qnode;
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return 1;
}
//出队
void deQueue(LinkQueue &Q){
int a;
Qnode *temp;
if(Q.front==Q.rear) //队为空,出队失败
{
printf("An empty Queue error!!!!\n");
}
else
{
temp=Q.front->next;
a=temp->data;
Q.front->next=temp->next;
if(Q.front==temp) //如果队中只有一个元素X,则X出队后成为空队
{
Q.rear=Q.front;
}
delete temp; //释放存储空间
printf("队头元素%d,出队成功.\n",a);
}
}
//取队头元素
int getHead(LinkQueue Q){
if(Q.front != Q.rear){
return Q.front->next->data;
}
}
/判断队列为空性
int judgeQueue(LinkQueue Q){
return (Q.rear == Q.front);
}
//链队长度
int queueLength(LinkQueue Q){
int count=0;
Qnode *p=Q.front->next;
while(p!=NULL){
count++;
p=p->next;
}
return count;
}
//遍历队列
void show_queue(LinkQueue Q){
Qnode *p=Q.front->next;
cout<<"当前元素从头到尾:";
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
}
//清除队列
void clearQueue(LinkQueue &Q){//除头结点外,对所有结点进行清除
if(Q.front==Q.rear)//如果头指针与尾指针指向相同,则链队为空
return;//无需清除
Qnode *p=Q.front->next;//指针p指向头结点后第一个有效结点
while(p!=NULL)
{
Q.front->next=p->next;//头结点的指针域保存第二个有效结点的地址
delete p;//释放第一个有效结点
p=Q.front->next;//指针p重新指向头结点后第一个有效结点
}
//释放完成后,对尾部指针进行修改
Q.rear=Q.front;//队尾指针指向头结点
}
//销毁队列
void