一、链式队列
含义:队列的链式存储实现叫做链式队列。
本质:队列头 + 带头结点的链表
二、数据类型的设计
[1]链表结点数据类型的设计
typedef int DataType;
typdef struct node
{
DataType data; //链表结点存储数据
struct node *next; //保存下一个结点的地址
}LinkNode;
[2]队列头的设计
typedef struct{
LinkNode *front;//保存头结点的地址
LinkNode *rear; //保存尾结点的地址
}LinkQueue;
三、链式队列常用操作
<1>为头结点和队列头在堆区分开空间,q->front = q->rear = head;
LinkQueue *create_empty_linkqueue()
{
//新创建一个队头,并分配空间。用q保存首地址
//在创建一个链表头,头结点的指针域置为NULL
//队头的q->front和q->front都保存头结点的首地址
//返回队列头首地址
}
<2>判断队列是否为空 q->front == q->rear
int is_emtpy_linkqueue(LinkQueue *q)
{
return q->front == q->rear;
}
<3>入队,类似于链表的尾插法,每次在尾结点后插入数据
int enter_linkqueue(LinkQueue *q,DataType data)
{
//创建一个新的链表节点,用temp保存,并分配空间
//类似于单链表的尾插法,每次创建都是尾结点,
//把temp指针域置为NULL,利用尾结点q->rear插入temp
//更新rear的值
return 0;
}
<4>出队,删头发出队,思路:删除前一个结点(从头结点开始),出后一个
结点的数据。删除完毕。最后剩的结点,就是头结点
DataType delete_linkqueue(LinkQueue *q)
{
linknode *temp = NULL;
//思路:删除原头结点,出后一个结点的数据。
// 使后一个结点成为新的头结点
//1.用temp保存原来头结点的首地址
//2.更新q->front,让他指向后一个数据
//3.释放temp的空间
//4.返回新的头结点的数据
}
int main()
{
LinkQueue *q = NULL;
int i = 0;
q = create_empty_linkqueue();
for(i = 0;i < 10;i++)
{
enter_linkqueue(q,i);
}
while(!is_empty_linkqueue(q))
{
printf("%-3d",delete_linkqueue(q));
}
putchar('\n');
return 0;
}
含义:队列的链式存储实现叫做链式队列。
本质:队列头 + 带头结点的链表
二、数据类型的设计
[1]链表结点数据类型的设计
typedef int DataType;
typdef struct node
{
DataType data; //链表结点存储数据
struct node *next; //保存下一个结点的地址
}LinkNode;
[2]队列头的设计
typedef struct{
LinkNode *front;//保存头结点的地址
LinkNode *rear; //保存尾结点的地址
}LinkQueue;
三、链式队列常用操作
<1>为头结点和队列头在堆区分开空间,q->front = q->rear = head;
LinkQueue *create_empty_linkqueue()
{
//新创建一个队头,并分配空间。用q保存首地址
//在创建一个链表头,头结点的指针域置为NULL
//队头的q->front和q->front都保存头结点的首地址
//返回队列头首地址
}
<2>判断队列是否为空 q->front == q->rear
int is_emtpy_linkqueue(LinkQueue *q)
{
return q->front == q->rear;
}
<3>入队,类似于链表的尾插法,每次在尾结点后插入数据
int enter_linkqueue(LinkQueue *q,DataType data)
{
//创建一个新的链表节点,用temp保存,并分配空间
//类似于单链表的尾插法,每次创建都是尾结点,
//把temp指针域置为NULL,利用尾结点q->rear插入temp
//更新rear的值
return 0;
}
<4>出队,删头发出队,思路:删除前一个结点(从头结点开始),出后一个
结点的数据。删除完毕。最后剩的结点,就是头结点
DataType delete_linkqueue(LinkQueue *q)
{
linknode *temp = NULL;
//思路:删除原头结点,出后一个结点的数据。
// 使后一个结点成为新的头结点
//1.用temp保存原来头结点的首地址
//2.更新q->front,让他指向后一个数据
//3.释放temp的空间
//4.返回新的头结点的数据
}
int main()
{
LinkQueue *q = NULL;
int i = 0;
q = create_empty_linkqueue();
for(i = 0;i < 10;i++)
{
enter_linkqueue(q,i);
}
while(!is_empty_linkqueue(q))
{
printf("%-3d",delete_linkqueue(q));
}
putchar('\n');
return 0;
}