①基本定义
采用链式存储结构的队列称为链队,除了他本身的数据结点类型外,链队还需要一种链队结点类型(其实就是包含了两个指针的结构体,因为队列的操作分别在队头和队尾,所以一个指针指向队首结点,一个指针指向队尾结点)。和链栈一样,链队也不存在队满上溢出的情况。
②存储方式与结构
队空的条件:q->rear == NULL 或 q->frnot == NULL。
③实现
#include <iostream> #include <cstdlib> using namespace std; typedef int ElemType; typedef struct qnode { ElemType data; struct qnode *next; }DataNode; //链队数据结点类型 typedef struct { DataNode *front; //指向队首结点 DataNode *rear; //指向队尾结点 }LinkQuNode; //链队结点的类型 /*****初始化队列*****/ void InitQueue(LinkQuNode * &q) { q=(LinkQuNode*)malloc(sizeof(LinkQuNode)); q->front=q->rear=NULL; } /*****销毁队列*****/ void DestroyQueue(LinkQuNode * &q) { DataNode *pre=q->front,*p; //pre指向队首结点 if(pre!=NULL) { p=pre->next; //p指向结点pre的后继结点 while(p!=NULL) { free(pre); pre=p; p=p->next; //释放结点后,pre,p同步后移 } free(pre); //释放最后一个数据结点 } free(q); //释放链队结点 } /*****判断队列是否为空*****/ bool QueueEmpty(LinkQuNode *q) { return (q->rear==NULL); } /*****进队列*****/ void enQueue(LinkQuNode * &q,ElemType e) { DataNode*p; p=(DataNode *)malloc(sizeof(DataNode)); //创建新结点 p->data=e; p->next=NULL; if(q->rear==NULL) //若链队为空,则新结点既是队首结点又是队尾结点 q->front=q->rear=p; else { q->rear->next=p; //将结点p链到队尾,并将rear指向它 q->rear=p; } } /*****出队列*****/ bool deQueue(LinkQuNode * &q,ElemType &e) { DataNode *t; if(q->rear==NULL) return false; t=q->front; //t指向首结点 if(q->front==q->rear) //原来队列中只有一个数据结点时 q->front=q->rear=NULL; else q->front=q->front->next; e=t->data; free(t); return true; } int main() { return 0; }---代码和部分内容参考自《数据结构教程》