队的特点是先进先出,上一篇已经说过队的顺序存储,本文用链表来实现队列的特性功能。
在使用链表时,不用考虑由于假 队满使用循环队列的情况了。
故队列特性功能包括:创建、入队、出队、队空、以及打印。
首先定义队的节点,然后还需要 front 和rear 使出队和入队更易操作。具体定义如下:
typedef struct linkqueuenode{ //定义链式队列的结点类型
datatype data;
struct linkqueuenode *next;
}linkqueue_node,*linkqueue_pnode;
typedef struct linkqueue{ //将front 和 rear 封装成指针
linkqueue_pnode front,rear;
}link_queue,*link_pqueue;
功能实现代码如下:
void init_linkqueue(link_pqueue * Q) //创建队列
{
if((*Q = (link_pqueue)malloc(sizeof(link_queue))) == NULL)
{
printf("malloc failed!\n");
return ;
}
if(((*Q)->front = (linkqueue_pnode)malloc(sizeof(linkqueue_node)))== NULL)
{
printf("malloc failed!\n");
return ;
}
(*Q)->front->next = NULL;
(*Q)->rear = (*Q)->front;
}
bool in_linkqueue(datatype data,link_pqueue q) //入队
{
linkqueue_pnode new;
if((new = (linkqueue_pnode)malloc(sizeof(linkqueue_node)))== NULL)
{
printf("malloc failed!\n");
return false;
}
new->data = data;
new->next = q->rear->next; //尾部插入
q->rear->next = new;
q->rear = q->rear->next;
return true;
}
bool is_empty_linkqueue(link_pqueue q) //队空
{
if(q->rear == q->front)
return true;
else
return false;
}
bool out_linkqueue(link_pqueue q,datatype *D) //出队
{
linkqueue_pnode t;
if(is_empty_linkqueue(q)){ //判断是否为空
printf("队列已经空\n");
return false;
}
//队列非空出队
t = q->front;
q->front = q->front->next;
*D = q->front->data;
free(t);
return true;
}
void show_linkqueue(link_pqueue q)
{
linkqueue_pnode p;
for(p=q->front->next; p!=NULL; p= p->next)
{
printf("%d ",p->data);
}
puts("");
}
反思:
链式队列还是在理解队列的特性上用链表的插入、删除来实现。