当前位置:   article > 正文

C语言-队列_c语言队列

c语言队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

队列的特性:

  • 先进先出、后进后出。

  • 只允许 从一端 添加元素,从 另一端 删除元素。

  • 队头 出元素,队尾 进元素。

队列的顺序存储

顺序队的基本操作

顺序队的结构体定义

  1. #define MAX 1000
  2. typedef struct Queue{
  3. int data[MAX]; //顺序存储 数组模拟的队列
  4. int size; //队列的大小(队列中元素的个数)
  5. }Queue, *SeqQueue;

顺序队-初始化队

数组头做队头,数组尾做队尾。

  1. SeqQueue init(){
  2. //申请队列空间,即数组空间
  3. SeqQueue p = (Queue *)malloc(sizeof(Queue));
  4.     //判断队列空间申请失败
  5. if(!p){
  6. return NULL;
  7. }
  8. //初始化队列大小
  9. p->size = 0;
  10.     //初始化队列值为0
  11. for(int i=0; i<MAX ;i++){
  12. p->data[i] = 0;
  13. }
  14.     //返回队列指针
  15. reutrn p;
  16. }

顺序队-入队

  1. void push(SeqQueue p){
  2.     //判断队列不存在
  3. if(!p){
  4. return;
  5. }
  6.     //判断队列元素是否为满,拿队列当前的长度去跟数组的最大值作比较
  7. if(p->size == MAX){
  8. printf("队列元素已满!\n");
  9. return;
  10. }
  11.     int value;
  12.     printf("请输入待入队元素值:");
  13.     scanf("%d",&value);
  14. //插入元素(进队)
  15. p->data[p->size] = value;
  16. //元素入队,队列长度增加
  17. p->size ++;
  18. }

顺序队 - 出队

  1. void push(SeqQueue p){
  2.     //判断队列不存在
  3. if(!p){
  4. return;
  5. }
  6.     //判断队列元素是否为空,拿队列当前的长度与0比较
  7. if(p->size == 0){
  8. printf("队列元素已空!\n");
  9. return;
  10. }
  11. //出队 删除数组首元素
  12. for(int i=0; i< p->size -1 ;i++){
  13. p->data[i] = p->data[i+1];
  14. }
  15. //元素出队,队列长度减少
  16. p->size --;
  17. }


队列的链式存储

链队的基本操作

链队的结构体定义

  1. //结点结构体
  2. struct Node{
  3. int data; //数据域
  4. struct Node* next;     //指针域
  5. };
  6. //队列的结构体
  7. typedef struct LQueue{
  8. struct Node header;     //头结点
  9. int size;              //队列大小
  10. struct Node* pTail;     //尾结点指针
  11. }LQueue, *LinkQueue;

链队-初始化队

  1. LinkQueue init_LinkQueue(){
  2. //创建队列结构体
  3. struct LQueue* myQueue = (struct LQueue*)malloc(sizeof(struct LQueue));
  4.     if (!myQueue){
  5. return NULL;
  6. }
  7. //初始化队列长度
  8. myQueue->size = 0;
  9.     //初始化队列头指针的指针域
  10. myQueue->header.next = NULL;
  11. myQueue->pTail = &myQueue->header;
  12. return myQueue;
  13. }

链队-入队

  1. void push_LinkQueue(LinkQueue queue, int data){
  2. //本质 尾插
  3. if (!queue){
  4. return;
  5. }
  6. //创建新结点
  7. struct Node * newNode = (struct Node *)malloc(sizeof(struct Node));
  8. if (!newNode){
  9. return;
  10. }
  11. newNode->data = data;
  12. //更新指针的指向
  13. queue->pTail->next = newNode;
  14. newNode->next = NULL;
  15. queue->pTail = newNode;
  16. //更新队列大小
  17. queue->size++;
  18. }

链队-出队

  1. void pop_LinkQueue(LinkQueue queue){
  2. //本质头删
  3. if (!queue){
  4. return;
  5. }
  6. if (queue->size == 0){
  7. printf("空队,无法出队\n");
  8. return;
  9. }
  10. //记录第一个结点
  11. struct Node* pFirst = queue->header.next;
  12. //更新指针的指向
  13. queue->header.next = pFirst->next;
  14. //判断结点存在并释放结点
  15. if (pFirst){
  16. free(pFirst);
  17. }
  18. //队列中只有一个结点的时候,再出队会影响尾指针,需要特判
  19. if (queue->size == 1){
  20. queue->pTail = &queue->header;
  21. }
  22. //队列大小更新
  23. queue->size--;
  24. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/644660
推荐阅读
相关标签
  

闽ICP备14008679号