• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

C语言---队列(---数据结构

武飞扬头像
exztmex
帮助1

学新通

队列所需要的头文件

学新通

先给类型重命名 意义前几篇有讲

学新通

队列要用到的两个结构体

第一个结构体里面有 1.存储数据的 a 2.指向下一个节点的指针

学新通

 重命名为Queue(这里的名字需要记一下,等会需要分辨两个结构体,结构体两个的功能是不一样的)

第二个结构体里面有 1.指向头的头指针 2.指向尾的尾指针

学新通

重命名尾Qnene

 队列实现的函数功能有: 1.初始化队列 2.队尾入数据 3.队头出数据 4.获取队列的有效元素个数 5.判断队列是否为空 6.获取队列头部数据 7.获取队列尾部数据 8.销毁队列

1.初始化队列

初始化我们直接把头和尾置尾空(第一个结构体是包含着第二个结构体的,所以初始化第二个结构体就可以了)

学新通

2.队尾入数据

因为是要入数据,所以我们要先申请一个空间(并且把数据放入到新空间中)

入数据是有两种情况

1.第一次入,队列是没有数据的,所以我们要先进行单独处理

直接在头和尾的位置入数据(因为第一次没数据,头和尾是重叠在一起的

2.已经入过了,队列中已经存在其他的数据,所以我们直接在队尾后面入数据

学新通

 3.队头出数据

1.若这个队列中只剩下一个数据了,那么我们可以直接删除数据后,并且释放掉整个队列

2.若队列中不止一个数据,那么先存储一个队头的下一个数据,再释放掉对头,再让对头的指针指向存储的数据

学新通

 4.获取队列中有效的数据个数

 这把我们使用遍历的方法

1.先定义一个size,用来计算队列中的个数

2.先从队头开始,每次都 size,直接空。

3.最后返回size的个数

学新通

 5.判断队列是否为空

bool类型来返回

我们判断队头是否为空就可以了

学新通

 6.获取队头的数据

返回队头用来存储数据的a

学新通

7.获取队尾的数据 

返回队尾用来存储数据的a

学新通

 8.销毁队列

先创建一个存放队头的(命名为tist),再来一个存放对头的下一个数据(命名为cur)。

先释放tist,再把cur给tist。就此循环

最后把头和尾的指针置空

学新通

9.队列的打印

 这里不需要用到单独的函数实现,置需要把前几个实现的函数结合起来用

1.先判断队列是否为空

2.再打印返回的头元素

3.再掉头元素

学新通

 这样队列的全部功能就实现了!

接下来是源码,需要自取

  1.  
    #include <stdio.h>
  2.  
    #include <stdlib.h>
  3.  
    #include <stdbool.h>
  4.  
    #include <assert.h>
  5.  
     
  6.  
    typedef int STDataType;
  7.  
     
  8.  
    typedef struct Quene
  9.  
    {
  10.  
    struct Quene* next;
  11.  
    STDataType a;
  12.  
    }Queue;
  13.  
     
  14.  
    typedef struct Qnene
  15.  
    {
  16.  
    Queue* head;
  17.  
    Queue* tail;
  18.  
    }Qnene;
  19.  
     
  20.  
    //初始化
  21.  
    void QueueInit(Qnene* q)
  22.  
    {
  23.  
    assert(q);
  24.  
     
  25.  
    q->head = q->tail = NULL;
  26.  
    }
  27.  
     
  28.  
    void QueuePush(Qnene* q, STDataType data)
  29.  
    {
  30.  
    assert(q);
  31.  
     
  32.  
    Queue* newnode = (Queue*)malloc(sizeof(Queue));
  33.  
    newnode->a = data;
  34.  
    newnode->next = NULL;
  35.  
     
  36.  
    //如果队列没有数据要做单独处理
  37.  
    if (q->tail == NULL)
  38.  
    {
  39.  
    q->head = q->tail = newnode;
  40.  
    }
  41.  
    //如果队列已经有数据了
  42.  
    else
  43.  
    {
  44.  
    q->tail->next = newnode;
  45.  
    q->tail = newnode;
  46.  
    }
  47.  
    }
  48.  
     
  49.  
    void QueuePop(Qnene* q)
  50.  
    {
  51.  
    assert(q);
  52.  
     
  53.  
     
  54.  
    //如果队列中只有一个数据,那么删除这个数据就是空了
  55.  
    if (q->head->next == NULL)
  56.  
    {
  57.  
    free(q->head);
  58.  
    q->head = q->tail = NULL;
  59.  
    }
  60.  
    else
  61.  
    {
  62.  
    Queue* tist = q->head->next;
  63.  
    free(q->head);
  64.  
    q->head = tist;
  65.  
    }
  66.  
     
  67.  
    }
  68.  
     
  69.  
    STDataType QueueFront(Qnene* q)
  70.  
    {
  71.  
    assert(q);
  72.  
     
  73.  
    return q->head->a;
  74.  
    }
  75.  
     
  76.  
    STDataType QueueBack(Qnene* q)
  77.  
    {
  78.  
    assert(q);
  79.  
     
  80.  
    return q->tail->a;
  81.  
    }
  82.  
     
  83.  
    int QueueSize(Qnene* q)
  84.  
    {
  85.  
    assert(q);
  86.  
     
  87.  
    int size = 0;
  88.  
     
  89.  
    Queue* tist = q->head;
  90.  
    while (tist)
  91.  
    {
  92.  
    size;
  93.  
    tist = tist->next;
  94.  
    }
  95.  
    return size;
  96.  
    }
  97.  
     
  98.  
    bool QueueEmpty(Qnene* q)
  99.  
    {
  100.  
    assert(q);
  101.  
     
  102.  
    return q->head == NULL;
  103.  
    }
  104.  
     
  105.  
    void QueueDestroy(Qnene* q)
  106.  
    {
  107.  
    assert(q);
  108.  
     
  109.  
    Queue* tist = q->head;
  110.  
    while (tist)
  111.  
    {
  112.  
    Queue* cur = tist->next;
  113.  
    free(tist);
  114.  
    tist = cur;
  115.  
    }
  116.  
    q->head = q->tail = NULL;
  117.  
    }
  118.  
     
  119.  
    void Intenode()
  120.  
    {
  121.  
    Qnene st;
  122.  
    初始化队列
  123.  
    QueueInit(&st);
  124.  
    队尾入队列
  125.  
    QueuePush(&st, 1);
  126.  
    QueuePush(&st, 2);
  127.  
    QueuePush(&st, 3);
  128.  
    QueuePush(&st, 4);
  129.  
     
  130.  
    获取队列队尾元素
  131.  
    int size= QueueSize(&st);
  132.  
    printf("队列中有%d个数据\n", size);
  133.  
     
  134.  
    检测队列是否为空
  135.  
    while (!QueueEmpty(&st))
  136.  
    {
  137.  
    获取队列头部元素
  138.  
    printf("%d ", QueueFront(&st));
  139.  
    队头出队列
  140.  
    QueuePop(&st);
  141.  
    }
  142.  
     
  143.  
    //获取队列尾部元素
  144.  
    //QueueBack(&st);
  145.  
     
  146.  
    销毁队列
  147.  
    QueueDestroy(&st);
  148.  
    }

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfakfi
系列文章
更多 icon
同类精品
更多 icon
继续加载