队列链式存储主要有两个方面需要注意,一个是定义时应该定义两种结构体,一个是具体节点,一个是队列本身。具体节点用于存储具体数据data和指向下一个节点的指针 * next。而队列本身的结构体只会储存两个具体节点的指针,一个指向队头,一个指向队尾。
第二个需要注意的是,出队操作,对于只剩下一个元素的队列而言,需要队队尾指针操作,使其等于头指针,以达到队空的目的,而其他情况下只需要修改头结点指向后直接释放该节点即可。
完整代码

#include<bits\stdc++.h>
using namespace std;

#define ElementType int

typedef struct LinkNode{
    ElementType data;
    struct LinkNode *next;
}LinkNode;
typedef struct{
    LinkNode *front,*rear;
}LinkQueue;

void IniQueue(LinkQueue &Q){
    Q.front=Q.rear=(LinkNode *)malloc(sizeof(LinkNode));
    Q.front=NULL;
}

bool IsEmpty(LinkQueue &Q){
    if(Q.front==Q.rear){
        printf("Queue is Empty!");
        return true;
    }
    return false;
}

void EnQueue(LinkQueue &Q,ElementType x){
    LinkNode *p=(LinkNode *)malloc(sizeof(LinkNode));
    p->data = x;
    p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
}

bool DeQueue(LinkQueue &Q,ElementType &x){
    if(IsEmpty(Q)){
        return false;
    }else{
        LinkNode *p = Q.front->next;
        x = p->data;
        if(p==Q.rear){
            Q.rear = Q.front;
        }
        free(p);
        return true;
    }
}

本文由博客一文多发平台 OpenWrite 发布!