白骑士的C语言教学高级篇 3.2 高级数据结构

系列目录

上一篇:白骑士的C语言教学高级篇 3.1 高级指针技术

        在计算机科学中,数据结构是组织和存储数据的方式,不同的数据结构适用于不同的问题和算法。本节将介绍链表、栈与队列以及树与图,这些高级数据结构在实际编程中非常常用,并且是许多复杂算法的基础。

链表

        链表是一种线性数据结构,其中的元素存储在节点中,每个节点包含数据和一个指向下一个节点的指针。链表的优点是插入和删除操作非常高效,但缺点是访问元素的时间复杂度较高,因为需要从头节点开始逐个遍历。

单向链表

        只有一个方向的指针,指向下一个节点,例如:

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


typedef struct Node {
    int data;

    struct Node *next;
} Node;


void append(Node **head, int data) {
    Node *new_node = (Node *)malloc(sizeof(Node));

    new_node->data = data;
    new_node->next = NULL;

    if (*head == NULL) {
        *head = new_node;
    } 

    else {
        Node *temp = *head;

        while (temp->next != NULL) {
            temp = temp->next;
        }

        temp->next = new_node;
    }
}


void printList(Node *head) {
    while (head != NULL) {
        printf("%d -> ", head->data);

        head = head->next;
    }

    printf("NULL\n");
}


int main() {
    Node *head = NULL;

    append(&head, 1);
    append(&head, 2);
    append(&head, 3);

    printList(head);

    return 0;
}

双向链表

        具有两个方向的指针,分别指向前一个节点和后一个节点,例如:

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


typedef struct Node {
    int data;

    struct Node *prev;
    struct Node *next;
} Node;


void append(Node **head, int data) {
    Node *new_node = (Node *)malloc(sizeof(Node));
    new_node->data = data;
    new_node->next = NULL;

    if (*head == NULL) {
        new_node->prev = NULL;

        *head = new_node;
    } 

    else {
        Node *temp = *head;

        while (temp->next != NULL) {
            temp = temp->next;
        }

        temp->next = new_node;

        new_node->prev = temp;
    }
}


void printList(Node *head) {
    while (head != NULL) {
        printf("%d -> ", head->data);

        head = head->next;
    }

    printf("NULL\n");
}


int main() {
    Node *head = NULL;

    append(&head, 1);
    append(&head, 2);
    append(&head, 3);

    printList(head);

    return 0;
}

栈与队列

        栈(Stack)是一种后进先出(LIFO,Last In First Out)的数据结构,栈的操作主要有两个:‘push‘(入栈)和 ‘pop‘(出栈)。例如:

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


#define MAX 100


typedef struct Stack {
    int data[MAX];
    int top;
} Stack;


void push(Stack *stack, int value) {
    if (stack->top < MAX - 1) {
        stack->data[++stack->top] = value;
    } 

    else {
        printf("Stack overflow\n");
    }
}


int pop(Stack *stack) {
    if (stack->top >= 0) {
        return stack->data[stack->top--];
    } 

    else {
        printf("Stack underflow\n");

        return -1;
    }
}


int main() {
    Stack stack;
    stack.top = -1;

    push(&stack, 1);
    push(&stack, 2);
    push(&stack, 3);

    printf("Popped: %d\n", pop(&stack));
    printf("Popped: %d\n", pop(&stack));

    return 0;
}

队列

        队列(Queue)是一种先进先出(FIFO,First In First Out)的数据结构,队列的操作主要有两个:‘enqueue‘(入队)和 ‘dequeue‘(出队)。例如:

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


#define MAX 100


typedef struct Queue {
    int data[MAX];
    int front;
    int rear;
} Queue;


void enqueue(Queue *queue, int value) {
    if (queue->rear < MAX - 1) {
        queue->data[++queue->rear] = value;

        if (queue->front == -1) {
            queue->front = 0;
        }
    } 

    else {
        printf("Queue overflow\n");
    }
}


int dequeue(Queue *queue) {
    if (queue->front > queue->rear || queue->front == -1) {
        printf("Queue underflow\n");

        return -1;
    } 

    else {
        return queue->data[queue->front++];
    }
}


int main() {
    Queue queue;
    queue.front = -1;
    queue.rear = -1;

    enqueue(&queue, 1);
    enqueue(&queue, 2);
    enqueue(&queue, 3);

    printf("Dequeued: %d\n", dequeue(&queue));
    printf("Dequeued: %d\n", dequeue(&queue));

    return 0;
}

树与图

        树(Tree)是一种层次数据结构,树中的每个节点包含一个数据元素和指向子节点的指针。树的典型应用包括二叉树、二叉搜索树(BST)等。

        二叉树是一种特殊的树结构,每个节点最多有两个子节点,例如:

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


typedef struct Node {
    int data;

    struct Node *left;
    struct Node *right;
} Node;


