链式队列

来源:互联网 发布:淘宝虚拟代理挣钱吗 编辑:程序博客网 时间:2024/06/02 02:27

以单链表的存储方式构建队列,动态分配内存空间,不用考虑上溢。

typedef struct node{    ElemType data;    node * next;} ListNode;typedef struct{    ListNode * front;    ListNode * rear;}LiQueue;

这里写图片描述
四要素:
空队列:rear = NULL
满队列:不考虑满队列。
入队列:申请一块新的内存空间,接到rear的next,rear,front指向新的节点。
出队列:将front指向的首结点,输出节点并释放。

链队操作的函数
①初始化队列

    void InitQueue(LiQueue *&q)    {        q = (LiQueue *)malloc(sizeof(LiQueue));        q->front = NULL;        q->rear = NULL;    }

②销毁队列

//链队的释放,一个指针指向队列的头结点,剩下的就如单链表的释放操作,p、q两指针相随释放其他节点。void DestroyQueue(LiQueue *&q){    LiQueue * p = q->front,* r;       if(p!=NULL){        r = p->next;        while(r!=NULL)        {            free(p);            p = r;            r = p->next;        }    free(p);    free(q);    }}

③队列判空

bool EmptyQueue(LiQueue *&q){    return (q->rear==NULL);}

④进队EnQueue

void EnQueue(LiQueue *&q,ElemType e){    LiQueue *p = (LiQueue *)malloc(sizeof(LiQueue));    p->next = NULL;    p->data = e;    if(q->rear==NULL)        //当在空队列进队时,front也需指向首节点    {        q->front = q->rear = p;    }    else    {        q->rear->next = p;        q->rear = p;    }}

⑤出队DeQueue
当队列中只有一个元素时,出队后,需将rear,front都赋值NULL

bool DeQueue(LiQueue *&q,ElemType &e){    ListNode * n;    if(q->rear==NULL)        return false;    n = q->front;    e = n->data;    if(q->front==q->rear)        q->front = q->rear = NULL;    else        q->front = q->front->next;    free(n);    return true;}
原创粉丝点击