level 6
西安恩仪联教育
楼主

一、队列概念和作用队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列是一种操作受限制的线性表。
进行插入操作的端称为队尾,进行删除操作的端称为队头。
多线程编程中队列的主要作用是?协调线程间的数据传递与任务分配?,作为线程之间传输数据的缓冲区使用,特别是在“生产者-消费者”模型中起到解耦和缓冲的作用。
二、队列设计与实现
采用链表的方式实现一个简易的队列,用来处理整型类型的数据,在链表尾部插入和头部删除,共计设计6个操作链表的函数,通过者六个函数操作链表就变成对队列的操作,实现一个简易队列。大家注意本队列仅能处理整型类型的数据,如果要处理其它类型数据,则需要重写队列,引入新的数据类型代替整型,设计思想不变。
设计两个文件queue.c 和queue.h
queue.h代码如下:
struct queue
{
int data;
struct queue *next;
}
struct queue *create_queue();
void push(int data,struct queue *que);
int front(struct queue *que);
void pop(struct queue *que);
void queue_free(struct queue *que);
int size(struct queue *que);
queue.c代码如下:
#include "queue.h"
//创建队列头节点
QUEUE *create_queue(void)
{
QUEUE *que = NULL;
que = (QUEUE *)calloc(1,sizeof(QUEUE));
if(que == NULL)
{
printf("内存分配失败\n");
exit(-1);
}
que->next = NULL;
return que;
}
//入队
void push(int data,QUEUE *que)
{
QUEUE *newdata = NULL;
QUEUE *end = NULL;
newdata = (QUEUE *)calloc(1,sizeof(QUEUE));
if(newdata == NULL)
{
printf("内存分配失败\n");
exit(-1);
}
newdata->data = data;
newdata->next = NULL;
if(que->next == NULL)
{
que->next = newdata;
}else
{
end = que->next;
while(end->next != NULL)
{
end = end->next;
}
end->next = newdata;
}
}
//查看当前队首元素
int front(QUEUE *que)
{
if(que->next == NULL)
{
printf("队列为空,无法获取队首元素\n");
exit(-1);
}
int data;
QUEUE *temp = NULL;
temp = que->next;
data = temp->data;
return data;
}
//出队
void pop(QUEUE *que)
{
if(que->next == NULL)
{
printf("队列为空,无法出队\n");
return;
}
QUEUE *temp = NULL;
temp = que->next;
que->next = temp->next;
free(temp);
}
//销毁队列
void queue_free(QUEUE *que)
{
QUEUE *temp = NULL;
QUEUE *head = que->next;
while(head != NULL)
{
temp = head;
head = head->next;
free(temp);
}
free(que);
}
//查看当前队列元素个数
int size(QUEUE *que)
{
int count = 0;
QUEUE *temp = NULL;
temp = que->next;
while(temp != NULL)
{
count++;
temp = temp->next;
}
return count;
}