数据结构第二章笔记

第二章线性表本章的基本内容是:
线性表的逻辑结构
线性表的顺序存储及实现
线性表的链接存储及实现
顺序表和单链表的比较
线性表的其他存储及实现学生成绩登记表
学号 姓 名 数据结构 英语 高数
0101 丁一 78 96 87
0102 李二 90 87 78
0103 张三 86 67 86
0104 孙红 81 69 96
0105 王冬 74 87 66
职工工资登记表
职工号 姓 名 基本工资 岗位津贴 奖金
0101 丁一 278 600 200
0102 李二 190 300 100
0103 张三 186 300 100
0104 孙红 218 500 200
0105 王冬 190 300 100
数据元素之间的关系是什么?
线性表( Linear List )的定义
线性表:简称表,是n(n≥0)个具有相同类型的数据元素的有限序列。
线性表的长度:线性表中数据元素的个数。空表:长度等于零的线性表,记为:L=( )。
非空表记为:L=(a1, a2 , …, ai-1, ai , …, an)
其中,ai(1≤i≤n)称为数据元素;下角标 i 表示该元素在线性表中的位置或序号。
线性表的图形表示
线性表(a1, a2 , …, ai-1, ai , …, an)的图形表示如下:

2.1 线性表的逻辑结构线性表的特性
1.有限性:线性表中数据元素的个数是有穷的。
2.相同性:线性表中数据元素的类型是同一的。
3.顺序性:线性表中相邻的数据元素ai-1和ai之间存在
序偶关系(ai-1, ai),即ai-1是ai的前驱, ai是ai-1的后继; a1 无前驱,an无后继,其它每个元素有且仅有一个前驱和一个后继。

线性表的抽象数据类型定义
ADT List
Data
线性表中的数据元素具有相同类型,相邻元素具有前驱和后继关系
Operation
InitList
前置条件:表不存在输入:无功能:表的初始化输出:无后置条件:建一个空表
线性表的抽象数据类型定义
DestroyList
前置条件:表已存在输入:无功能:销毁表输出:无
后置条件:释放表所占用的存储空间
Length
前置条件:表已存在输入:无功能:求表的长度
输出:表中数据元素的个数后置条件:表不变
线性表的抽象数据类型定义
Get
前置条件:表已存在输入:元素的序号i
功能:在表中取序号为i的数据元素
输出:若i合法,返回序号为i的元素值,否则抛出异常后置条件:表不变
Locate
前置条件:表已存在输入:数据元素x 功能:在线性表中查找值等于x的元素输出:若查找成功,返回x在表中的序号,否则返回0 后置条件:表不变
线性表的抽象数据类型定义
Insert
前置条件:表已存在输入:插入i;待插x 功能:在表的第i个位置处插入一个新元素x 输出:若插入不成功,抛出异常
后置条件:若插入成功,表中增加一个新元素
Delete
前置条件:表已存在输入:删除位置i
功能:删除表中的第i个元素
输出:若删除成功,返回被删元素,否则抛出异常后置条件:若删除成功,表中减少一个元素
线性表的抽象数据类型定义
Empty
前置条件:表已存在输入:无功能:判断表是否为空输出:若是空表,返回1,否则返回0 后置条件:表不变
PrintList
前置条件:表已存在输入:无功能:遍历操作,按序号依次输出表中元素输出:表的各数据元素后置条件:表不变 endADT
进一步说明:
(1) 线性表的基本操作根据实际应用而定;
(2) 复杂的操作可以通过基本操作的组合来实
现;
– 假设利用两个线性表LA和LB分别表示两个集合A和 B(即:线性表中的数据元素即为集合中的成员),现要求一个新的集合A=AUB:
Get(one from B)-Locate(in A)-Insert(to A)?

(3) 对不同的应用,操作的接口可能不同。
– 删除表中的值为x的元素
– 删除表中的第i个元素

顺序表——线性表的顺序存储结构例:(34, 23, 67, 43)
34 23 67 43 4
用一段地址连续的存储单元存储要点依次存储线性表中的数据元素
顺序表——线性表的顺序存储结构例:(34, 23, 67, 43)
用什么属性来描述顺序表?
存储空间的起始位置
顺序表的容量(最大长度)
顺序表的当前长度
线性表的顺序存储结构——顺序表例:(34, 23, 67, 43)
34 23 67 43 4
如何实现顺序表的内存分配?顺序表 一维数组
顺序表
一般情况下,(a1,a2,…, ai-1,ai , …, an)的顺序存储:
0 … i-2 i-1 … n-1 Max-1

