数据结构学习笔记

第一章绪论

1.1基本概念和术语

数据:是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。

数据元素:是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。在有些情况下,数据元素也称为元素、记录等。

数据项:是组成数据元素的、有独立含义的、不可分割的最小单位。

数据对象:是性质相同的数据元素的集合,是数据的一个子集。

1.2数据结构

数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。(数据结构包括逻辑结构和存储结构两个层次)

1.逻辑结构:是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。

四种结构:(1)集合结构(2)线性结构(3)树结构(4)图结构或网状结构

2.存储结构:数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构和链式存储结构。

(1)顺序存储结构。(2)链式存储结构。

1.2.3 数据类型和抽象数据类型

1.数据类型

2.抽象数据类型:一般指由用户定义的、表示应用问题的数学模型,以及定义在这个模型上的一组操作的总称,具体包括三部分:数据对象、数据对象上关系的集合以及对数据对象的基本操作的集合。

ADT 抽象数据类型名{

数据对象:〈数据对象的定义〉

数据关系:〈数据关系的定义〉

基本操作:〈基本操作的定义〉 }ADT 抽象数据类型名

1.4 算法和算法分析

1.4.1 算法的定义及特性

算法(Algorithm)是为了解决某类问题而规定的一个有限长的操作序列。

特性:(1)有穷性;(2)确定性;(3)可行性;(4)输入;(5)输出;

1.4.2 评价算法优劣的基本标准

(1)正确性;(2)可读性;(3)健壮性;(4)高效性;

1.4.3 算法的时间复杂度

一条语句的重复执行次数称作语句频度;

算法分析的两个主要方面是分析算法的时间复杂度和空间复杂度,以考察算法的时间和空间效率。一般情况下,鉴于运算空间较为充足,故将算法的时间复杂度作为分析的重点。算法执行时间的数量级称为算法的渐近时间复杂度,T(n)=O(f(n)),它表示随着问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,简称时间复杂度。

4.最好、最坏和平均时间复杂度

1.4.4 算法的空间复杂度

关于算法的存储空间需求,类似于算法的时间复杂度,我们采用渐近空间复杂度(Space Complexity)作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模n的函数,记作:S(n)=O(f (n))

第二章线性表

2.1 线性表的定义和特点

定义:由n(n≥0)个数据特性相同的元素构成的有限序列称为线性表。

特点:

(1)存在唯一的一个被称作“第一个”的数据元素;

(2)存在唯一的一个被称作“最后一个”的数据元素;(3)除第一个之外,结构中的每个数据元素均只有一个前驱;

(4)除最后一个之外,结构中的每个数据元素均只有一个后继。

2.2 线性表的类型定义

线性表是一个相当灵活的数据结构,其长度可根据需要增长或缩短,即对线性表的数据元素不仅可以进行访问,而且可以进行插入和删除等操作。

ADT List{

数据对象:

数据关系:

基本操作:

InitList(&L)

操作结果:构造一个空的线性表L。

DestroyList(&L)

初始条件:线性表L已存在。

操作结果:销毁线性表L。

ClearList(&L)

初始条件:线性表L已存在。

操作结果:将L重置为空表。

ListEmpty(L)

初始条件:线性表L已存在。

操作结果:若L为空表,则返回true,否则返回false。

ListLength(L)

初始条件:线性表L已存在。

操作结果:返回L中数据元素个数。

GetElem(L,i,&e)

初始条件:线性表L已存在,且1≤i≤ListLength(L)。

操作结果:用e返回L中第i个数据元素的值。

LocateElem(L,e)

初始条件:线性表L已存在。

操作结果:返回L中第1个值与e相同的元素在L中的位置。若这样的数据元素不存在,则返回值为0。

PriorElem(L,cur_e,&pre_e)

初始条件:线性表L已存在。

操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回其前驱,否则操作失败,pre_e无定义。

NextElem(L,cur_e,&next_e)

初始条件:线性表L已存在。

操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回其后继,否则操作失败,next_e无定义。

ListInsert(&L,i,e)

初始条件:线性表L已存在,且1≤i≤ListLength(L)+1。

操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1。 ListDelete(&L,i)

初始条件:线性表L已存在且非空,且l≤i≤ListLength(L)。

操作结果:删除L的第i个数据元素,L的长度减1。

TraverseList(L)

初始条件:线性表L已存在。

操作结果:对线性表L进行遍历,在遍历过程中对L的每个结点访问一次。 }ADT List

