不带头单链表实现
Queue.h
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
//任意类型
typedef int QDataType;
//队列底层是单向带头或者不带头链表
typedef struct QListNode{
QDataType val;
struct QListNode* next;
}QNode;//队列的节点
//单链表尾插耗时间,记录链表尾部,头部信息,操作需要直接调用修改
typedef struct {
QNode* phead;
QNode* ptail;
int size;//记录size可以知道队列中有多少元素
}queue;
//初始化,销毁,插入,删除,查找头部尾部数据,查找大小,判断是否为空
//初始化,队列信息初始化就行,没头节点就不用初始化节点了//单链表,带头循环双向链表,栈,队列
//规范命名,数据结构名加操作,驼峰命名法,插入:push,删除:pop
void QueueInit(queue* q);
void QueueDestroy(queue* q);//有记录信息的,穿含头节点的信息就行了
void QueuePush(queue* q, QDataType x);//尾部插入元素
void QueuePop(queue* q);//头部删除元素
QDataType QueueFront(queue* q);//获取头部数据
QDataType QueueBack(queue* q);//获取尾部数据
int QueueSize(queue* q);
int QueueEmpty(queue* q);
Queue.c
#include"queue.h"
void QueueInit(queue* q)//传的是含头节点地址的结构体地址,可直接修改内部元素如phead,ptail,size
{
q->phead = NULL;
q->ptail = NULL;
q->size = 0;
}
void QueuePush(queue* q, QDataType x)//尾部插入元素
{
assert(q);//结构体防止未初始化
QNode*newnode = (QNode*)malloc(sizeof(QNode));
newnode->val = x;
newnode->next = NULL;
if (q->phead == NULL)//数据结构为空
{
q->phead = q->ptail = newnode;
}
else
{
q->ptail->next = newnode;
q->ptail = q->ptail->next;链接起来尾指针要往后走
}
q->size++;
}
void QueuePop(queue* q)//头部删除元素
{
assert(q);
assert(q->phead);
QNode* midpcur = q->phead;
q->phead = q->phead->next;
if (q->phead == NULL)//只有一个元素防止尾指针成为野指针
q->ptail = NULL;
q->size--;
free(midpcur);
}
QDataType QueueFront(queue* q)//获取头部数据
{
assert(q);
assert(q->phead);
return q->phead->val;
}
QDataType QueueBack(queue* q)//获取尾部数据
{
assert(q);
assert(q->phead);
return q->ptail->val;
}
int QueueSize(queue* q)
{
assert(q);
return q->size;
}
int QueueEmpty(queue* q)
{
assert(q);
return q->phead == NULL;
}
void QueueDestroy(queue* q)//有记录信息的,穿含头节点的信息就行了
{
assert(q);
QNode* pcur = q->phead;
while (pcur)//循环删除链表
{
QNode* next = pcur->next;
free(pcur);
pcur = next;
}
q->phead = 0;
q->ptail = 0;
q->size = 0;
}
test.c
#include"queue.h"
void test()
{
queue q;
QueueInit(&q);
QueuePush(&q, 4);
QueuePush(&q, 5);
QueuePush(&q, 6);
QueuePush(&q, 7);
printf("尾部数据为 %d \n",QueueBack(&q));
while (!QueueEmpty(&q))
{
printf("%d <- ", QueueFront(&q));
QueuePop(&q);
}
printf("%s\n",QueueSize(&q) == 0 ? "NULL" : "error");
QueueDestroy(&q);
}
int main()
{
test();
return 0;
}