1 队列的定义
限定在表尾进行插入和在表头删除的操作的线性表,又称先进先出的线性表。
队列结点
struct queue_node {
QNdatatype data;
struct queue_node *next;
};
队列管理者
typedef struct{
struct queue_node *front;
struct queue_node *tail;
int size;
}queueNode, *linkqueue;
2 队列操作的实现
2.1 初始化
// 初始化一个空队列
linkqueue init_queue(){
linkqueue q = calloc(1, sizeof(queueNode)); // 分配一个空间
if(q != NULL){
q->tail = q->front = NULL;
q->size = 0;
}
return q;
}
2.2 入队
思路:
- 队列为空:队列管理者的对头和队尾指向新队尾
- 队列不为空:
原队尾指向新队尾
队列管理者结尾指针指向新队尾 - 队列大小+1
// 入队
void en_queue(struct queue_node *new, linkqueue q){
// 判断是否空队列
if (is_empty(q)){
q->tail = q->front = new;
}else{
q->tail->next = new; // 原队尾指向新队尾
q->tail = new; // 管理结尾指向新结尾
}
q->size++;
}
2.3 出队
思路
- 队列为空:出队失败,返回NULL
- 临时指针指向出队结点
- 队列管理者对头更换
- 出队结点不要乱指
- 存放-1
// 出队
// 成功:返回出队指针
// 失败:返回NULL
struct queue_node *out_queue( linkqueue q ){
// 判断是否为空
if(is_empty(q)){
printf("队列已空!");
return NULL;
}
// 判断队列是否只剩一个
if( q->size == 1){
q->tail = NULL;
}
struct queue_node *tmp = q->front; // tmp指向出队结点
q->front = tmp->next; // 管理者队头更换
tmp->next = NULL; // 出队tmp不要乱指
q->size--; // 栈的存放-1
return tmp;
}