CS-第 5 周

数据结构详解:从数组到树,再到哈希表

本文深入探讨几种常见的数据结构,包括数组、链表、二叉搜索树(BST)和哈希表,并阐述其在内存中的组织方式及优缺点。

信息结构与抽象数据结构

信息结构指的是内存中组织信息的方式,而抽象数据结构则是我们概念上对这些结构的理解。 理解抽象数据结构有助于我们更好地在实践中实现各种数据结构。

堆栈和队列

队列是一种遵循FIFO(先进先出)原则的抽象数据结构,类似于排队等候。其主要操作包括入队(添加元素到队列尾部)和出队(移除队列头部元素)。

堆栈则遵循LIFO(后进先出)原则,如同叠盘子。其操作包括压入(添加元素到堆栈顶部)和弹出(移除堆栈顶部元素)。

数组

数组是一种在内存中连续存储数据的结构。 如下图所示,数组在内存中占据连续的存储空间。

CS-第 5 周

内存中可能存在其他程序、函数和变量,以及之前使用过的冗余数据。 如果需要向数组添加新元素,则需要重新分配内存并复制整个数组,这会造成效率低下。

CS-第 5 周CS-第 5 周CS-第 5 周

预先分配过多的内存虽然可以减少复制操作,但却会浪费系统资源。因此,根据实际需求分配内存至关重要。

链表

链表是一种强大的数据结构,它允许将位于不同内存区域的值连接成一个列表,并支持动态扩展或缩小。

CS-第 5 周

每个节点包含两个值:数据值和指向下一个节点的指针。最后一个节点的指针值为NULL,表示链表的结尾。

CS-第 5 周CS-第 5 周

C语言中,节点可以定义如下:

typedef struct node {    int number;    struct node *next;} node;

以下示例展示了链表的创建过程:

CS-第 5 周nodeCS-第 5 周CS-第 5 周CS-第 5 周CS-第 5 周CS-第 5 周CS-第 5 周

链表的缺点包括:需要额外内存存储指针,以及无法通过索引直接访问元素。

二叉搜索树 (BST)

二叉搜索树是一种高效存储、搜索和检索数据的树形结构。

CS-第 5 周CS-第 5 周CS-第 5 周

BST 的优点在于动态性和搜索效率(O(log n)),缺点在于树不平衡时搜索效率会下降到 O(n),并且需要额外的内存存储指针。

哈希表

哈希表类似于字典,包含键值对。 它利用哈希函数将键映射到数组索引,从而实现 O(1) 的平均查找时间。

CS-第 5 周

哈希冲突(多个键映射到同一个索引)可以通过链表或其他方法解决。 哈希函数的设计对哈希表的性能至关重要。 一个简单的哈希函数示例如下:

#include unsigned int hash(const char *word) {    return toupper(word[0]) - 'A';}

本文基于cs50x 2024源码整理。

以上就是CS-第 5 周的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1461260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 13:11:32
下一篇 2025年12月18日 13:11:45

