当前位置: 首页 > news >正文

C语言常用的数据结构

C语言常用的数据结构

1. 数组(Array)

一组固定大小的连续存储的元素,所有元素类型相同,可以通过索引访问。

特点:快速读取、固定大小;

使用场景:用于需要频繁访问元素的场景,例如,查表等。

int arr[5] = {0, 1, 2, 3, 4};
printf("%d", arr[2]);

2. 链表(Linked List)

一系列节点组成的线型结构,每个节点包含数据和一个指向下一个节点的指针。

特点:动态大小,方便插入和删除操作。

使用场景:需要频繁插入/删除元素的场景,例如队列、栈的实现。

struct Node{int data;struct Node* next;
};
struct Node* head = NULL;	// 初始化链表头指针

3. 栈(Stack)

一种后进先出(LIFO,Last In First Out)的数据结构。

特点:只允许一端进行插入和删除操作,即栈顶。

使用场景:用于实现递归、表达式求值、括号匹配等。

#include <stdio.h>
#define MAX 100
int stack[MAX];
int top = -1;void push(int value){if(top < MAX -1){stack[++top] = value;}
}int pop(){if(top >= 0 ){teturn stack[top--];}return -1;	// 栈空
}

4. 队列(Queue)

一种先进先出(FIFO,First In First Out)的数据结构。

特点:元素从一端进入,从另一端离开。

使用场景:用于任务调度、缓存等。

#define MAX 100
int queue[MAX];
void enqueue(int value){if(rear < MAX){queue[rear++] = value;}
}int dequeue(){if(front < rear){return queue[front++];}return -1;		// 队列为空
}

5. 二叉树(Binary Tree)

每个节点最多有两个子节点的树结构,分别称为左子节点和右字节点。

特点:结构灵活,时和多种操作,如查找、插入、删除。

使用场景:用于实现二叉树、堆、表达式树等。

struct TreeNode{int data;struct TreeNode* left;struct TreeNode* right;
};struct TreeNode* root = NULL; // 初始化二叉树根节点

6. 哈希表(Hash Table)

通过哈希函数将键值映射到数组中的位置,以实现快速查找。

特点:平均情况下,插入、删除和查找操作的时间复杂度为O(1)。

使用场景:用于快速查找,如数据库索引、缓存实现。

#define SIZE 100int hashTable[SIZE];int hashFunction(int key){return key % SIZE;
}void insert(int key){int index = hashFunction(key);hashTable[index] = key;
}

7. 图(graph)

由一组顶点和这些顶点之间的边组成的结构,可以是有向或无向的。

特点:适合表示多对多关系,入社交网络、道路网络。

使用场景:用于路径查找、网络流、最短路径等。

#define V 5int graph[V][V] = {{0, 1, 0, 0, 1},{1, 0, 1, 0, 1},{0, 1, 0, 1, 0},{0, 0, 1, 0, 1},{1, 1, 0, 1, 0}
};

8. 堆 (Heap)

  • 简介: 一种特殊的二叉树,满足堆性质:最大堆中每个节点都大于等于其子节点,最小堆中每个节点都小于等于其子节点。
  • 特点: 适合实现优先队列,支持高效的最大/最小值获取。
  • 使用场景: 用于排序(堆排序)、优先队列实现等。
void heapify(int arr[], int n, int i) {int largest = i;int left = 2 * i + 1;int right = 2 * i + 2;if (left < n && arr[left] > arr[largest])largest = left;if (right < n && arr[right] > arr[largest])largest = right;if (largest != i) {int temp = arr[i];arr[i] = arr[largest];arr[largest] = temp;heapify(arr, n, largest);}
}

9. 集合 (Set)

  • 简介: 一种无序且不重复的元素集合。
  • 特点: 主要用于判断元素是否存在、集合操作(并集、交集、差集)。
  • 使用场景: 用于集合操作、去重、快速查找元素。
#include <stdio.h>
#include <stdbool.h>bool set[1000] = {false};void insert(int value) {set[value] = true;
}bool contains(int value) {return set[value];
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python | Leetcode Python题解之第331题验证二叉树的前序序列化
  • PPPoE基础笔记
  • String 事务
  • 大模型面试系列-大模型算法工程师的面试题目与解答技巧详细说明
  • 安美数字酒店宽带运营系统 weather.php 任意文件读取漏洞复现
  • redis面试(十五)公平锁队列重排
  • 封装clickHouse线程池与ibeetl解析SQL并对结果转进行转化
  • 监控电脑屏幕被拍照的原理是什么?如此有趣的电脑防偷窥知识,你一学就会!
  • MAC 终端上传文件到云服务器
  • 【银河麒麟高级服务器操作系统】libtirpc-devel 安装问题分析
  • 英国与日本经济数据影响市场走势
  • allegro PCB设计心得笔记(四) -- 显示坐标原点和更改默认产品选项
  • 计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)
  • Qt实现中英文切换中QMessageBox中的中文信息怎么处理
  • uniapp基础知识【搬代码】
  • ----------
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • extract-text-webpack-plugin用法
  • Git学习与使用心得(1)—— 初始化
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript HTML DOM
  • Redis字符串类型内部编码剖析
  • Sass Day-01
  • SpiderData 2019年2月13日 DApp数据排行榜
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • vuex 笔记整理
  • 初识MongoDB分片
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 翻译:Hystrix - How To Use
  • 开源地图数据可视化库——mapnik
  • 聊一聊前端的监控
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 系统认识JavaScript正则表达式
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • ###STL(标准模板库)
  • #565. 查找之大编号
  • #APPINVENTOR学习记录
  • $$$$GB2312-80区位编码表$$$$
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Java入门)学生管理系统
  • (LeetCode) T14. Longest Common Prefix
  • (ZT)一个美国文科博士的YardLife
  • (备忘)Java Map 遍历
  • (函数)颠倒字符串顺序(C语言)
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (生成器)yield与(迭代器)generator
  • (一)认识微服务
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • . NET自动找可写目录
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET Core 中插件式开发实现
  • .NET 发展历程