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

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

1. 什么是数据结构?

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

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

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

复制代码
// 链表节点示例
struct Node{
    int data; // 数据
    struct Node *next; // 指向下一个节点的指针
}
2. 有哪些基础数据结构?
2.1 线性结构(数据按顺序排列)
  • **数组:**固定大小,随机访问快(如int arr10)。
  • **链表:**动态大小,插入/删除灵活(单链表、双链表、循环链表)。
  • **栈:**先进先出(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;
}
相关推荐
?abc!3 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
爱读书的小胖7 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
舰长1157 小时前
将百万数据插入到 Redis,有哪些实现方案?
数据结构·redis·开源
若亦_8 小时前
数据结构>>优先级队列(堆)
java·数据结构
bksczm9 小时前
Redis数据结构之hash
数据结构·redis·哈希算法·1024程序员节
星夜离尘5612 小时前
MATLAB 因果采样保持:用历史匹配和数据年龄防止未来信息泄漏
数据结构·算法·matlab
思麟呀12 小时前
BTree的原理与 C++ 完整实现
c语言·数据结构·c++·算法·1024程序员节
黄俊懿13 小时前
【架构师从入门到进阶】第七章:缓存和存储的优化思路——第一节:缓存概述
数据结构·数据库·分布式·缓存·架构·系统架构·1024程序员节
晒太羊的猫14 小时前
hot100 堆
数据结构
啵啵啵鱼14 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践
数据结构·1024程序员节