数据结构基础(一)—— 什么是数据结构?

数据结构是编程的"工具箱",它决定了如何高效地存储、组织和操作数据,为算法提供基础。下面用通俗易懂的方式,从基础概念到实际应用,为你简单介绍什么是数据结构。

1. 什么是数据结构?

数据结构是数据的组织方式,就像用不同的盒子装东西,例如:

  • 数组:一排整齐的盒子,每个盒子有固定的位置(可以通过下标访问)。
  • 链表:一串用绳子串起来的盒子,每个盒子知道下一个盒子的位置。
  • 栈:像叠盘子,只能从最上面拿和放。
  • 队列:像排队买票,先到的人先享受服务。
  • 树:像一个家族的族谱树,有父子关系(比如文件目录)。
  • 图:像社交网络,节点之间可以任意连接。

在c语言中,数据结构是通过结构体(struct)和指针实现,例如:

复制代码
// 链表节点示例
struct Node{
    int data; // 数据
    struct Node *next; // 指向下一个节点的指针
}
2. 有哪些基础数据结构?
2.1 线性结构(数据按顺序排列)
  • **数组:**固定大小,随机访问快(如int arr[10])。
  • **链表:**动态大小,插入/删除灵活(单链表、双链表、循环链表)。
  • **栈:**先进先出(FIFO),如任务调度队列。
2.2 非线性结构(数据有层次或复杂关系)
  • **树:**二叉树、二叉搜索树、平衡树(AVL树)、堆(本质是完全二叉树)。
  • **图:**邻接矩阵、邻接表(如社交网络中的好友关系)。
2.3 哈希结构
  • **哈希表:**通过键值(key)快速查找值(Value),如字典。
3. 为什么会存在这么多种数据结构?

因为不同问题需要不同的解决方案,就像工具箱里有螺丝刀、锤子、扳手、每种工具适合不同的场景。数据结构的选择主要取决于以下三个方面:

3.1 操作效率
  • 频繁查找:选数组或哈希表(O(1)或O(log n))。
  • 频繁插入/删除:选链表或树(O(1)或O(log n))
3.2 内存限制:
  • 动态结构(链表、树)节省内存,但需要额外指针空间。
  • 静态结构(数组)可能浪费内存,但访问更快。
3.3 数据关系:
  • 层次数据(如文件系统)用树。
  • 复杂关系(如社交网络)用图。
3.4 举例说明:
  • 用栈实现"撤销操作"(后进先出);
  • 用队列实现打印机任务调度(先进先出);
  • 用二叉搜索树实现电话簿的快速查找;
  • 用图实现地图导航的最短路径算法。
4. 主要数据结构适用场景一览表
数据结构 适用场景 不适用场景
数组 数据大小固定,需要随机访问(如矩阵计算) 频繁插入/删除
链表 频繁插入/删除,数据大小动态变化 需要随机访问
函数调用、括号匹配、深度优先搜索(DFS) 需要先进先出
队列 广度优先搜索(BFS)、任务调度 需要后进先出
文件系统、数据库索引、表达式解析 数据无层次关系
社交网络、地图导航、状态机 数据关系简单
哈希表 字典、缓存、数据库查询、字符串匹配(如Rabin-Karp算法) 需要保持数据顺序
5. 应用示例
5.1 数组应用示例
复制代码
// 特点:直接通过下标访问,但大小固定。
#include <stdio.h>
#define SIZE 5

int main() {
    int arr[SIZE] = {10, 20, 30, 40, 50};
    printf("第三个元素:%d\n", arr[2]); // 输出30
    return 0;
}
5.2 链表应用实例
复制代码
// 特点:动态扩容,但需要手动管理内存。
#include <stdio.h>
#include <stdlib.h>

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

int main() {
    // 创建节点
    struct Node *head = NULL;
    struct Node *second = NULL;
    struct Node *third = NULL;

    // 分配内存
    head = (struct Node*)malloc(sizeof(struct Node));
    second = (struct Node*)malloc(sizeof(struct Node));
    third = (struct Node*)malloc(sizeof(struct Node));

    // 连接节点
    head->data = 1;
    head->next = second;

    second->data = 2;
    second->next = third;

    third->data = 3;
    third->next = NULL;

    // 遍历链表
    struct Node *curr = head;
    while (curr != NULL) {
        printf("%d -> ", curr->data);
        curr = curr->next;
    }
    printf("NULL\n"); // 输出: 1 -> 2 -> 3 -> NULL

    // 释放内存
    free(head);
    free(second);
    free(third);
    return 0;
}
相关推荐
HUST2 小时前
C 语言 第八讲:VS实用调试技巧
运维·c语言·开发语言·数据结构·算法·c#
历程里程碑2 小时前
LeetCode128:哈希集合巧解最长连续序列
开发语言·数据结构·c++·算法·leetcode·哈希算法·散列表
风筝在晴天搁浅3 小时前
hot100 160.相交链表
数据结构·链表
Yzzz-F3 小时前
CF GYM105316A DP
数据结构·算法
C雨后彩虹3 小时前
幼儿园分班
java·数据结构·算法·华为·面试
Yupureki3 小时前
《算法竞赛从入门到国奖》算法基础:入门篇-二分算法
c语言·开发语言·数据结构·c++·算法·visual studio
云技纵横4 小时前
Redis 数据结构底层与 Hash 优于 JSON 的工程实践
数据结构·redis·哈希算法
Binky6784 小时前
力扣--贪心篇(1)
数据结构·算法·leetcode
醉风塘5 小时前
数据库索引深度解析:从数据结构到最佳实践
数据结构·数据库