Node* createNode(int data) {
    Node *newNode = (Node *)malloc(sizeof(Node));
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;

    return newNode;
}


void inorderTraversal(Node *root) {
    if (root != NULL) {
        inorderTraversal(root->left);

        printf("%d -> ", root->data);

        inorderTraversal(root->right);
    }
}


int main() {
    Node *root = createNode(1);
    root->left = createNode(2);
    root->right = createNode(3);
    root->left->left = createNode(4);
    root->left->right = createNode(5);

    printf("Inorder Traversal: ");

    inorderTraversal(root);

    printf("NULL\n");

    return 0;
}

        图(Graph)是一种更复杂的数据结构,由节点(顶点)和边组成。图可以是有向图或无向图,应用广泛,如社交网络、交通网络等。

        邻接矩阵表示法是图的一种表示方法,例如:

#include <stdio.h>


#define MAX 5


void addEdge(int graph[MAX][MAX], int u, int v) {
    graph[u][v] = 1;
    graph[v][u] = 1;  // 如果是无向图
}


void printGraph(int graph[MAX][MAX]) {
    for (int i = 0; i < MAX; i++) {
        for (int j = 0; j < MAX; j++) {
            printf("%d ", graph[i][j]);
        }

        printf("\n");
    }
}


int main() {
    int graph[MAX][MAX] = {0};

    addEdge(graph, 0, 1);
    addEdge(graph, 0, 4);
    addEdge(graph, 1, 2);
    addEdge(graph, 1, 3);
    addEdge(graph, 1, 4);
    addEdge(graph, 2, 3);
    addEdge(graph, 3, 4);

    printGraph(graph);

    return 0;
}

总结

        高级数据结构在C语言编程中具有重要地位,掌握这些数据结构可以解决复杂的问题,提高程序的效率和灵活性。通过链表、栈与队列以及树与图的学习,将具备处理多种实际应用场景的能力。这些数据结构不仅在算法设计中广泛应用,而且是计算机科学领域的基础知识。

下一篇:白骑士的C语言教学高级篇 3.3 并发与多线程​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/783297.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows sshkeygen 多平台添加配置

文章目录 .ssh目录生成新的ssh配置添加公钥到仓库验证 .ssh目录 windows下一般为&#xff1a;C:\Users\15237.ssh &#xff0c;其中“15237”为当前登录用户 生成新的ssh .ssh目录下打开“Git Bash Here”&#xff08;如果没有&#xff0c;先安装 Git 软件&#xff09; 执行…

学会python——用python生成一个验证码(python实例二十)

目录 1.认识Python 2.环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3.生成验证码 3.1 代码构思 3.2 代码实例 3.3 运行如果 4.总结 1.认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性&…

无人直播怎么玩,一文带你了解AI小姐姐自动换装玩法

最近经常有小伙伴问我 就是像这种&#xff0c;一刷礼物&#xff0c;小姐姐就换装的视频到底该怎么做 今天就来教大家 如何来制作这种直播视频 第一步&#xff1a;搭建OBS 1、设置屏幕分辨率&#xff1a; 背景&#xff1a;因为一般初始状态&#xff0c;屏幕是横屏的&#xf…

从零开始的python学习生活1

python函数的对返回值 本来多个return是不行的 这种语法就能接受多个返回值 def hanshu():return 1,"hello",True x,y,z hanshu() print(x) print(y) print(z)函数的多种传参方式 提前说明白了顺序就无所谓了 关键字传递一个传递参数&#xff0c;一个传递键值…

04-Haproxy搭建Web群集

理论讲解 Haproxy 是目前比较流行的一种群集调度工具&#xff0c;同类群集调度工具有很多&#xff0c;如LVS 和Nginx。相比较而言&#xff0c;LVS 性能最好&#xff0c;但是搭建相对复杂:Nginx的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xff…

人员定位系统于不同场景的实际应用

人员定位系统的应用&#xff0c;尽管还没有做到大范围的普及&#xff0c;但是这一系统在不同企业&#xff0c;不同单位的实际应用效果还是很好的&#xff0c;所以人员定位系统也应用于不同场景当中了&#xff0c;那么&#xff0c;本文就来讲讲这一系统在不同场景的实际应用。 人…

CV每日论文--2024.7.3

1、HouseCrafter: Lifting Floorplans to 3D Scenes with 2D Diffusion Model 中文标题&#xff1a;HouseCrafter&#xff1a;使用 2D 扩散模型将平面图提升为 3D 场景 简介&#xff1a;HouseCrafter是一种新的方法,能够将平面图转换为完整的大型3D室内场景(如房屋)。它的关键…

软件架构之系统性能评价

软件架构之系统性能评价 第 5 章 系统性能评价5.1 性能指标5.1.1 计算机 5.1.2 网络5.3 性能设计5.3.1 阿姆达尔解决方案5.3.2 负载均衡 5.4 性能评估5.4.1 基准测试程序5.4.2 Web 服务器的性能评估5.4.3 系统监视 第 5 章 系统性能评价 系统性能是一个系统提供给用户的众多性…

