3.6⽆头指针的循环队列的操作
题⽬:假设以带头结点的循环链表表⽰队列,并且只设⼀个指针指向队尾元素站点(注意不设头指针) ,试编写相应的置空队、判队空 、⼊队和出队等算法。
定义循环队列队列:
typedef struct QNode{
ElemType data;//数据域
struct QNode *next;//指针域
}QNode,*QueuePtr;
typedef struct{//不设头指针
QueuePtr rear;//尾指针
}LinkQueue;
1.置空循环队列
思路:置空队就是将除了头结点以外的其他结点全部删除。
算法描述:
Status InitEmpty(LinkQueue &Q){
ar->next){
struct QNode *s;//结点s暂存要删除的结点
s=(ElemType *)malloc(sizeof(Elemtype));
ar->next->next;//s指向头结点
sizeof 指针free(s);//删除s结点
}
return OK;
}
2.判断队列是否为空
思路:因为尾指针指向最后⼀个结点,所以当尾指针指向其本⾝即Q.rear->next==Q.rear时,队列为空。
算法描述:
Status IsEmpty(LinkQueue &Q){
ar->next==Q.rear){
return OK;//队列为空
}else{
return ERROR;//队列不为空
}
}
3.循环队列⼊队
算法描述:
Status InQueue(LinkQueue &Q,ElemType e){//将数据e插⼊队列(尾部)
struct QNode *p;
p=(ElemType *)malloc(sizeof(ElemType));//开辟⼀个空间,结点记为p
if(!p){
return ERROR;//存储空间分配失败
}
p->data=e;//p的数据域存放e
ar->next;//p指向头结点
return OK;
}
4.循环队列出队
算法描述:
Status OutQueue(LinkQueue &Q,ElemType &e){//删除头结点并把头结点数据域中的值赋给e ar->next==Q.rear){
return ERROR;//队空
}
struct QNode *p;
ar->next->next;//p指向头结点
e=p->data;//e取头结点数据域的值
if(p==Q.rear){//头结点和尾结点相等,即队列中只有⼀个元素
}else{//队列中有多个元素
free(p);
}
return OK;
}
5.循环队列初始化
思路:⽣成⼀个头结点,并分配存储空间,尾指针指向头结点。
算法描述:
Status InitQueue(LinkQueue &Q){
if(!Q.rear){
return ERROR;
}
return OK;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论