hello,我是~小鹿,对你有帮助可以收藏随时找到这里哦
【C语言版数据结构】队列接口函数代码
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的图书线性表,队列具有先进先出FIFO
入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头
队列的基本结构
typedef int QDataType;//类型重命名,方便更改数据类型
typedef struct QueueNode//队列中的结点
{
QDataType data;//结点中存的数据
struct QueueNode* next;//结点中存的地址,指向下一个结点的位置
}QueueNode;
typedef struct Queue //采用这种方法更简便
{
QueueNode* head;//指向队列头结点
QueueNode* tail;//指向队列尾结点
}Queue;
初始化 QueueInit
void QueueInit(Queue* pq)//初始化
{
assert(pq);
pq->head = NULL;
pq->tail = NULL;
}
销毁 QueueDestroy
void QueueDestroy(Queue* pq)//销毁
{
assert(pq);
QueueNode* cur = pq->head;
while (cur != NULL)
{
QueueNode* next = cur->next;//删除数据前先保存下一个结点的地址
free(cur);
cur = next;
}
pq->head = pq->tail = NULL;//删完后将head,tail置空
}
队尾入队列 QueuePush (附主函数使用)
void QueuePush(Queue* pq, QDataType x)//插入数据
{
assert(pq);
//开辟新结点
QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
newnode->data = x;
newnode->next = NULL;
if (pq->head == NULL)
{
pq->head = pq->tail = newnode;
}
else
{
pq->tail->next = newnode;
pq->tail = newnode;//别忘了将尾结点指针放在新插入的数据上
}
}
int main()
{
Queue q;//定义出一个队列
QueueInit(&q);//初始化
QueuePush(&q, 1);//插入数据
QueuePush(&q, 2);
QueuePush(&q, 3);
QueuePush(&q, 4);
while (!QueueEmpty(&q))//打印 //判断队列不为空 具体看QueueEmpty接口函数
{
QDataType front = QueueFront(&q);//取队头数据
printf("%d ", front);
QueuePop(&q);//想取下一个就需要先pop(删除)掉头结点(先进先出)
}
printf("\n");
}
运行结果:
队头出队列 QueuePop
void QueuePop(Queue* pq)//队头出数据 删除数据
{
assert(pq);
//温柔的方式
//if (pq->head != NULL)
//return;
//粗暴直接
assert(!QueueEmpty(pq));//判断队列不为空
QueueNode* next = pq->head->next;//删除前保存下一个结点的指针
free(pq->head);
pq->head = next;//进行多次删除后 删完后tail变成野指针 所以需要tail置空
if (pq->head == NULL)
{
pq->tail = NULL;
}
}
获取队列头部元素 QueueFront
QDataType QueueFront(Queue* pq)//取队头的数据
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->head->data;
}
获取队列队尾元素 QueueBack
QDataType QueueBack(Queue* pq)//取队尾的数据
{
assert(pq);
assert(!QueueEmpty(pq));
return pq->tail->data;
}
获取队列中有效元素个数 QueueSize
int QueueSize(Queue* pq)//计算队列中还有多少元素
{
assert(pq);
int n = 0;
QueueNode* cur = pq->head;
while (cur)
{
++n;
cur = cur->next;
}
return n;
}
检测队列是否为空,如果为空返回非零结果,如果非空返回0 QueueEmpty
//注意bool类型 头文件为 #include <stdbool.h>
bool QueueEmpty(Queue* pq)//判断队列是否为空
{
assert(pq);
return pq->head == NULL;
}