前言
数据结构篇---C语言实现数据结构
C语言的基础知识:数组 函数 结构体 指针 动态内存分配。
顺序表
从数据结构的角度看待数组
int arr[10];
数组是一个基本的数据结构吗?
这里以一维数组为例。
从数据来看:这个数组存储10个整型数据。
从结构上:数据在内存中连续存储,地址随下标增加而增大。
所以数组也是一个数据结构。
顺序表的概念
顺序:按照一定的顺序,连续。
表:集合,相同事物的集合体。
连续,相同事物?这也符合数组的概念。那么顺序表和数组有什么关系呢?
顺序表底层就是数组,你认为顺序表就是数组也没问题。
已经有数组了为什么单独引入顺序表这个数据结构?
学了数组你能实现以下简单的操作
1.修改数组元素的数据。
2.排序。调用qsort函数,或者独立实现一种排序算法
3.数组传参。
4.用数组下标或者指针访问某个元素。
那么以下的操作你可曾实现过?
1.在数组的某个位置插入某个数据。
2.删除数组某个位置的数据。
3.查找数组中的某个数据。
很遗憾,数组并没有很简单的功能实现这些操作,初学时我们要自己用循环实现。
但我们如今开始学习数据结构了,顺序表就实现了这些算法。
顺序表提供了很多现成的的方法,数组要操作可能需要操作者自己实现的代码,顺序表已经实现了代码,可以立即使用。
结论:顺序表是数组的plus版。
线性表
下面挖掘一下广度。顺序表也只是一棵树的枝叶,我们要对他进行溯源,就是下面的线性表。
我们拆分一下这个词,线性表。
线性:即直线。具有直线的性质,直线是逻辑上的直线,不是物理上的直线。线性表的数据,一定对外表现出一条直线,(我们观察到的)。物理上指内存上的存储,即数据在内存存储是否为一条直线(连续存储)不关心。
表:集合。
线性表是一个(逻辑)线性结构的集合。
顺序表在逻辑上是线性的,所以顺序表是一种线性表。
顺序表在内存空间也是连续的,但线性表不要求空间连续。
那么是线性表但空间上不连续,又是什么数据结构呢?这里留个悬念。
总结:
线性表 逻辑上:线性(连续);物理结构(可连续可不连续)。
顺序表 逻辑上:线性;物理结构 连续。
顺序表的分类
顺序表分为静态顺序表和动态顺序表。
1.静态顺序表
前面说过顺序表的概念了。
限定条件:静态,意味着固定了,不变。
数组在创建时元素个数确定了,这个数组就固定了,称为定长数组。
虽然数组总的元素大小固定,但这数组每个元素不一定全部存入有效的数据,引入size记录有效数据的个数。
因此这里给出静态顺序表的定义:
#define MAX 100 //宏定义明示常量
typedef int SLDataType;//方便替换类型,比如你要存放double类型,只需把int更改为double
typedef struct seqlist {
SLDataType arr[MAX];//定长数组
int size;//记录当前的有效数据
}SL;
2.动态顺序表
限定条件:动态