队列是一种功能受限的线性表,在队列的一端进行入队,另一端出队,可以理解为一端插入数据,一端删除数据。所以队列是先进先出,区别于栈,下面我们主要详细看一下链式队列结构。
先给int起别名 #define TYPE int
定义一下链队列的结构:队列结构包括队头指针,队尾指针和结点数量;结点包括数据域和指针域。
typedef struct Node
{
TYPE data;
struct Node *next;
}Node;
typedef struct ListQueue
{
Node *front;
Node *rear;
int cnt;
}ListQueue;
下面我们来看一下具体的运算:
创建结点
//创建结点
Node *create_node(TYPE data)
{
Node *node=malloc(sizeof(Node));
node->data=data;
node->next=NULL;
return node;
}
创建链式队列
//创建链式队列
ListQueue *create_queue(void)
{
ListQueue *queue=malloc(sizeof(ListQueue));
queue->front=NULL;
queue->rear=NULL;
queue->cnt=0;
return queue;
}
销毁
//销毁
void destroy_queue(ListQueue *queue)
{
while(out_queue(queue));
free(queue);
queue=NULL;
}
入队
//入队
void in_queue(ListQueue *queue,TYPE val)
{
Node *node=create_node(val);
if(0==queue->cnt)
{
queue->front=node;
queue->rear=node;
queue->cnt++;
}
else
{
queue->rear->next=node;
queue->rear=node;
queue->cnt++;
}
}
出队
//出队
bool out_queue(ListQueue *queue)
{
if(0==queue->cnt) return false;
Node *temp=queue->front;
queue->front=temp->next;
free(temp);
queue->cnt--;
return true;
}
取队头
//取队头
bool head_queue(ListQueue *queue,TYPE *val)
{
if(0==queue->cnt) return false;
*val=queue->front->data;
return true;
}
取队尾
//取队尾
bool tail_queue(ListQueue *queue,TYPE *val)
{
if(0==queue->cnt) return false;
*val=queue->rear->data;
return true;
}
遍历
//遍历
void show_queue(ListQueue *queue)
{
for(Node *n=queue->front;n->next;n=n->next)
{
printf("%d ",n->data);
}
printf("\n");
}
到这里我们的链队列的基本操作也算完成的差不多了。
over