80+ ChatGPT 文献综述指令

进行文献综述通常似乎是一项艰巨的任务。它是学术和研究工作的重要组成部分&#xff0c;涉及对先前发表的与特定主题相关的研究进行全面和批判性分析。目标是深入了解该主题的知识状况&#xff0c;找出差距&#xff0c;并为进一步研究奠定基础。 传统上&#xff0c;文献综述是…

idm 支持断点续传吗 idm 断点续传如何使用 idm断点续传怎么解决 idm下载中断后无法继续下载

断点续传功能&#xff0c;让我再也不会惧怕下载大型文件。在断点续传的帮助下&#xff0c;用户可以随时暂停下载任务&#xff0c;并在空闲时继续之前的下载进程。下载文件不惧网络波动&#xff0c;断点续传让下载过程更稳定。有关 idm 支持断点续传吗&#xff0c;idm 断点续传如…

Java:String 类

文章目录 一、概念二、创建字符串三、字符串长度四、连接字符串五、比较字符串 一、概念 字符串广泛应用 在 Java 编程中&#xff0c;在 Java 中字符串属于对象&#xff0c;Java 提供了 String 类来创建和操作字符串。 二、创建字符串 创建字符串最简单的方式如下: // 直接创…

C++ 面试宝典之:空类大小究竟是不是 0?

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/pD4bIjX2kDzo8gbYRPktPQ 首先&#xff0c;空类是什么&#xff1f;空类指的是不包含任何数据成员的类&#xff0c;但可能包含方法成员。 实例化时…

苹果电脑压缩软件哪个好用一些? mac电脑用什么压缩软件 mac电脑压缩文件怎么设置密码

压缩软件是Mac电脑必不可少的工具&#xff0c;虽然Mac系统自带了一款“归档实用工具”&#xff0c;但是其功能实在匮乏&#xff0c;若你需要加密压缩文件或者把文件压缩成指定格式&#xff0c;那么该工具无法满足你的需求。Mac用户应该怎么选择压缩软件呢&#xff1f;本文就来告…

git 文件没有修改,但一直提示有0行改动,还原也不行

查看文件修改内容 原来是文件的模式(读写可执行权限)发生了变化,内容本是没有变化. 怎么解决 git config --add core.filemode false忽略文件模式

java中反射(Reflection)的4个作用

java中反射&#xff08;Reflection&#xff09;的4个作用 作用1、在运行时判断任意一个对象所属的类作用2、在运行时构造任意一个类的对象作用3、在运行时判断任意一个类所具有的成员变量和方法作用4、在运行时调用任意一个对象的方法总结 &#x1f496;The Begin&#x1f496;…

Excel 宏录制与VBA编程 ——VBA编程技巧篇二 (合并内容相同连续单元格、取消合并单元格并在每个单元格中保留内容)

1、合并内容相同的连续单元格 如果需要合并如图所示的工作表中B列中部门相同的连续单元格 VBA代码&#xff1a; Sub Mergerng()Dim IntRow As IntegerDim i As IntegerApplication.DisplayAlerts FalseWith Sheet1IntRow .Range("A65536").End(xlUp).RowFor i In…

移动UI: 什么特征会被认为是简洁风格,用案例告诉你

什么是简洁风格&#xff0c;恐怕一百个人有一百个是理解&#xff0c;本文通过理论分析案例的方式进行探讨。 移动 UI 中的简洁风格通常具有以下几个特征&#xff1a; 1. 平面化设计&#xff1a; 简洁风格的移动 UI 善于运用平面化设计&#xff0c;即去除过多的阴影、渐变和立…

电子教室如何防止关闭客户端?

防止电子教室中的客户端被学生关闭或绕过&#xff0c;需要采取一系列技术和策略性的措施。以下是一些可行的方法&#xff1a; 技术手段 1. 使用专用教学软件&#xff1a; 采用具有强大控制功能的电子教室软件&#xff0c;如极域电子教室&#xff0c;它们通常包含防关闭、防退…

从工具到平台:AI PC 的崛起

从工具到平台&#xff1a;AI PC 的崛起 AI技术正以前所未有的速度改变着我们的生活和工作方式。随着大模型技术从云端向终端设备下沉&#xff0c;个人电脑正成为AI部署的首选终端。AI PC的崛起不仅标志着个人电脑行业的一次重大变革&#xff0c;更预示着一个全新的个人AI时代的…

2024年文化研究与数字媒体国际会议 (CRDM 2024)

2024年文化研究与数字媒体国际会议 (CRDM 2024) 2024 International Conference on Cultural Research and Digital Media 【重要信息】 大会地点&#xff1a;珠海 大会官网&#xff1a;http://www.iccrdm.com 投稿邮箱&#xff1a;iccrdmsub-conf.com 【注意&#xff1a;稿将…