数据结构和算法不仅是数学意义上的问题描述、建模和求解,停留在“纸面上”,更是需要结合计算机硬件特性和编程语言本身特点去真正实现,最终形成一个完整的可执行程序,解决实际的问题。

C语言+数据结构+算法=C语言程序。编程过程中,对于一个真实的问题,编程解决步骤是:

第1步:分析问题,

第2步:找到数学方法“纸面上”解决它,也就是找到“算法”,(关键---思考算法)

第3步:选择合适的数据结构存放数据,实现“算法”,

第4步:选择编程语言,编写可执行的代码,实现数据结构和算法。

基本概念

# 数据结构概念

指相互之间存在一种或多种关系的数据元素的集合,使用集合二元组来描述有两个要素部分,分别是数据元素集合、数据元素关系集合。

数据结构完整描述可以分为逻辑结构和存储结构,逻辑结构描述本质上的关系,存储结构是根据计算机和编程语言特点实现关系,一种逻辑结构可以有多种存储结构实现,同样,一种存储结构可以被用于实现多种逻辑结构。

# 逻辑结构分类

逻辑结构对应数据结构中数据元素的关系,简单可以分为集合、线性、树型、图状四类。

  • - 集合:最松散的关系,相当于空关系,只要数据元素取值属于同一个集合即可。
  • - 线性:一对一关系,数据元素逻辑上结构是排列的一条“线”,有先后次序。
  • - 树型:一对多关系,存在一个父亲结点和多个孩子结点,逻辑上是一颗“树”。
  • - 图状:多对多关系,数据元素可以有任意的对应关系,形似一张“网图状”。
# 存储结构分类

存储结构是数据结构的逻辑结构在计算机中的物理实现表示,因此也可以称为物理结构,简单分为2大类:

  • - 顺序存储方式:数据按照顺序在内存中存放,数据的逻辑顺序和计算机物理内存地址顺序对应,C语言实现可以使用数组、动态内存分配的顺序表表示。
  • - 链式存储方式:数据可以在内存中随机存放,同时数据结点中通过一个指针将数据按照逻辑顺序串接起来,例如链表。
# 算法
  • - 算法是对特定问题的求解步骤的描述,是通用的数学意义上的问题求解。
  • - 程序是算法在计算机中的一种实现,需要使用特定的编程语言和计算机指令。
  • - 算法常见时间复杂度大小关系:O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n),其中O(1)表示常量时间,和问题规模无关。
  • - 算法空间复杂度:是指算法需要除数据元素之外的辅助空间大小,O(1)表示只需要固定的辅助空间,和问题规模无关,原地工作。
# 对比理解

1.逻辑结构和存储结构:数据结构的两个重要方面,一种逻辑结构可以有多种存储结构实现,存储结构实现和计算机硬件特性、编程语言特性相关,不同的存储结构实现,其数据结构最终的处理效率是不同的,各有优劣。

2.数据结构和算法:这两个概念也是密切相关,算法是对问题的求解,必然涉及到数据处理,因此需要选择数据结构存放数据。使用不同的数据结构直接影响算法对于问题的处理效率。一个可以用计算机解决的实际问题,需要同时选择一个合适的算法和数据结构,最终形成完整的可执行程序。

3.数据结构作用主要是处理数据,因此基本上每种数据结构都需要提供增加、修改、删除、查询、显示数据等通用功能,根据数据结构的具体存储结构,其实现的过程和效率均不相同。

常用的数据结构

# 线性表

线性表是最简单的一种数据结构,具有相同类型的数据元素组成的序列。顺序表、链表是其两种简单实现。

:数组也可以算一种简单的线性表。

链表可以分为:

  • - 带头结点的简单链表
  • - 不带头结点的简单链表
  • - 静态链表
  • - 循环链表
  • - 双向链
# 栈

限定增加和删除数据操作只能在线性表的末端进行,因此是一种受限的特殊线性表。

实现方式有:

  • - 顺序栈
  • - 链栈

栈典型的特点是:数据“后进先出”,栈可以用来实现递归。栈数据结构的主要操作是出栈、入栈。

# 队列

限定增加数据元素在线性表的末端,删除数据元素在线性表的始端。

实现方式有:

  • - 顺序队列
  • - 循环队列
  • - 链队列
  • - 双端队列

队列典型的特点是:数据“先进先出”,队列使用常见是日常各种“排队”。队列的主要操作包括入队、出队。

# 数组

最常用最简单的数据结构。C语言内置数组结构,特点是长度固定,无法动态增加数组长度,数据元素在内存是顺序存放,可以使用数组下标直接访问。

数组典型使用在数学的矩阵运算处理上。

# 字符串

计算机很重要的应用是非数值对象的处理,也就是字符串的处理。字符串,就是由零或多个字符串组成的序列。字符串可以定长数组顺序表示、动态分配堆存储表示、块链表示。

字符串数据结构在文本处理、编程语言编译、搜索等非数值计算应用广泛。重要的应用算法是字符串的模式匹配算法。

# 树

树是一种非线性数据结构,描述一对多关系,例如组织架构、族谱等。数据元素分为父亲结点和孩子结点,一个父亲结点可以有多个孩子结点,但是一个孩子结点有且只有一个父亲结点。

树型数据结构常用有:二叉树、满二叉树、完全二叉树、线索二叉树、平衡二叉树。存储结构实现包括顺序存储、二叉链表、三叉链表等。其中二叉树数据结构最重要的操作是遍历,分为先序、中序、后序、层次遍历四种。

树型数据结构常用算法应用包括:最优二叉树、哈夫曼编码。

# 图

数据元素之间的关系是任意的,任意两个元素都可以有关系。图状数据结构可以分为有向图、无向图、完全图、网(边上带权的图)。

图的存储结构常用表示有:邻接矩阵、邻接表、十字链表、邻接多重表。图状数据结构重要操作是遍历,主要分为广度和深度优先遍历。

图状数据结构常用算法应用包括:最小生成树、最短路径。

# 查找表

查找表是同种数据元素的集合,数据元素之间没有关系,仅仅是属于同一集合。查找表主要操作是查询和检索。

查找表数据结构可以分为静态查找表、动态查找表、哈希表。

其中静态查找表包括:

  • - 顺序表
  • - 有序表(折半查找)
  • - 静态树表
  • - 索引顺序表

动态查找表包括:

  • - 平衡二叉树
  • - B树
  • - B+树
  • - 键

哈希表:非常重要好用的数据结构,核心思想是将关键字和物理存储位置建立对应关系,直接根据关键字即可定位到数据。

# 排序算法

排序是各类数据结构通用的操作,数据进行排序后,方便查找和处理。常用的有12个排序算法。

总结

以上是C语言常用的数据结构,基本上都需要学习了解,特别是线性表、栈、队列是C语言初学者必须掌握的数据结构。

---------- End ----------