线性表的定义
定义 线性表是具有相同的数据类型的n(n >= 0)个数据元素的有限序列,当n=0时线性表为一个空表 用L表示线性表则 L = (a1,a2,a3,…,an a1为表头元素,an为表尾元素 a1无直接前驱,an无直接后继 特点 表中元素个数有限 表中元素具有逻辑上的顺序,表中元素有先后次序 表中元素都是数据元素 表中元素的数据类型都相同,每个元素占的空间大小一致 要点 数据项、数据元素、线性表的关系
线性表由若干个数据元素组成,而数据元素又由若干个数据项组成,数据项是数据的不可分割的最小单位。
其中姓名,学号等就是数据项
线性表的顺序表示 顺序表的定义 顺序表是指用一组地址连续的存储单元依次存储信息表中的数据元素,从而使得逻辑相邻的两个元素在物理位置上也相邻
预先定义(为了代码可以运行)
#defineTrue1#defineFalse0#defineOK1#defineERROR0#defineINFEASIBLE-1#defineOVERFLOW-2typedefintStatus;
1 2 3 4 5 6 7 第n个元素的内存地址表示为
LOC(A) + (n-1)*sizeof(ElemType) 1 假定线性表的元素类型为ElemType,则线性表的顺序存储类型描述为
typedefintElemType ; #defineMaxSize50typedefstruct{ ElemTypedata[MaxSize]; intlength; }
SqList; 1 2 3 4 5 6 一维数组可以是静态分配的,也可以是动态分配的。静态分配后大小和空间都固定了,下面使用动态分配的形式
typedefintElemType ; #defineInitSize100//表长度的初始大小定义 #define ListIncreasement 10 //线性表存储空间的分配增量 typedef struct { ElemType *data; int MaxSize,length; }SeqList;
1 2 3 4 5 6 7 8 顺序表的初始化 顺序表的初始化,&是C++的引用,可以使用指针代替
StatusInitList(SeqList&L){ L.data= (ElemType*) malloc(InitSize*sizeof(ElemType)); if(!L.data) exit(OVERFLOW);//存储分配失败 L.length = 0; L.MaxSize = InitSize; return OK; }
1 2 3 4 5 6 7 顺序表的插入 在顺序表L的第i(1<= i <= L.length +1)个位置插入新元素 e,需要将第 n 个至第 i (共 n-i+1)个元素向后移动一个位置 【最后一个到倒数第n-i+i个元素向后移动一位】。
StatusListInsert(SeqList&L,inti , ElemTypee){ ElemType*newbase; if(i<1||i>L.length+1)//判断i是否合法 return ERROR; if(L.length >= L.MaxSize){ //当前存储空间已满,可直接返回false newbase = (ElemType *)realloc(L.data,(L.MaxSize+ListIncreasement)*sizeof(ElemType)); if(!newbase){//存储分配失败 exit(OVERFLOW); } L.data = newbase; //新基址 L.MaxSize += ListIncreasement; } //移动元素 for(int j = L.length; j>=i ;j--){ L.data[j] = L.data[j-1]; } L.data[i-1] = e;//插入e L.length++;//增加长度 return OK; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 最好情况:在表尾插入,时间复杂度为O(1)
最坏情况:在表头插入,时间复杂度为O(n)
平均情况:假设Pi(Pi=1/(n+1))是在第i个位置上插入一个节点的概率,则平均移动次数为
∑i=1n+1pi ( n−i+1 ) =∑i=1n+11n+1 ( n−i+1 ) =1n+1n ( n+1 ) 2=n2\sum_{i=1}^{n+1}p_i(n-i+1)=\sum_{i=1}^{n+1}\frac{1}{n+1}(n-i+1)=\frac{1}{n+1}\frac{n(n+1)}{2}=\frac{n}{2} i=1∑n+1pi (n−i+1)=i=1∑n+1n+11 (n−i+1)=n+11