什么是 C 中的数据结构以及如何使用它们?
已发表: 2021-02-26目录
介绍
首先,数据结构是在一个名称或标题下保存在一起的数据项的集合,是一种存储和组合数据的特定方式,以便可以有效地使用数据。
类型
数据结构在几乎每个软件系统中都很普遍并使用。 一些最常见的数据结构示例是数组、队列、堆栈、链表和树。
应用
在设计编译器、操作系统、制作数据库、人工智能应用程序等方面。
分类
数据结构分为两类:原始数据结构和非原始数据结构。
1. Primitive:它们是编程语言支持的基本数据类型。 这种分类的一个常见示例是整数、字符和布尔值。
2. 非原始:这些数据结构类别是使用原始数据结构创建的。 示例包括链接堆栈、链接列表、图形和树。

数组
数组是具有相同数据类型的数据元素的简单集合。 这意味着整数类型的数组只能存储整数值。 数据类型 float 的数组可以存储与 float 数据类型相对应的值,仅此而已。
存储在数组中的元素可以线性访问,并且存在于可以使用索引引用的连续内存块中。
声明一个数组
在 C 中,数组可以声明为:
数据类型名称[长度];
例如,
国际订单[10];
上面的代码行创建了一个由 10 个内存块组成的数组,其中可以存储一个整数值。 在 C 中,数组索引值从 0 开始。因此索引值的范围是 0 到 9。如果我们想要访问该数组中的任何特定值,我们只需键入:
printf(order[index_number]);
声明数组的另一种方法如下:
data_type array_name[size]={值列表};
例如,
整数标记[5]={9, 8, 7, 9, 8};
上面这行命令创建了一个包含 5 个内存块的数组,每个内存块的值都是固定的。 在 32 位编译器上,int 数据类型占用的 32 位内存为 4 个字节。 因此,5 个内存块将占用 20 个字节的内存。
初始化数组的另一种合法方法是:
整数标记 [5] = {9 , 45};
此命令将创建一个由 5 个块组成的数组,最后 3 个块的值为 0。
另一种合法的方式是:
整数标记 [] = {9, 5, 2, 1, 3,4};
C 编译器知道只需 5 个块即可将这些数据放入一个数组中。 因此它将初始化一个大小为 5 的名称标记数组。
类似地,可以通过以下方式初始化二维数组
整数标记[2][3]={{9,7,7},{6,2,1}};
上面的命令将创建一个 2 行 3 列的二维数组。
阅读:数据结构项目的想法和主题
运营
可以对数组执行一些操作。 例如:
- 遍历数组
- 在数组中插入一个元素
- 在数组中搜索特定元素
- 从数组中删除特定元素
- 合并两个数组,
- 对数组进行排序——按升序或降序。
缺点
分配给数组的内存是固定的。 这实际上是一个问题。 比如说,我们创建了一个大小为 50 的数组,并且只访问了 30 个内存块。 剩下的 20 个块占用内存没有任何用处。 因此,为了解决这个问题,我们有一个链表。
链表
链表,非常像数组串行存储数据。 主要区别在于它不会一次存储所有内容。 而是在需要时存储数据或使内存块可用。 在链表中,块分为两部分。 第一部分包含实际数据。

