关于链式队列,它主要由以下几个特点:
1、链式队列指针域有两个指针 front 和 rear 分别指向链表的头结点和最后一个节点
2、链式队列只能一端进,一端出
3、链式队列内部成员数量没有限制
以下为相关函数的具体实现方式:
1、链表队列函数整体如下:
#ifndef _LINKQ_H
#define _LINKQ_H
typedef int Data_t;
typedef struct node//用于存放链表元素成员信息和连接链表
{
Data_t data;
struct node *next;
}Node;
typedef struct linkqueue//由于指向队列的头部和尾部
{
struct node *front;//链式队列的对头节点
struct node *rear;//链式队列的队尾结点
}Linkq;
//创建队列
Linkq *create_linkq();
//判空
int linkq_is_empty(Linkq *q);
//入队
void enlinkq(Linkq *q, Data_t data);
//出队
void delinkq(Linkq *q, Data_t *data);
#endif
2、链表队列创建函数:
Linkq *create_linkq()
{
Node *head = (Node *)malloc(sizeof(Node));
if(NULL == head){
printf("Node malloc is failed\n");
return NULL;
}
head->data = -1;
head->next = NULL;
Linkq *Q = (Linkq *)malloc(sizeof(Linkq));
if(NULL == head){
printf("Link Node malloc is failed\n");
return NULL;
}
Q->front = head;
Q->rear = head;
return Q;
}
3、对链表进行判空操作,便于后续出栈等操作的进行
int linkq_is_empty(Linkq *Q)
{
if(Q->front == Q->rear){
return 1;
}
return 0;
}
4、链表队列的入栈操作
void enlinkq(Linkq *Q, Data_t data)
{
Node *new = (Node *)malloc(sizeof(Node));
if(NULL == new){
printf("new malloc is failed\n");
return;
}
new->next = Q->rear->next;
Q->rear->next = new;
new->data = data;
printf("%d ", Q->front->next->data);
}
5、链表队列的出栈操作
//出栈
void delinkq(Linkq *Q, Data_t *data)
{
linkq_is_empty(Q);
*data = Q->front->next->data;
Node *del = Q->front->next;
Q->front->next = Q->front->next->next;
free(del);
del = NULL;
}