相关推荐

  • 解析 C 中的命令行参数

    本文将演示如何使用C语言解析命令行参数。以下代码实现了一个简单的命令行参数解析器,能够处理文件路径、布尔标志和整数值。 #include #include #include #include // 定义结构体存储命令行参数typedef struct { char* filepath; bool m…

    2025年12月18日
    000
  • DSA日介绍

    大家好! 我将开启一个专注于数据结构和算法 (DSA) 的博客系列。教程内容基于我的学习和经验。 我将使用 C 语言编写这些教程,并为 C 语言初学者提供入门教程。 虽然 DSA 可用 C、Java 或 Python 等语言实现, 但我选择使用 C 语言。 这是一个简单的介绍,不必担心看不懂,后续文…

    2025年12月18日
    000
  • c语言函数最大公约数怎么表示教程

    最大公约数在 C 语言中可以通过辗转相除法计算,利用欧几里得算法不断取余,直到余数为 0,最后的除数即为最大公约数。对于递归代码存在的栈溢出风险,可采用迭代实现,利用循环不断进行取余运算,同样可以得到最大公约数。此外,考虑到负数处理,可进一步优化代码,利用 abs() 函数将负数转换为正数,增强代码…

    2025年12月18日
    000
  • c语言函数返回值56或65啥意思

    C语言函数返回 56 或 65 时,表示特定事件。这些数字含义由函数开发者定义,可能表示成功、文件未找到或读取错误。使用枚举或宏定义代替这些“魔法数字”可以提高可读性和可维护性,如:READ_SUCCESS、FILE_NOT_FOUND 和 READ_ERROR。 C语言函数返回值56或65:那些隐…

    2025年12月18日
    000
  • C 中的整数:一点历史

    整数是编程中最基础的数据类型,堪称编程的基石。程序员的工作就是赋予这些数字意义,无论软件多么复杂,最终都归结于整数运算,因为处理器只理解整数。 为了表示负数,我们引入了二进制补码;为了表示小数,我们创造了科学计数法,于是有了浮点数。但归根结底,一切仍然离不开0和1。 整数的简史 在C语言中,int几…

    2025年12月18日
    000
  • CS-第 3 周

    算法是解决问题的指令集,其执行速度和内存占用各不相同。编程中,许多算法都基于数据搜索和排序。本文将介绍几种数据检索和排序算法。 线性搜索 假设有一个数组 [20, 500, 10, 5, 100, 1, 50],需要查找数字 50。线性搜索算法会逐个检查数组中的每个元素,直到找到目标值或遍历完整个数…

    2025年12月18日 好文分享
    000
  • c语言函数的定义调用声明格式怎么搞

    C语言函数包含定义、调用和声明。函数定义指定函数名、参数和返回类型,函数体实现功能;函数调用执行函数并提供参数;函数声明告知编译器函数类型。值传递用于参数传递,注意返回类型,保持一致的代码风格,并在函数中处理错误。掌握这些知识有助于编写优雅、健壮的C代码。 C语言函数:定义、调用与声明的那些事儿 你…

    2025年12月18日
    000
  • c语言函数的定义和调用一览

    C语言函数定义包括指定返回值类型、函数名、参数列表和函数体。调用函数只需用函数名加上参数。参数传递默认按值传递,指针参数除外。函数原型声明函数信息,提高可读性。递归函数自调用,需有终止条件。性能优化可使用内联函数或宏定义减少函数调用开销。 C语言函数:定义与调用,那些你可能不知道的细节 很多初学者觉…

    2025年12月18日
    000
  • c语言函数定义和调用的规则是什么

    C语言函数由参数列表、函数体、返回值类型和函数名组成。函数调用时,参数通过值传递机制复制给函数,不会影响外部变量。指针传递则直接传递内存地址,修改指向的内容会影响外部变量。函数原型声明用于告知编译器函数签名,避免编译错误。栈空间用于存储函数局部变量和参数,过多递归或占用空间过大可导致栈溢出。 C语言…

    2025年12月18日
    000
  • c语言函数指针和指针函数是什么?有什么区别?

    函数指针是指向函数的指针,而指针函数是返回指针的函数。函数指针指向函数,用于选择和执行不同的函数;指针函数返回指针,指向变量、数组或其他函数;使用函数指针要注意参数匹配和检查指针空值;使用指针函数要注意内存管理,释放动态分配的内存;理解两者的区别和特性,避免混淆和错误。 C语言函数指针和指针函数,乍…

    2025年12月18日
    000
  • c语言函数定义格式有哪些

    C语言函数定义的关键元素包括:返回类型(定义函数返回的值)、函数名(遵循命名规范,决定作用域)、参数列表(定义函数接受的参数类型、数量和顺序)和函数体(实现函数的逻辑)。明确这些元素的意义和微妙关系至关重要,能帮助开发者避免“坑”,编写更高效、更优雅的代码。 C语言函数定义:那些你可能不知道的细节 …

    2025年12月18日
    000
  • c语言函数括号里面指针参数有哪些?

    C 语言函数的指针参数直接操作调用者传递的内存区域,包括指向整数、字符串或结构体的指针。使用指针参数时,需要谨慎修改指针指向的内存,以避免出错或内存问题。对于指向字符串的双重指针,修改指针本身会导致指向新字符串,需要注意内存管理。处理指向结构体或数组的指针参数时,则需要仔细检查指针类型和边界以避免越…

    2025年12月18日
    000
  • 如何用c语言函数指针求一维数组最大值教程

    函数指针的灵活应用:利用比较函数寻找数组最大值。首先,定义比较函数类型 CompareFunc,再编写比较函数 compareMax(a, b)。findMax 函数接受数组、数组大小和比较函数参数,使用比较函数循环比较数组元素找到最大值。这种方法代码可复用性强,体现高阶编程思想,有利于解决更复杂问…

    2025年12月18日
    000
  • c语言函数指针作为返回值怎么用

    函数指针可以作为返回值,实现根据不同输入返回不同函数的机制。通过定义函数类型并根据选择返回相应的函数指针,可以实现动态调用函数,增强代码的灵活性。但要注意函数指针类型的定义、异常处理和内存管理,以确保代码的稳健性。 C语言函数指针返回值:玩转代码的终极奥义 你是否想过,函数也能像变量一样,被当作返回…

    2025年12月18日
    000
  • c语言函数库在什么位置?c语言函数库怎么添加?

    C语言函数库是一个包含各种函数的工具箱,这些函数被组织在不同的库文件中。添加函数库需要通过编译器的命令行选项来指定,例如 GCC 编译器使用 -l 选项,后跟库名的缩写。如果库文件不在默认搜索路径下,则需要使用 -L 选项指定库文件路径。库有静态库和动态库之分,静态库在编译时直接链接到程序中,而动态…

    2025年12月18日
    000
  • c语言函数返回指针输出的什么

    C语言函数返回指针输出一个内存地址,其指向内容取决于函数内部的操作,可能指向局部变量(需谨慎,函数结束后内存已释放)、动态分配的内存(需用malloc分配,free释放)、或全局变量。 C语言函数返回指针:迷雾中的指针 你问C语言函数返回指针输出什么?这问题问得妙啊,表面简单,实则暗藏玄机,牵扯到内…

    2025年12月18日
    000
  • 爱心代码编程c语言公式分享

    用C语言绘制爱心最常见的方法是利用数学公式,核心是找到描述心形曲线的数学方程。例如,一个常用的参数方程为:x = 16 sin(t)^3,y = 13 cos(t) – 5 cos(2 t) – 2 cos(3 t) – cos(4 * t)。通过参数t的变化,可…

    2025年12月18日
    000
  • c语言函数返回值类型由什么决定

    函数返回值类型由函数定义时指定的返回类型决定,常见类型包括 int、float、char 和 void(表示不返回任何值)。返回值类型与函数体中实际返回的值必须一致,否则会引发编译器错误或不可预测的行为。返回指针时,必须确保指针指向有效内存,否则可能导致段错误。处理返回值类型时,需要考虑错误处理和资…

    2025年12月18日
    000
  • c语言函数指针详解怎么写 c语言函数指针写法教程

    函数指针是指向函数的指针,可实现代码灵活性。其声明语法为:typedef 返回值 (*函数指针类型)(参数类型1, 参数类型2, …); 常见应用包括回调函数和函数表。使用时应注意指针有效性和类型匹配,否则可能导致崩溃或错误。熟练运用函数指针可提升代码效率和优雅性。 函数指针:C语言的灵…

    2025年12月18日
    000
  • c语言函数调用的三种方式是哪三种?

    C语言函数调用有三种方式:直接调用(编译器嵌入函数地址)、指针调用(通过指针间接调用)和函数指针调用(将函数指针作为参数传递)。 C语言函数调用的三种方式?这个问题问得有点太表面了,其实背后藏着不少门道。简单来说,就是直接调用、指针调用和函数指针调用。但这只是最粗浅的分类,真正理解还得深入到内存模型…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信