再学数据结构之顺序表(一)

本文回顾了作者从大学到工作后重新学习数据结构的过程,详细介绍了数据结构的基本概念,包括线性结构、树结构、图结构等,并重点讲解了顺序表的概念、特征及定义方式。

  上大学的时候还比较年少轻狂,不了解行情!所以一些基础学科没有认真学习,期中考试考数据结构,只考了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:动态生成顺序表与静态定义一个顺序表的本质区别:占据内存空间的位置不同。  静态定义的顺序表所占用的内存空间开辟在内存的静态区,即函数栈上,这个区域的内存空间会随着函数调用的完成而被系统自动回收。而动态生成的顺序表,其内存开辟在内存的动态区,即堆内存上,这个区域的内存空间不会被系统回收,需要程序去释放它。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值