第二部分是指向链表中下一个块的指针。 指针存储下一个保存数据的块的地址。 还有一个称为头指针的指针。 head 指向链表中的第一块内存。 以下是链表的表示。 这些块也称为“节点”。
资源
初始化链表
为了初始化链接列表,我们创建了一个结构名称节点。 结构有两点。 1. 它保存的数据和 2. 指向下一个节点的指针。 指针的数据类型将是结构的数据类型,因为它指向结构节点。
结构节点
{
整数数据;
结构节点*下一个;
};
在链表中,最后一个节点的指针不会指向任何东西,或者简单地说,将指向 null。
另请阅读:数据结构中的图
链表遍历
在链表中,最后一个节点的指针不会指向任何东西,或者简单地说,它会指向 null。 因此,为了遍历整个链表,我们创建了一个初始指向头部的虚拟指针。 并且,对于链表的长度,指针继续向前移动,直到它指向 null 或到达链表的最后一个节点。
添加节点
在特定节点之前添加节点的算法如下:
- 设置两个最初指向 head 的虚拟指针(ptr 和 preptr)
- 移动 ptr 直到 ptr.data 等于我们打算插入节点之前的数据。 preptr 将是 ptr 后面的 1 个节点。
- 创建节点
- 虚拟 preptr 指向的节点,该节点的 next 将指向这个新节点
- 新节点的 next 将指向 ptr。
在特定数据之后添加节点的算法将以类似的方式完成。
链表的优点
- 与数组不同的动态大小
- 在链表中执行插入和删除操作比在数组中更容易。
队列
队列遵循先进先出或 FIFO 类型的系统。 在数组实现中,我们将有两个指针来演示 Queue 的用例。
资源
FIFO基本上意味着首先进入堆栈的值,首先离开数组。 在上面的队列图中,指针 front 指向值 7。如果我们删除第一个块(dequeue),front 现在将指向值 2。同样,如果我们输入一个数字(入队),比如 3 in位置 5。然后,后指针将指向位置 5。
上溢和下溢条件
然而,在将数据值输入队列之前,我们必须检查溢出情况。 当尝试将元素插入已满的队列时,将发生溢出。 当尾部 = max_size–1 时,队列将满。
同样,在从队列中删除数据之前,我们应该检查下溢情况。 当尝试从已经为空的队列中删除元素时,将发生下溢,即如果front = null 且rear = null,则队列为空。
堆
栈是一种数据结构,我们只在一端插入和删除元素,也称为栈顶。 因此,堆栈实现被称为后进先出 (LIFO) 实现。 与队列不同,对于堆栈,我们只需要一个顶部指针。

如果我们想在数组中输入(推入)元素,顶部指针将向上移动或递增 1。如果我们要删除(弹出)一个元素,顶部指针将递减 1 或向下 1 个单位。 堆栈支持三种基本操作:push、pop 和 peep。 窥视操作只是显示堆栈中的最顶部元素。
资源
从世界顶级大学在线学习软件课程。 获得行政 PG 课程、高级证书课程或硕士课程,以加快您的职业生涯。
结论
在本文中,我们讨论了 4 种类型的数据结构,即数组、链表、队列和堆栈。 希望您喜欢这篇文章,并继续关注更多有趣的阅读。 直到下一次。
如果您有兴趣了解有关 Javascript、全栈开发的更多信息,请查看 upGrad 和 IIIT-B 的全栈软件开发执行 PG 计划,该计划专为工作专业人士设计,提供 500 多个小时的严格培训,9 个以上的项目和任务、IIIT-B 校友身份、实用的实践顶点项目和顶级公司的工作协助。
什么是编程中的数据结构?
数据结构是我们在程序中排列数据的方式。 两个最重要的数据结构是数组和链表。 数组是最熟悉的数据结构,也是最容易理解的。 数组基本上是相关项目的编号列表。 它们易于理解和使用,但在处理大量数据时效率不高。 链表更复杂,但如果使用得当,它们会非常有效。 当您必须在大列表中间添加或删除项目时,或者当您需要在大列表中搜索项目时,它们是不错的选择。
链表和数组有什么区别?
在数组中,索引用于访问元素。 数组中的元素按顺序组织,如果使用索引,则可以轻松访问和修改元素。 数组也有固定的大小。 元素是在创建时分配的。 在链表中,指针用于访问元素。 链表的元素不一定按顺序存储。 链表的大小未知,因为它可以在创建时包含节点。 指针用于访问元素,因此内存分配更容易。
C语言中的指针是什么?
指针是 C 中的一种数据类型,它存储任何变量或函数的地址。 它通常用作对另一个内存位置的引用。 指针可以保存数组、结构、函数或任何其他类型的内存地址。 C 使用指针向函数传递值和从函数接收值。 指针用于动态分配内存空间。