Loc(a1) Loc(ai)
如何求得任意元素的存储地址?
顺序表
一般情况下,(a1,a2,…, ai-1,ai , …, an)的顺序存储:
0 … i-2 i-1 … n-1 Max-1

Loc(a1) Loc(ai)
Loc(ai)=Loc(a1) + (i -1)×c
随机存取:在O(1)时间内存取数据元素存储结构和存取结构
存储结构是数据及其逻辑结构在计算机中的表示;存取结构是在一个数据结构上对查找操作的时间性能的一种描述。
“顺序表是一种随机存取的存储结构”的含义为:在顺序表这种存储结构上进行的查找操作,其时间性能为O(1)。
const int MaxSize=100; template //模板类 class SeqList
{
顺序表类的声明 T Get(int i); public:
SeqList( ) ; //构造函数 SeqList(T a[ ], int n); ~SeqList( ) ; //析构函数 int Length( ){return length;}
int Locate(T x );
void Insert(int i, T x); T Delete(int i);
void PrintList(); private:
T data[MaxSize];
int length;
};
顺序表的实现——无参构造函数
操作接口:SeqList( )

data	length

算法描述:
template SeqList:: SeqList( )
{ length=0;}
顺序表的实现——有参构造函数操作接口:SeqList(T a[ ], int n)

顺序表的实现——有参构造函数
算法描述:
template
SeqList::SeqList(T a[ ], int n)
{
if (n>MaxSize) throw “参数非法”; for (i=0; i<n; i+ +) data[i]=a[i];
length=n;
}
顺序表的实现——按位查找操作接口: T Get(int i)

算法描述:
template 时间复杂度?
T SeqList::Get( int i )
{ if (i>=1 && i<=length) return data[i-1]; }
顺序表的实现——按值查找操作接口: int Locate(T x )
例:在(35, 33, 12, 24, 42)中查找值为12的元素,返回在表中的序号。
注意序号和下标之间的关系

顺序表的实现——按值查找算法描述:
template
int SeqList::Locate(T x)
{ for (i=0; i<length; i++)
if (data[i]==x) return i+1; return 0;
}
时间复杂度?
顺序表的实现——遍历算法描述:
template void SeqList::PrintList()
{ for (i=0; i<length; i++)
cout<<data[i]; }
时间复杂度?
顺序表的实现——插入
操作接口: void Insert(int i, T x) 插入前:(a1, … , ai-1, ai, … , an) 插入后:(a1, … , ai-1, x , ai, … , an)
ai-1和ai之间的逻辑关系发生了变化

顺序存储要求存储位置反映逻辑关系

存储位置要反映这个变化
顺序表的实现——插入
例:(35,12,24,42),在i=2的位置上插入33。
0 1 2 3 4
a1
35 a2
1233 a3
1224 a4
2442 42 4
5

33
什么时候不能插入? 注意边界条件
表满:length>=MaxSize
合理的插入位置:1≤i≤length+1(i指的是元素的序号)
顺序表的实现——插入算法描述——伪代码

  1. 如果表满了,则抛出上溢异常;
  2. 如果元素的插入位置不合理,则抛出位置异常;
  3. 将最后一个元素至第i个元素分别向后移动一个位置;
  4. 将元素x填入位置i处;
  5. 表长加1;
    顺序表的实现——插入
    算法描述——C++描述 基本语句?
    template void SeqList::Insert(int i, T x)
    {
    if (length>=MaxSize) throw “上溢”; if (i<1 | | i>length+1) throw “位置”; for (j=length; j>=i; j–) data[j]=data[j-1];
    data[i-1]=x; length++;
    }
    顺序表的实现——插入
    时间性能分析
    最好情况( i=n+1):
    基本语句执行0次,时间复杂度为O(1)。最坏情况( i=1):基本语句执行n次,时间复杂度为O(n)。
    顺序表的实现——插入
    时间性能分析
    平均情况(1≤i≤n+1):
    n+1 n 
    顺序表的实现——删 除操作接口: T Delete(int i) 删除前:(a1, …, ai-1,ai,ai+1,…,an) 删除后:(a1,…,ai-1,ai+1, …,an)
    ai-1和ai之间的逻辑关系发生了变化

顺序存储要求存储位置反映逻辑关系

存储位置要反映这个变化顺序表的实现——删除例:(35, 33, 12, 24, 42),删除i=2的数据元素。
0 1 2 3 4
a1
35 a2
1233 a3
2412 a4
2442

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值