2.3.1 线性表的顺序存储表示

线性表的顺序表示指的是用一组地址连续的存储单元依次存储线性表的数据元素,这种表示也称作线性表的顺序存储结构或顺序映像.

特点:逻辑上相邻的数据元素,其物理次序也是相邻的。

2.3.2 顺序表中基本操作的实现

1.初始化

顺序表的初始花操作就是构造一个空的顺序表。

算法步骤:

① 为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。

② 将表的当前长度设为0。

2.取值

取值操作是根据指定的位置序号i,获取顺序表中第i个数据元素的值。由于顺序存储结构具有随机存取的特点,可以直接通过数组下标定位得到,elem[i-1]单元存储第i个数据元素。

算法步骤:

① 判断指定的位置序号i值是否合理(1≤i≤L.length),若不合理,则返回ERROR。

② 若i值合理,则将第i个数据元素L.elem[i-1]赋给参数e,通过e返回第i个数据元素的传值。

3.查找

查找操作是根据指定的元素值e,查找顺序表中第1个与e相等的元素。若查找成功,则返回该元素在表中的位置序号;若查找失败,则返回0。

算法步骤:

① 从第一个元素起,依次和e相比较,若找到与e相等的元素L.elem[i],则查找成功,返回该元素的序号i+1。

② 若查遍整个顺序表都没有找到,则查找失败,返回0。

4.插入

线性表的插入操作是指在表的第i个位置插入一个新的数据元素e,使长度为n的线性表’变成长度为n+1的线性表

算法步骤:

① 判断插入位置i是否合法(i值的合法范围是1≤i≤n+1),若不合法则返回ERROR。

② 判断顺序表的存储空间是否已满,若满则返回ERROR。

③ 将第n个至第i个位置的元素依次向后移动一个位置,空出第i个位置(i=n+1时无需移动)。

④ 将要插入的新元素e放入第i个位置。

⑤ 表长加1。

5.删除

线性表的删除操作是指将表的第i个元素删去,将长度为n的线性表‘变成长度为n−1的线性表

算法步骤:

① 判断删除位置i是否合法(合法值为1≤i≤n),若不合法则返回ERROR。

② 将第i+1个至第n个的元素依次向前移动一个位置(i=n时无需移动)。

③ 表长减1。

2.4线性表的链式表示和实现

2.4.1 单链表的定义和表示

线性表链式存储结构的特点是:用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)

2.4.2 单链表基本操作的实现
1.初始化

单链表的初始化操作就是构造一个空表。

算法步骤:

① 生成新结点作为头结点,用头指针L指向头结点。

② 头结点的指针域置空。

2.取值

和顺序表不同,链表中逻辑相邻的结点并没有存储在物理相邻的单元中,这样,根据给定的结点位置序号i,在链表中获取该结点的值不能像顺序表那样随机访问,而只能从链表的首元结点出发,顺着链域next逐个结点向下访问。

算法步骤:

① 用指针p指向首元结点,用j做计数器初值赋为1。

② 从首元结点开始依次顺着链域next向下访问,只要指向当前结点的指针p不为空(NULL),并且没有到达序号为i的结点,则循环执行以下操作:·p指向下一个结点;·计数器j相应加1。

③ 退出循环时,如果指针p为空,或者计数器j大于i,说明指定的序号i值不合法(i大于表长n或i小于等于0),取值失败返回ERROR;否则取值成功,此时j=i时,p所指的结点就是要找的第i个结点,用参数e保存当前结点的数据域,返回OK。

3.查找

链表中按值查找的过程和顺序表类似,从链表的首元结点出发,依次将结点值和给定值e进行比较,返回查找结果。

算法步骤:

① 用指针p指向首元结点。

② 从首元结点开始依次顺着链域next向下查找,只要指向当前结点的指针p不为空,并且p所指结点的数据域不等于给定值e,则循环执行以下操作:p指向下一个结点。

③ 返回p。若查找成功,p此时即为结点的地址值,若查找失败,p的值即为NULL。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值