一,队列的定义
队列也是一种重要的线性结构。和栈同样需要顺序表或者链表为基础。与栈不同的是,队列是一种先进先出的线性表,所有数据被要求从队列一端进入,另一端离开。允许插入数据的一端叫队尾,允许离开的一端叫队头。
typedef struct QNode{ QelemType data; //链队列结点中的数据域 struct QNode *next; //链队列结点中的指针域 }QNode , *QueuePtr; typedef struct{ QueuePtr front; //队头指针 QueuePtr rear; //队尾指针 }LinkQueue;
QNode类是一个队列元素列,也就是说,队列内每个元素的类型都是QNode。因为要定义一个链队列,因此每个队列元素不但要包括数据本身,还要包括一个指针域,用来存放后继元素的指针。因此QNode是一个结构体,本质与链表相同。LinkQueue的结构体类型指向队列的头尾地址。
二.创建一个队列
①在内存中创建一个头结点,该头结点是为了方便操作人为添加的。(也可不定义)
②将队列的头指针和尾指针都指向这个生成的头结点,此时队列中没有任何队列元素,该队列为空队列。这种方式创建的队列,队列为空的判定方式就是头指针front和尾指针rear都同时指向头结点。
initQueue(LinkQueue *q) { //初始化一个空队列 q->front = q->rear = (QueuePtr)malloc(sizeof(QNode)); //创建一个头结点,队头队尾指针指向该结点 if(!q->front) exit(0); //创建头结点失败 q->front->next = NULL; //头结点指针域置NULL }
(1)用malloc()函数创建一个QNode类型的结点,将q->front和q->rear指针分别指向该头结点。
(2)然后将该头结点的指针域next置为空NULL。