C语言实现队列数据布局:思绪与代码详解

[复制链接]
发表于 2025-10-16 11:56:35 | 显示全部楼层 |阅读模式
目次

一、弁言 
二、团体思绪 
三、代码模块分析 
(一)头文件包罗与宏界说 
(二)数据范例界说 
(三)队列利用函数 
1. 队列初始化 
2. 队列烧毁 
3. 入队利用 
4. 出队利用 
5. 获取队头元素 
6. 获取队尾元素 
7. 获取队列巨细 
8. 判定队列是否为空 
(四)主函数测试 
四、总结 

作者主页:共享家9527-CSDN博客

一、弁言
 


   
队列是一种紧张的数据布局,依照先辈先出(FIFO)的原则。在C语言中,我们可以通过自界说布局体和一系列利用函数来实现一个队列。本文将详细先容怎样实现一个简单的队列,并对代码的各个部门举行深入分析。
 
  
二、团体思绪
 



队列的实现紧张涉及队列节点的界说、队列布局体的界说以及对队列的各种利用,如初始化、入队、出队、获取队头和队尾元素、判定队列是否为空和获取队列巨细等。我们将这些利用模块化,每个函数负责一个特定的功能,使得代码布局清楚,易于维护和扩展。
 

三、代码模块分析
 



(一)头文件包罗与宏界说
 


  1. c
  2.   
  3. #define _CRT_SECURE_NO_WARNINGS
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<stdbool.h>
  7. #include<assert.h>
  8.  
复制代码

 
 _CRT_SECURE_NO_WARNINGS 宏界说用于关闭Visual Studio中一些函数的安全告诫。反面依次包罗了标准输入输出库、标准库、布尔范例库和断言库,为后续代码提供须要的功能支持。
 

(二)数据范例界说
 


  1. c
  2.   
  3. typedef int QDatatype;
  4. typedef struct QueueNode
  5. {
  6.     struct QueueNode* next;
  7.     QDatatype data;
  8. }QNode;
  9. typedef struct Queue
  10. {
  11.     QNode* head;
  12.     QNode* tail;
  13.     int size;
  14. }Queue;
  15.  
复制代码

 
-  QDatatype  界说为  int  范例,表现队列中存储的数据范例,这里是整型,也可以根据现实需求改为其他范例。
 
-  QueueNode  布局体界说了队列节点,包罗一个指向下一个节点的指针  next  和存储数据的  data  成员。
 
-  Queue  布局体表现整个队列,包罗指向队头的指针  head 、指向队尾的指针  tail  和记载队列元素个数的  size 。
 

(三)队列利用函数
 



1. 队列初始化
 


  1. c
  2.   
  3. void QueueInit(Queue* pq)
  4. {
  5.     pq->head = pq->tail = NULL;
  6.     pq->size = 0;
  7. }
  8.  
复制代码

 
 QueueInit  函数用于初始化一个队列,将队头和队尾指针设为  NULL ,队列巨细设为  0 。
 

2. 队列烧毁
 


  1. c
  2.   
  3. void QueueDestroy(Queue* pq)
  4. {
  5.     assert(pq);
  6.     Queue* cur = pq->head;
  7.     while (cur)
  8.     {
  9.         pq->head = pq->head->next;
  10.         free(cur);
  11.         cur = pq->head;
  12.     }
  13.     pq->head = pq->tail = NULL;
  14.     pq->size = 0;
  15. }
  16.  
复制代码

 
 QueueDestroy  函数用于开释队列占用的内存空间。通过遍历队列,逐个开释每个节点,末了将队头、队尾指针设为  NULL ,队列巨细设为  0 。
 

3. 入队利用
 


  1. c
  2.   
  3. void QueuePush(Queue* pq, QDatatype x)
  4. {
  5.     QNode* newnode = (QNode*)malloc(sizeof(QNode));
  6.     if (newnode == NULL)
  7.     {
  8.         perror("malloc fail");
  9.         return;
  10.     }
  11.     newnode->data = x;
  12.     newnode->next = NULL;
  13.     if (pq->head == NULL)
  14.     {
  15.         pq->head = pq->tail = newnode;
  16.     }
  17.     else
  18.     {
  19.         pq->tail->next = newnode;
  20.         pq->tail = newnode;
  21.     }
  22.     pq->size++;
  23. }
  24.  
