白骑士的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 100typedef 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 100typedef 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 5void 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.mzph.cn/news/868235.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java ReadWriteLock接口

在 Java 中&#xff0c;ReadWriteLock 接口的实现类ReentrantReadWriteLock 类提供了一种允许多个线程同时读取某一资源但只允许一个线程写的锁定机制。这种机制可以提高并发性能&#xff0c;特别是在读操作远多于写操作的场景下。 特性&#xff1a; 可重入&#xff1b;不存…

使用Redis实现缓存穿透的解决方案

使用Redis实现缓存穿透的解决方案 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在缓存系统中&#xff0c;缓存穿透是指访问不存在的数据&#xff0c;导致请求直接穿透缓存层&#xff0c;直接访问…

前端使用Threejs加载机械臂并控制机械臂跳舞

1. 前言 在我的第一篇博客中,大致讲解了如何使用threejs导入机械臂模型,以及如何让机械臂模型动起来的案例,可以看一下之前的博客前端使用Threejs控制机械臂模型运动 本篇博客主要讲解的是在原来的基础上添加GSAP动画库的应用,可以通过动画,来让机械臂进行指定轨迹位姿的运动…

基于SpringBoot的休闲娱乐代理售票系统

本系统主要包括管理员和用户两个角色组成&#xff1b;主要包括&#xff1a;首页、个人中心、用户管理、折扣票管理、分类管理、订单信息管理、退票信息管理、出票信息管理、系统管理等功能的管理系统。 &#x1f495;&#x1f495;作者&#xff1a;Weirdo &#x1f495;&#x…

释放计算潜力:SKlearn模型并行训练指南

释放计算潜力&#xff1a;SKlearn模型并行训练指南 在机器学习任务中&#xff0c;训练模型往往需要大量的计算资源和时间&#xff0c;特别是当处理大规模数据集时。Scikit-learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中一个广泛使用的机器学习库&#xf…

Python酷库之旅-第三方库Pandas(009)

目录 一、用法精讲 19、pandas.read_xml函数 19-1、语法 19-2、参数 19-3、功能 19-4、返回值 19-5、说明 19-6、用法 19-6-1、数据准备 19-6-2、代码示例 19-6-3、结果输出 20、pandas.DataFrame.to_xml函数 20-1、语法 20-2、参数 20-3、功能 20-4、返回值 …

GTP/GTX 手动对齐,谈谈思路。

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

【server】springboot 整合 redis

1、redis 使用模式 1.1 单机模式 1.1.1 编译安装方式 1.1.1.1 下载 Redis的安装非常简单&#xff0c;到Redis的官网&#xff08;Downloads - Redis&#xff09;&#xff0c;下载对应的版本&#xff0c;简单几个命令安装即可。 1.1.1.2 编译安装 tar xzf redis-stable.tar.…

GPU发展史(二):改变游戏规则的3Dfx Voodoo

小伙伴们&#xff0c;大家好呀&#xff0c;我是老猫。 在上一篇GPU发展史&#xff08;一&#xff09;文章中&#xff0c;我们介绍了1976-1995期间早期显卡的发展故事&#xff0c;今天我们将介绍在1995-1999年这段时间显卡的故事&#xff0c;而这段故事的主角就是——3Dfx 提起…

探索多模态预训练:MAnTiS、ActionCLIP、CPT与CoOp的Prompt技巧

上一篇博文整理了 预训练新范式&#xff08;Prompt-tuning&#xff0c;Prefix-tuning&#xff0c;P-tuning&#xff09; &#xff0c;主要是围绕NLP上的成果&#xff0c;具体的概念本文也不做过多赘述。本篇文章将主要整理几篇有代表性的Prompt方法在多模态领域中的应用。 Mult…

