首页 > 其他分享 >学习分享-队列-1(数据结构C语言)

学习分享-队列-1(数据结构C语言)

时间:2024-11-26 20:32:43浏览次数:8  
标签:Node node pre 队列 C语言 next 数据结构 data

本章写的是基于链表的队列,通过链表来实现队列的操作

一个基于链表的队列(Queue)数据结构,先进先出

结构体定义

typedef struct Node {
    int data;
    struct Node* next;
    struct Node* pre;
} Node;

定义一个节点(Node)结构体,包含数据(data)、指向下一个节点的指针(next)和指向前一个节点的指针(pre)。

初始化队列

Node* initQueue() {
    Node* Q = (Node*)malloc(sizeof(Node));
    Q->data = 0;
    Q->pre = Q;
    Q->next = Q;
    return Q;
}

initQueue函数用于创建一个空的循环链表队列,头节点指向自身,数据计数初始化为0。

入队操作

void enQueue(Node* Q, int data) {
    Node* node = (Node*)malloc(sizeof(Node));
    if (node == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return; // 处理分配失败
    }
    node->data = data;
    node->next = Q;
    node->pre = Q->pre;
    Q->pre->next = node;
    Q->pre = node;
    Q->data++;
}

enQueue函数用于将新节点插入到队列的尾部,同时更新数据计数。

检查队列是否为空

int isEmpty(Node* Q) {
    return Q->data == 0; // 判断队列是否为空
}

isEmpty函数判断队列是否为空。

出队操作

int deQueue(Node* Q) {
    if (isEmpty(Q)) {
        printf("队列为空,无法出队\n");
        return -1; // 特殊返回值表示出队失败
    } else {
        Node* node = Q->next;
        Q->next = Q->next->next;
        Q->next->pre = Q;
        int data = node->data;  // 保存数据
        free(node);  // 释放节点内存
        Q->data--;   // 更新队列中的数据计数
        return data; // 返回数据
    }
}

deQueue函数从队列头部移除一个节点,并返回其数据。如果队列为空,则返回-1表示出队失败。

萌新我希望我的学习分享能够对大家有所帮助。如果我的内容对您有益,烦请点一下关注,感谢大家的支持与鼓励!

完整代码

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
    struct Node* pre;
} Node;

Node* initQueue() {
    Node* Q = (Node*)malloc(sizeof(Node));
    Q->data = 0;
    Q->pre = Q;
    Q->next = Q;
    return Q;
}

void enQueue(Node* Q, int data) {
    Node* node = (Node*)malloc(sizeof(Node));
    if (node == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return; // 处理分配失败
    }
    node->data = data;
    node->next = Q;
    node->pre = Q->pre;
    Q->pre->next = node;
    Q->pre = node;
    Q->data++;
}

int isEmpty(Node* Q) {
    return Q->data == 0; // 判断队列是否为空
}

int deQueue(Node* Q) {
    if (isEmpty(Q)) {
        printf("队列为空,无法出队\n");
        return -1; // 特殊返回值表示出队失败
    }
    else {
        Node* node = Q->next;
        Q->next = Q->next->next;
        Q->next->pre = Q;
        int data = node->data;  // 保存数据
        free(node);  // 释放节点内存
        Q->data--;   // 更新队列中的数据计数
        return data; // 返回数据
    }
}

void printQueue(Node* Q) {
    Node* node = Q->next;
    while (node != Q) {
        printf("%d -> ", node->data);
        node = node->next;
    }
    printf("NULL\n");
}

int main() {
    Node* Q = initQueue();
    enQueue(Q, 1);
    enQueue(Q, 2);
    enQueue(Q, 3);
    enQueue(Q, 4);
    printQueue(Q);
    printf("dequeue = %d\n", deQueue(Q));
    printf("dequeue = %d\n", deQueue(Q));
    printQueue(Q);
    return 0;
}

标签:Node,node,pre,队列,C语言,next,数据结构,data
From: https://blog.csdn.net/weixin_64867865/article/details/144042490

相关文章

  • C语言学习笔记(持续更新)
    C语言计算机的组成(预备知识)计算机组成计算机:能进行计算和逻辑的设备硬件:组成计算机的各种物理部件(鼠标,键盘)【硬件=电子设备+单片机编程+集成电路+嵌入式系统】软件:计算机中运行的程序和数据【软件=系统软件+应用软件+编程语言+算法和数据结构】计算机的六大部件中......
  • C语言(数据,运算符)
    C语言学习笔记2——数据,运算符变量概念在程序执行过程中其中的值可以被改变的量变量代表内存中具有特定属性的一个存储单元,他是用来存储数据的,也就是存变量的值变量应有个名字,以便于通过名字访问变量举例:#include<stdio.h>intmain(){ //①声明变量并初始化 i......
  • 学习分享-队列-2(数据结构C语言)
    本章通过C++代码使用STL(标准模板库)中的queue类实现了栈的基本操作,包括入队、出队、查看队头元素、判断队列是否为空以及清空队列。导入头文件#include<iostream>#include<queue>//引入队列的头文件usingnamespacestd;创建队列queue<int>q;入队操作q.push(10)......
  • 【数据结构-队列】力扣622. 设计循环队列
    设计你的循环队列实现。循环队列是一种线性数据结构,其操作表现基于FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一......
  • 数据结构--AVL树(平衡二叉树)
     ✅博客主页:爆打维c-CSDN博客​​​​​​ ......
  • 数据结构优化DP
    数据结构优化DP参考题单CleaningShiftsS区间覆盖问题区间加区间最值线段树维护cin>>n>>m>>e;m++,e++;for(inti=1;i<=n;i++) c[i].in();T.build(1,1,e);sort(c+1,c+1+n,[](nodea,nodeb){ if(a.l==b.l)returna.r<b.r; returna......
  • 代码随想录算法训练营第十天(LeetCode232.用栈实现队列;LeetCode225.用队列实现栈;LeetCo
    LeetCode232.用栈实现队列题目链接:用栈实现队列题目链接思路队列是先进先出,栈是先进后出,为了能够让栈可以模拟队列的先进先出,我们设置两个栈,一个栈作为入栈,一个栈作为出栈,我们在入栈存储完数据后,将入栈中的数据全部存储到出栈中,那么从出栈中弹出来的数据就是先进先出的......
  • [Chromium] 多线程任务队列
    Thread线程通用接口,跨平台封装,会创建并持有RunLoop对象//base/threading/thread.hraw_ptr<RunLoop>run_loop_=nullptr;//这种写法可以抽离真正的消息循环逻辑到RunLoop中,并且保证这部分逻辑会随着线程主函数结束后销毁RunLooprun_loop;run_loop_=&run_loop;Run(ru......
  • C语言 - 函数(二)
    1.函数的嵌套调用和链式访问函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。1.1嵌套调用你写的函数我可以用,我写的函数你可以用,这个叫做嵌套调用。但是不可以嵌套定义intAdd(intx,inty){ returnx+y;}intSub(intx,inty){ returnx-y;}......
  • 【C语言】前端项目故障处理。
    在前端项目中,如何处理错误和异常的? 在前端项目中,处理错误和异常通常涉及以下几个步骤: 捕获错误:JavaScript提供try...catch语句用于捕获运行时可能出现的错误。将可能会出错的代码放在try块内,如果发生错误,程序会立即跳转到相应的catch块,其中可以处理错误。     ......