复制代码

 
 QueuePush  函数用于将一个元素入队。起首分配一个新节点的内存空间,若分配失败则打印错误信息并返回。然后将新节点的数据设为传入的元素值, next  指针设为  NULL 。如果队列为空,则新节点既是队头也是队尾;否则将新节点毗连到队尾,并更新队尾指针。末了队列巨细加  1 。
 

4. 出队利用
 


  1. c
  2.   
  3. void QueuePop(Queue* pq)
  4. {
  5.     assert(pq);
  6.     assert(pq->head != NULL);
  7.     if (pq->head->next == NULL)
  8.     {
  9.         free(pq->head);
  10.         pq->head = pq->tail = NULL;
  11.     }
  12.     else
  13.     {
  14.         QNode* next = pq->head->next;
  15.         free(pq->head);
  16.         pq->head = next;
  17.     }
  18.     pq->size--;
  19. }
  20.  
复制代码

 
 QueuePop  函数用于将队头元素出队。起首举行断言,确保队列指针有用且队列不为空如果队列只有一个元素,开释队头节点并将队头、队尾指针设为  NULL ;否则生存队头节点的下一个节点,开释队头节点,然后将队头指针指向下一个节点。末了队列巨细减  1 。
 

5. 获取队头元素
 


  1. c
  2.   
  3. QDatatype QueueFront(Queue* pq)
  4. {
  5.     assert(pq);
  6.     assert(!QueueEmpty(pq));
  7.     return pq->head->data;
  8. }
复制代码

 
 
 QueueFront  函数用于获取队头元素的值。先举行断言确保队列有用且不为空,然后返回队头节点的数据。
 

6. 获取队尾元素
 


  1. c
  2.   
  3. QDatatype QueueBack(Queue* pq)
  4. {
  5.     assert(pq);
  6.     assert(!QueueEmpty(pq));
  7.     return pq->tail->data;
  8. }
  9.  
复制代码

 
 QueueBack  函数用于获取队尾元素的值。同样先举行断言确保队列有用且不为空,然后返回队尾节点的数据。
 

7. 获取队列巨细
 


  1. c
  2.   
  3. int QueueSize(Queue* pq)
  4. {
  5.     return pq->size;
  6. }
  7.  
  8.  
  9.  QueueSize  函数直接返回队列结构体中记录的元素个数。
  10.  
复制代码

8. 判定队列是否为空
 


  1. c
  2.   
  3. bool QueueEmpty(Queue* pq)
  4. {
  5.     assert(pq);
  6.     return pq->head == NULL;
  7. }
  8.  
复制代码

 
 QueueEmpty  函数通过判定队头指针是否为  NULL  来确定队列是否为空,为空则返回  true ,否则返回  false 。
 

(四)主函数测试
 


  1. c
  2.   
  3. int main()
  4. {
  5.     Queue Q;
  6.     QueueInit(&Q);
  7.     QueuePush(&Q, 1);
  8.     QueuePush(&Q, 2);
  9.     QueuePush(&Q, 3);
  10.     QueuePush(&Q, 4);
  11.     QueuePush(&Q, 5);
  12.     while (!QueueEmpty(&Q))
  13.     {
  14.         printf("%d ", QueueFront(&Q));
  15.         QueuePop(&Q);
  16.     }
  17.     printf("\n");
  18.     QueueDestroy(&Q);
  19.     return 0;
  20. }
  21.  
复制代码

 
在  main  函数中,我们对实现的队列举行了测试。起首初始化一个队列,然后依次将  1  到  5  这五个元素入队,接着通过循环不停获取队头元素并打印,同时将其出队,直到队列为空。末了烧毁队列,开释内存。
 

四、总结
 


   
通过以上模块化的代码实现,我们完成了一个根本的队列数据布局。每个函数都有明确的功能,使得代码逻辑清楚,易于明确和维护。在现实应用中,可以根据详细需求对队列举行进一步的扩展和优化,如添加更多的利用函数大概改变数据存储范例等。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表