本章内容是基于上一篇文章单链表的实现 C-单链表的实现 。
队列是先进先出(First in First out)的线性数据结构. 通常有2个主要的操作:enqueue 和 dequeue。
enqueue操作是将元素添加到列队中。
dequeue操作是将元素从队列中移除。
链表经常用于队列的实现。enqueue 操作是从链表的头部(head)添加元素,dequeue 操作是从链表的尾部(tail)移除元素。
队列定义
定义队列和相关操作
// 定义队列
typedef LinkedList Queue;
// 初始化队列
void initQueue(Queue *queue)
{
init_linkedlist(queue);
}
// 添加元素
void enqueue(Queue *queue, void *data) {
addHead(queue, data);
}
// 移除元素
void* dequeue(Queue *queue)
{
pNode node = queue->head;
void* data;
if (queue->head == NULL){
data = NULL;
} else if (queue->head == queue->tail) {
queue->head = queue->tail = NULL;
data = node->data;
free(node);
} else {
// 找到倒数第二个节点,由于之前实现的链表是单链表,只能这么找
while (node->next != queue->tail)
{
node = node->next;
}
queue->tail= node;
node = node->next;
queue->tail->next = NULL;
data = node->data;
free(node);
}
return data;
}
示例说明
Queue queue;
// 初始化
initQueue(&queue);
int a = 20;
int b = 30;
int c = 40;
int *ptr_1 = &a;
int *ptr_2 = &b;
int *ptr_3 = &c;
enqueue(&queue, ptr_1);
enqueue(&queue, ptr_2);
enqueue(&queue, ptr_3);
void *data = dequeue(&queue);
printf("Dequeued %d\n", *((int*) data));
data = dequeue(&queue);
printf("Dequeued %d\n", *((int*) data));
data = dequeue(&queue);
printf("Dequeued %d\n", *((int*) data));
结构打印:
Dequeued 20
Dequeued 30
Dequeued 40
以上内容,如有错误,欢迎留言交流或添加公众号交流。