资讯动态

数据结构《队列》

发布时间:2026/8/13 17:09:29 来源:尧图企业网站定制
队列也是一种特殊的线性表它遵循在一端插入数据另一端删除数据遵循先进先出的原则由于特殊的读写方式因此用节点比用数组更容易操作。1.创建队列节点结构体typedef int QueueTyp; typedef struct QueueNode { QueueTyp data; struct QueueNode* next; }QueueNode;2.创建队列结构体typedef struct Queue { struct QueueNode* phead; struct QueueNode* ptail; int size; }Queue;“phead”用于记录队列头节点“ptail”用于记录队列尾节点“size”记录队列的元素数量。3.初始化队列// 初始化队列 void QueueInit(Queue* q) { assert(q); q-phead NULL; q-ptail NULL; q-size 0; }4.队尾入队列// 队尾入队列 void QueuePush(Queue* q, QueueTyp data) { assert(q);//断言 QueueNode* newnode (QueueNode*)malloc(sizeof(QueueNode));//创建节点 if (newnode NULL)//创建失败返回 { perror(malloc fail!); return; } newnode-data data;//创建成功继续 newnode-next NULL; if (q-ptail NULL)//队列没有元素 { q-phead newnode; q-ptail newnode; } else//队列有元素 { q-ptail-next newnode; q-ptail newnode; } q-size;//有效元素加一 }在这里入队列分为两种情况一是队列中有数据二是队列中没有数据为什么要这样分呢在初始化的时候“phead ”和“ptail”都指向“NULL”当第一次入队列的时候就不能对“ptail”进行解引用因此这一步的目的是为了防止对空指针的解引用。5.队头出队列// 队头出队列 void QueuePop(Queue* q) { assert(q);//断言 assert(q-phead); QueueNode* pnode q-phead-next;//储存头结点的下一个节点 free(q-phead);//释放头节点 q-phead pnode;//更新头结点 q-size--;//有效元素减一 if (q-phead NULL) { q-ptail NULL; } }这里主要是对头节点进行释放并更新新的头节点。还有需要注意的是因为每次都是队头出队列当“phead ”指向空指针的时候就代表队列中已经没有数据因此一定要更新“ptail ”为空指针不然会造成“ptail ”对已经释放了的空间的越界访问。、6.获取队列头部元素// 获取队列头部元素 QueueTyp QueueFront(Queue* q) { assert(q); assert(q-phead); return q-phead-data; }7.获取队列尾部元素// 获取队列队尾元素 QueueTyp QueueBack(Queue* q) { assert(q); assert(q-ptail); return q-ptail-data; }8.获取队列中有效元素的个数// 获取队列中有效元素个数 int QueueSize(Queue* q) { assert(q); return q-size; }9.队列的判空// 检测队列是否为空如果为空返回非零结果如果非空返回0 int QueueEmpty(Queue* q) { assert(q); return q-size 0; }10.队列的销毁// 销毁队列 void QueueDestroy(Queue* q) { assert(q); if (q-size 0) { return; } QueueNode* node q-phead; while (node) { QueueNode* flag node; node node-next; free(flag); } q-phead NULL; q-ptail NULL; q-size 0; }队列的销毁即链表的销毁11.测试#define _CRT_SECURE_NO_WARNINGS 1 #include Queue.h void text() { Queue myqueue; QueueInit(myqueue); for (int i 0; i 100; i) { QueuePush(myqueue,i); } while (!QueueEmpty(myqueue)) { printf(%d , QueueFront(myqueue)); QueuePop(myqueue); } QueueDestroy(myqueue); } int main() { text(); return 0; }测试结果符合队列的读写方式

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价