上大学的时候还比较年少轻狂,不了解行情!所以一些基础学科没有认真学习,期中考试考数据结构,只考了18分(100分的卷子),期末狂刷课后题,才拿到了70多分,后来一直到毕业,也没再认真学过数据结构。现在毕业3个多月了,人也成熟了一些,觉得数据结构和算法是硬功夫,所以又开始好好学习了。就边看书边记录一些基础点吧!也算是督促自己。
第一天开始,就简单点吧!
那么问题来了,什么是数据结构呢。
数据结构:是指计算机内部数据的组织形式和存储方法,主要包括:线性结构、树结构、图结构。其中,线性结构是最常用也是最简单的一种数据结构,所谓线性结构主观上来讲,就是一张有限的一维数表。具体来讲,它主要包括:顺序表、链表、栈、队列等。其中顺序表和链表是从物理结构上区分的。而栈和队列,是从逻辑功能上区分的。这也就是说,顺序表和链表是线性数据结构的基础,队列和栈是基于顺序表和链表的。 另外一些时候,数据之间并不是一对一的关系,而存在着“一对多”,“多对多”的关系,这就形成了树结构和图结构。例如:人工智能领域常用“博弈树”,数据挖掘和商业智能中使用“决策树”,多媒体技术中常用“哈夫曼数”;比较复杂的多对多的数据关系呢,图结构就派上用场,例如:人工智能领域中的神经网络系统,贝叶斯网络都是应用图结构存储管理数据结构的。
顺序表:在计算机内容存储一张线性表,最简单的方法就是用一组连续地址的内存单元来存储整张线性表。这种存储结构称为顺序存储结构,这种存储结构下的线性表就叫做顺序表。一张顺序表应该包括以下特征:
1、有唯一的一个表名来标识该顺序表。
2、内存单元连续存储,也就是说,一张顺序表要占据一块连续的内存空间。
3、数据顺序存放,元素之间有先后关系。
(数组满足上述特征,所以一个数组本身就是一张顺序表。)
顺序表的定义方式:
1、静态地定义一张顺序表:
#define MaxSize 100
ElemType Sqlist[MaxSize];
int len;
其中,ElemType是指定的顺序表的类型,这里是抽象的类型描述,具体可以是int char等基本类型,也可以是其他构造类型 比如结构体类型等等。len是顺序表的长度。
当然了不能刻板的模仿,应当根据自己的需要,比如下面这种定义:
int a[1000];
是定义一个数组,但同时也静态定义了一个顺序表。不一定非要预定义MaxSize和定义变量len。
2、动态地生成一张顺序表:
#define MaxSize 100
typedef struct{
ElemType *elem;
int length;
int listsize;
} Sqlist;
void initSqlist (Sqlist *L){ /*初始化一个顺序表*/
L->elem = (int *)malloc(MaxSize*sizeof(ElemType));
if(!L->elem)
exit(0);
L->Length=0;
L->listsize=MaxSize;
}
1、定义一个类型Sqlist,它是一个结构体,成员包括:指向顺序表的首地址elem,顺序表中 表的长度(即表中元素的个数)length,顺序表的存储空间容量(占据内存大小,以sizeof(ElemType)为单位,由MaxSize规定)Listsize。
2、通过调用一个函数initSqlist()实现动态生成一张顺序表,函数initSqllist()的参数是 一个Sqlist类型的指针变量,因此可以在函数initSqlist()中直接对顺序表进行操作。
函数initSqlist()的作用是动态初始化一个顺序表,其步骤如下:
1、调用了C标准库函数malloc()动态地分配一段长度为MaxSize*sizeof(ElemType)的内存空间,并将该段空间的首地址赋值给变量L的elem成员L->elem。也就是说,L——?elem指向顺序表的首单元。
2、将L->length置为0,表明此时刚生成一张空的顺序表,表里没有内容,将L->listsize置为MaxSize,表明该顺序表占据内存空间大小为MaxSize,单位是sizeof(ElemType).
这样一来,类型为Sqlist的变量L就代表了一张顺序表,其中,L->elem指向该顺序表的表头地址,L->length为该顺序表的长度,L->listsize为该顺序表的容量。
tips:动态生成顺序表与静态定义一个顺序表的本质区别:占据内存空间的位置不同。 静态定义的顺序表所占用的内存空间开辟在内存的静态区,即函数栈上,这个区域的内存空间会随着函数调用的完成而被系统自动回收。而动态生成的顺序表,其内存开辟在内存的动态区,即堆内存上,这个区域的内存空间不会被系统回收,需要程序去释放它。