队列简介
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
即:
* 插入:只能插入在链表最后
* 出队:只能从队头出
代码实现
ADT:
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#define QUETYPE char
typedef struct node {
QUETYPE data;
struct node *next;
} QueueNode, *QueueNodePtr;
typedef struct {
QueueNodePtr head;
QueueNodePtr tail;
} Queue, *QueuePtr;
QueuePtr createQueue();
QueueNodePtr createQueueNode(QUETYPE key);
void insertQueue(QueuePtr q, QUETYPE key);
QUETYPE outQueue(QueuePtr q);
void deleteQueue(QueuePtr q);
完整代码:
#include <stdio.h>
#include <malloc.h>
#include <memory.h>
#define QUETYPE char
typedef struct node {
QUETYPE data;
struct node *next;
} QueueNode, *QueueNodePtr;
typedef struct {
QueueNodePtr head;
QueueNodePtr tail;
} Queue, *QueuePtr;
QueuePtr createQueue() {
QueuePtr q = (QueuePtr)malloc(sizeof(Queue));
memset(q, 0, sizeof(Queue));
q->head = q->tail = NULL;
return q;
}
QueueNodePtr createQueueNode(QUETYPE key) {
QueueNodePtr q = (QueueNodePtr)malloc(sizeof(Queue));
memset(q, 0, sizeof(Queue));
q->next = NULL;
q->data = key;
return q;
}
void insertQueue(QueuePtr q, QUETYPE key) {
QueueNodePtr a = createQueueNode(key);
if (q->head == NULL) { //notice
q->head = q->tail = a;
}
else {
q->tail->next = a;
q->tail = a;
}
}
QUETYPE outQueue(QueuePtr q) {
QUETYPE v;
if (q->head != NULL) { //notice
v = q->head->data;
QueueNodePtr tmp = q->head->next;
free(q->head);
q->head = tmp;
}
else {
v = NULL;
}
return v;
}
void deleteQueue(QueuePtr q) {
if (q->head != NULL) { //notice
QueueNodePtr tmp = q->head;
QueueNodePtr tmp2;
while (tmp != NULL) {
tmp2 = tmp;
tmp = tmp->next;
free(tmp2);
}
}
free(q);
}
void main() {
QueuePtr q = createQueue();
for (int i = 0; i < 5; i++) {
insertQueue(q, i);
}
outQueue(q);
deleteQueue(q);
}