(B站青岛大学-王卓老师,数据结构与算法基础听课笔记!!!!!)
一、线性表
1、线性表的定义和特点:线性表是具有相同特性的数据元素的一个有限序列
线性表例子:26个英文字母组成的英文表
2、案例引入:稀疏多项式的运算
可以表示为:线性表A=((7,0),(3,1),(9,8),(5,17))
举个栗子:对线性表A=((7,0),(3,1),(9,8),(5,17)),
线性表B=((8,1),(22,7),(-9,8))进行求和
可以通过创建一个新的数组C进行求和(如下图所示),
但是有个问题,数组C创建多大合适呢?
(顺序存储结构存在问题:存储空间分配不灵活,运算的空间复杂度高)
那不妨试试--链式存储结构(如下图所示)
3、线性表的类型定义
```javascript
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,compare())
初始条件:线性表L已经存在,compare()是数据元素判定函数
操作结果:返回L中第一个与e满足compare()的数据元素的位序,若这样的元素不存在则返回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的长度加一
ListDelete(&L,i,&e)
初始条件:线性表L已经存在,1<=i<=ListLength(L)
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减一
ListTraverse(&L,visited())
初始条件:线性表L已经存在
操作结果:依次对线性表中每个数据元素调用visited()
4、线性表的顺序表示和实现
在计算机内,线性表有两种基本存储结构:顺序存储结构和链式存储结构
线性表的顺序表示又称为顺序存储结构或顺序映像
顺序存储定义:把逻辑上相邻的数据元素存储在物理上相邻的存储单元中的存储结构
线性表顺序存储结构占用一片连续的存储空间,知道某个元素的存储位置就可以计算其他元素的位置。
#define LIST_INIT_SIZE 100 //线性表存储空间的初始分配量
typedef struct{
ElemType elem[LIST_INIT_SIZE];
int length;//当前长度
}SqList;//顺序表类型定义
补充一下在接下来学习中可能会遇到的C++相关的知识
1、cout << argc << endl; 是C++中的输出语句,用于将变量argc的值输出到控制台
cout 相当于 printf()是输出函数;
cout<<endl是使程序输出结束(有使输出结果换行的功能)
2、什么是指针?(就是存储地址)
int i = 1;
int *j = &i; //定义指针变量j,取出i的地址给j
3、引用:(相当于给变量取了个别名)
int i = 1;
int &j = i; //定义引用j,并且把i绑定给j,则相当于j是i的另一个名字,两者等价
---->举个栗子吧!!!!
#include<iostream.h>
void main() {
int i = 5;
int &j = i;
i = 7;
cout << "i = " << i << "j = " << j;
}
//输出结果都为7,j是一个引用类型,代表i的一个替代名,i值改变时,j值也跟着改变,所以会输出i-7,j=7
4、#include<iostream.h>是在旧的标准C++中使用。
在新标准中,用#include<iostream>,iostream 的意思是输入输出流。
#include<iostream>是标准的C++头文件,