线性表
线性表的定义和操作
-
线性表的定义:具有相同数据类型n(n>=0)个数据元素的有限序列,其中n为表长,当n=0时为空表。
- L=(a1,a2.......an)L = (a_{1}, a_{2}.......a_{n})L=(a1,a2.......an) 为线性表的一般表达式
- a1{a_{1}}a1 是唯一的第一个元素(表头元素);除去第一个元素外,每个元素有且仅有一个直接前驱
- an{a_{n}}an 是唯一的最后一个元素(表尾元素);除去最后一个元素外,每个元素有且仅有一个直接后继
- L=(a1,a2.......an)L = (a_{1}, a_{2}.......a_{n})L=(a1,a2.......an) 为线性表的一般表达式
-
线性表性质:
- 个数有限
- 各元素排序有先后顺序
- 每个元素都是单个元素
- 每个元素数据类型相同,既存储空间相同
- 元素具有抽象性,既仅讨论元素的逻辑关系
-
线性表的基本操作:增、删、查、改、插
顺序表
-
顺序表的定义:用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
- 第一个元素的起始位置是 NNN
- 第iii个元素的位置是 N+i×xN+i\times xN+i×x, 其中xxx是顺序表中一个元素所占的存储空间
- 不用想那么多,就是很类似数组
-
静态分配和动态分配(以下为伪代码)
/*静态分配*/ # define MaxSize 50 typedef struct{ ElemType data[MaxSize]; //顺序表的元素 int Length; //顺序表的当前长度 }Sqlist; // 顺序表的类型定义 /*动态分配*/ # define InitSize 100 //表长度的初始定义 # define MaxSize 50 typedef struct{ ElemType *data; //指定动态分配数指针 int Length; //数组的最大容量和当前个数 }Sqlist; //动态分配数组顺序表的类型定义 L.data = new ElemType(IninSize) //C++的初始动态分配语句
-
顺序表的基本实现:
-
插入
# define MaxSize 50 顺序表最大存储 bool ListInsert(Sqlist &L, int i, ElemType e) //待插入顺序表、 待插入位置、 待插入元素 { if(i<1||i>L.length+1) //插入位置不合法,小于1或者大于顺序表的大小 { return false; } if(L.length>=Maxsize) //超出最大存储 { return false } for(int j = L.length; j>=i; j--) //数据向后挪动,空出第i个位置 { L.data[j] = L.data[j-1]; } L.data[i-1] = e; //将元素e放到第i个位置(数组从0开始) return true; } // 考虑 e 在表尾插入时的数据移动(最好情况) // 考虑 e 在表头插入时的数据移动(最坏情况) // 得出时间复杂度(空间复杂度呢?)
-
删除
# define MaxSize 50 顺序表最大存储 bool ListDelet(Sqlist &L, int i, ElemType &e) //待删除顺序表、 待删除位置、 返回删除元素 { if(i<1||i>L.length+1) //删除位置是否合法,小于1或者大于顺序表的大小 { return false; } e= L.data[i-1] ; //记录待删除的,第i个元素 for(int j = i; j<L.lenght; j++) //数据向前挪动,填补第i个位置 { L.data[j-1] = L.data[j]; } L.length--; //删除了元素,顺序表的总长度减1 return true; } // 考虑删除表尾数据时的数据移动(最好情况) // 考虑删除表头数据时的数据移动(最坏情况) // 得出时间复杂度(空间复杂度呢?)
-
查找
# define MaxSize 50 顺序表最大存储 bool LocateElem(Sqlist L, ElemType e) //顺序表、 待查找元素 { for(int i = 0; i<L.lenght; i++) { if(L.data[i] == e) { return i+1; } } return 0; } // 考虑查找元素在表头情况(最好情况) // 考虑查找元素在表尾情况(最坏情况) // 得出时间复杂度(空间复杂度呢?)
-