-
数据结构,直白地理解,就是研究数据的存储方式。数据结构是学习数据存储方式的一门学科,
- 数据结构大致包含以下几种存储方式:
1、线性表,还可细分为顺序表、链表、栈和队列;
2、树结构,包括普通树,二叉树,线索二叉树等;
3、图存储结构;
- 数据结构大致包含以下几种存储方式:
-
数据存储结构的选择取决于两方面,即数据的逻辑结构和存储结构(又称物理结构)。
- 数据的逻辑结构,简单地理解,就是指的数据之间的逻辑关系。
1、线性表用于存储具有“一对一”逻辑关系的数据;
2、树结构用于存储具有“一对多”关系的数据;
3、图结构用于存储具有“多对多”关系的数据;
- 数据的逻辑结构,简单地理解,就是指的数据之间的逻辑关系。
-
存储结构(物理结构)
-
指的是数据在物理存储空间上选择集中存放还是分散存放。
如果选择集中存储,就使用顺序存储结构;反之,就使用链式存储。至于如何选择,主要取决于存储设备的状态以及数据的用途。
如果后期需要对数据进行大量的检索(遍历),就选择集中存储;反之,若后期需要对数据做进一步更新(增加或删除),则选择分散存储。 -
在数组中实现插入、删除等功能时,需要调整太多,例如删除第一个元素,需要将表中所有元素前移一个位置。因此插入与删除的运行时间是如此的慢以及表的大小必须事先已知。为了避免插入、删除,允许表可以不连续存储,因此链表就显的很重要。
要了解链表,必须明白结构体与指针。关于指针见另一篇文章,这里着重说一下指针函数与函数指针的区别,以免老是分不清。
a、指针函数,简单的来说,就是一个返回指针的函数,其本质是一个函数,而该函数的返回值是一个指针。
b、函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
void (*fun)(void); //*这个就是一个函数指针了,函数的参数为空*
void (*fun)(int); //这个也是一个函数指针,函数参数有个int
- 逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着。恰恰相反,数据随机分布在内存中的各个位置,这种存储结构称为线性表的链式存储。
- 由于分散存储,为了能够体现出数据元素之间的逻辑关系,每个数据元素在存储的同时,要配备一个指针,用于指向它的直接后继元素,即每一个数据元素都指向下一个数据元素(最后一个指向NULL(空))。
- 链表中数据元素的构成
每个元素本身由两部分组成:1、本身的信息,称为“数据域”; 2 、指向直接后继的指针,称为“指针域”。- 这两部分信息组成数据元素的存储结构,称之为“结点”。n个结点通过指针域相互链接,组成一个链表。
由于每个结点中只包含一个指针域,生成的链表又被称为 线性链表 或 单链表。
链表中存放的不是基本数据类型,需要用结构体实现自定义:
typedef struct Link{
char elem; //代表数据域
struct Link * next; //代表指针域,指向直接后继元素
}link
http://data.biancheng.net/