【ARMv8/v9 GIC 系列 1.7 -- GIC PPI | SPI | SGI | LPI 中断使能配置介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC 各种中断使能配置PPIs(每个处理器私有中断)SPIs(共享外设中断)SGIs(软件生成的中断)LPIs(局部中断)GIC 各种中断使能配置 在ARM GICv3和GICv4架构中,不同类型的中断(如PPIs、SPIs、SGIs和LPIs)可以通过不同的方式进…

RabbitMQ(集群相关部署)

RabbitMQ 集群部署 环境准备&#xff1a;阿里云centos8 服务器&#xff0c;3台服务器&#xff0c;分别进行安装&#xff1b; 下载Erlang Erlang和RabbitMQ版本对照&#xff1a;https://www.rabbitmq.com/which-erlang.html 创建yum库配置文件 vim /etc/yum.repos.d/rabbi…

序列化和反序列化以及重写SerialVersionUID属性

序列化和反序列化是编程中常见的概念&#xff0c;特别是在数据存储、通信和对象持久化等场景下。 序列化 序列化是将对象转换为字节流的过程&#xff0c;以便于存储或传输。在Java中&#xff0c;序列化通常涉及将对象转换为字节序列&#xff0c;可以存储到文件中或通过网络发送…

【环境搭建】MAC M3-MAX芯片安装scikit-learn库报错。

问题 首先想安装scikit-learn库在mac终端显示顺利安装完成&#xff0c;但是测试的时候报错如下所示&#xff1a; /opt/anaconda3/envs/dtc/bin/python /Users/chenfaquan/PycharmProjects/TimeSeries/data_create.py Traceback (most recent call last):File "/Users/c…

10、Redis-位图(Bitmap)与计数位图(Counting Bitmap)以及布隆过滤器

1. 引言 位图&#xff08;Bitmap&#xff09;是一种高效的二进制数据结构&#xff0c;用于表示和操作大规模的集合数据。通过使用位数组&#xff08;bit array&#xff09;&#xff0c;位图能够在非常小的内存空间内快速进行查找和存储操作。本文将详细介绍位图的基本概念、工…

详细分析Sql中SELECT TOP的基本知识

目录 前言1. 基本知识2. 彩蛋 前言 在Sql server中查询比较消费占用空间&#xff0c;对此需要从子句中从结果集中选择前面的若干行 在不同的数据库系统中&#xff0c;这个功能的实现方式略有不同 1. 基本知识 Microsoft SQL Server 使用 TOP 关键字来限制返回的行数 SELEC…

生物墨水:3D组织生物打印的基石

生物墨水是3D组织生物打印技术的核心组成部分。生物墨水通常由生物材料&#xff08;如水凝胶聚合物&#xff09;与所需的细胞和/或其他生物大分子&#xff08;例如生长因子&#xff09;混合而成。为了成功地进行组织生物打印&#xff0c;生物墨水必须满足以下要求&#xff1a; …

为什么要设计DTO类

为什么要使用DTO类&#xff0c;下面以新增员工接口为例来介绍。 新增员工 1.1 需求分析和设计 1.1.1 产品原型 一般在做需求分析时&#xff0c;往往都是对照着产品原型进行分析&#xff0c;因为产品原型比较直观&#xff0c;便于我们理解业务。 后台系统中可以管理员工信息…

Bug记录:【com.fasterxml.jackson.databind.exc.InvalidDefinitionException】

bug记录 序列化错误 异常com.fasterxml.jackson.databind.exc.InvalidDefinitionException: 完整错误(主要是FAIL_ON_EMPTY_BEANS) 00:15:20.250 [http-nio-3000-exec-1] ERROR org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/].[dispatcherServlet] - S…

数据驱动的内容优化:Kompas.ai如何提升内容表现

在数字化营销时代&#xff0c;内容是企业与用户沟通的重要桥梁。然而&#xff0c;随着信息量的爆炸性增长&#xff0c;如何让内容在激烈的竞争中脱颖而出&#xff0c;成为每个营销人员面临的问题。数据驱动的内容优化策略&#xff0c;通过精准分析和科学决策&#xff0c;帮助品…