链式队列

链式队列

链式队列,简称"链队列",即使用链表实现的队列存储结构。

image.png

结构体

struct Node{
    DataType info;
    Node * next;
};
typedef Node* PNode;
struct LinkQueue{
    PNode front;
    PNode rear;
};

typedef LinkQueue * PLinkQueue;

 

创建一个空队列

 

PLinkQueue createEmptyQueue(){
    PLinkQueue plqu = (PLinkQueue)malloc(sizeof(LinkQueue));
    if (plqu!=NULL)
    {
        plqu->front=NULL;
        plqu->rear =NULL;
    }else
    {
        cout<<"Out of space "<<endl;
        return NULL;
    }
    return plqu;
}

 

 

 

判断是否是空队列

int isEmptyQueue(PLinkQueue plqu){
    return plqu->front==NULL;
}

 

 

 

进队运算

例如,在图 1 的基础上,我们依次将 {1,2,3} 依次入队,各个数据元素入队的过程如图 2 所示:

image.png

void enQueue( PLinkQueue plqu, DataType x ) {
    PNode p;
    p = (PNode )malloc( sizeof( struct Node ) ); /*申请新结点空间*/
    if ( p == NULL ) 
        printf("Out of space!"); /*申请新结点失败*/
    else
    { 
        p->info = x;
        p->next = NULL; /*填写新结点信息*/
    if (plqu->front == NULL) 
        plqu->front = p; /*插入前是空队列*/
    else
        plqu->rear->next= p; /*将新结点插入*/
    plqu->rear = p; /*修改队尾指针*/
    }
    cout<<plqu->front->info<<"  ";
    cout<<plqu->rear->info<<" "<<endl;
}

 

出队运算

当链式队列中,有数据元素需要出队时,按照 "先进先出" 的原则,只需将存储该数据的节点以及它之前入队的元素节点按照原则依次出队即可。这里,我们先学习如何将队头元素出队。

 

链式队列中队头元素出队,需要做以下 3 步操作:

  1. 通过 top 指针直接找到队头节点,创建一个新指针 p 指向此即将出队的节点;
  2. 将 p 节点(即要出队的队头节点)从链表中摘除;
  3. 释放节点 p,回收其所占的内存空间;

 

例如,在图 2b) 的基础上,我们将元素 1 和 2 出队,则操作过程如图 3 所示:

image.png

 

void deQueue(PLinkQueue plqu){
    PNode p;
    if (plqu->front==NULL)
    {
        cout<<"Empty queue"<<endl;
    }else
    {
        p=plqu->front;//取得头指针
        plqu->front=p->next;//修改头指针
        free(p);
    }
    //cout<<plqu->front->info<<"  ";
    //cout<<plqu->rear->info<<" "<<endl;
}

 

取对头元素

 

DataType getFrontQueue(PLinkQueue plqu){
    if (plqu->front==NULL)
    {
        cout<<"Empty";
        return -1;
    }else
    {
        //   cout<<plqu->rear->info<<endl;
        return plqu->front->info;
    }
}
 

遍历

 

void display(PLinkQueue plqu){
    PLinkQueue fr=plqu;
    if (plqu->front==NULL)
    {
        return;
    }else
    {
        while(fr->front!=NULL){
            cout<<fr->front->info<<" ";
            fr->front=fr->front->next;
        }
    }
}

 

 
posted @ 2020-05-28 20:48  多发Paper哈  阅读(192)  评论(0编辑  收藏  举报
Live2D