用只有尾节点指针的循环单链表作为队列存储结构

采用一个不带头节点只有一个尾节点指针 rear 的循环单链表存储队列,设计队列的初始化、进队出队算法。

(其中每个结点的类型为LinkNode单链表结点类型,对应链队的4要素如下:

  • 队空的条件:rear==NULL
  • 队满的条件:不考虑
  • 元素e的进队操作:新建一个结点存放元素e (由p指向它),将结点p插入作为尾结点,让rear指向这个新的尾结点
  • 出队操作:取出队头结点(rear所指结点的后继结点)的data值并将其删除 )

复制代码
void initQueue(LinkNode * & rear)  //初始化算法
{
       rear=NULL;
}

void enQueue(LInkNode * & rear, ElemType e)   //进队算法
{
       LinkNode * p;
       p=(LinkNode * )malloc(sizeof(LinkNode) ); //创建新节点
       p->data = e;
       if ( rear==NULL){       //原链队为空
            p->next=p;           //改为循环链表
            rear=p;                 //rear 指向新节点
        }
       else{
            p->next=rear->next;   //原链队不空,将p结点插到rear之后
            rear->next=p;         //改为循环链表
            rear=p;                  //rear指向新节点
        }    
}

bool deQueue(LinkNode * &rear, ElemType &e)
{                                          //出队
    LinkNode * t;
    if(rear==NULL)                 //队空
        return false;
    else if (rear -> next==rear)    //原队中只有一个节点
    {
        e=rear->data;
        free(rear);
        rear=NULL;                //让rear为空链表
     }  
    else{                             //原队中有两个及以上结点
        t=rear->next;            //t指向头结点
        e=t->data;
        rear->next=t->next;   //删除t结点
        free(t);                      //释放空间
    }     
    return true;
}            

bool queueEmpty(LinkNode * rear)    //判断队空
{
      return(rear==NULL);            
}
复制代码

 

posted @   这个士兵有点逗  阅读(302)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示