队列链式存储实现
链式队列 队列头 + 带头结点的链表
数据类型
typedef int DataType;
//结点类型
struct node
{
DataType data;
struct node *next;
};
//队列头
typedef struct
{
//front指向链表头
struct node *front;
//rear指向链表尾
struct node *rear;
}LinkQueue;
常用的操作
1.创建空的链式队列
LinkQueue *create_empty_linkqueue()
{
1.为链表头在堆区分配空间,head保存首地址
2.为队列头在堆区分配空间,q保存首地址
3.q->front = q->rear = head;
4.返回队列头首地址q
}
2.判空 q->front == q->rear
int is_empty_linkqueue(LinkQueue *q)
{
}
3.入队,链表尾插法,更新rear
int enter_linkqueue(LinkQueue *q,DataType data)
{
}
4.出队,删除头结点,使下一结点成为新的头结点,并返回新头结点数据
DataType delete_linkqueue(LinkQueue *q)
{
}
#ifndef __HEAD__H
#define __HEAD__H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int DataType;
//结点类型
struct node
{
DataType data;
struct node *next;
};
//队列头
typedef struct
{
//front指向链表头
struct node *front;
//rear指向链表尾
struct node *rear;
}LinkQueue;
extern LinkQueue *creat_linkqueue();
extern int is_empty_linkqueue(LinkQueue *q);
extern int enter_linkqueue(LinkQueue *q,DataType data);
extern DataType delete_linkqueue(LinkQueue *q);
#endif
#include "head.h"
//新建一个队列头
LinkQueue *creat_linkqueue()
{
//先分配一个头结点,head保存其地址
//在为队列头在堆区分配空间,q保存其首地址
struct node *head = NULL;
LinkQueue *q = NULL;
//创建空链表,链表队列头结点
head = (struct node *)malloc(sizeof(struct node));
memset(head,0,sizeof(struct node));//清空后指针域为NULL。表示空链表
//队列头,指向链表头跟链表尾
q = (LinkQueue *)malloc(sizeof(LinkQueue));
q->front = head;
q->rear = head;
return q;
}
///链表判空
int is_empty_linkqueue(LinkQueue *q)
{
return q->front == q->rear;
}
//尾插法插入数据
int enter_linkqueue(LinkQueue *q,DataType data)
{
struct node *temp = NULL;
temp = (struct node *)malloc(sizeof(struct node));
temp->data = data;
temp->next = q->rear->next;
q->rear->next = temp;
//更新rear
q->rear = temp;
return 0;
}
//删头法对头数据出队
DataType delete_linkqueue(LinkQueue *q)
{
struct node *temp = NULL;
//保存原头结点首地址
temp = q->front;
//更新front
q->front = q->front->next;
free(temp);
temp = NULL;
return q->front->data;
}
#include "head.h"
int main()
{
int i = 0;
LinkQueue *q = NULL;
q = creat_linkqueue();
for(i = 0;i < 10;i++)
{
enter_linkqueue(q,i);
}
for(i = 9;i >= 0;i--)
{
printf("%-3d",delete_linkqueue(q));
}
putchar('\n');
return 0;
}