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

采用一个不带头节点只有一个尾节点指针 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 @ 2024-05-25 13:33  这个士兵有点逗  阅读(402)  评论(0)    收藏  举报