对比王道每年的书,暂时没有发现较大的出入之处,在自己电脑用dec++敲下相关章节的基本代码,保存在本站做个记录。
InitList(&L)//初始化,构造空的线性表、
Length(L)// 表长,数据元素个数
LocateElem(L,e)//按值查找
GetElem(L,i) //按位查找
ListInsert(&L,i,e)//插入操作
ListDelete(&L,i,&e)//删除i位置的元素,并用e返回。
Printlist(L)//按前后顺序输出表中的元素
Empty(L) //判空操作,返回布尔
DestroyList(&L) //销毁并释放空间
线性表顺序存储类型描述 结构化定义 线性表元素类型 ElemType
#define MaxSize 50 //定义线性表最大长度
typedef struct{ //结构化定义
ElemType data[MaxSize]; //顺序表的元素
int length; //顺序表的当前长度
}sqList; //顺序表的类型定义
线性表动态分配
#define InitSize 100 //表长度的初始定义
typedef struct{
ElemType *data; //动态分布的数组指针
int MaxSize,Length; //数组最大容量和当前个数
}Seqlist; //动态分配数组顺序表的类型定义
c的初始动态分配语句
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize)
c++的动态分配
L.data=new ElemType[InitSize]
顺序表插入操作
bool ListInsert(SqList &L,int i,ElemType e){//将e插入到L顺序表的第i位置
if(i<1||i>L.length+1)
return false;
if(L.length>=MaxSize)
return false;//以上都是判断
for(int j=L.length;j>=i;j--)//注意for循环规则
L.data[j]=L.data[j-1];//i后的元素后移一位
L.data[i-1]=e;//数组 故要i-1
L.length++;
return true;
}/*L.length是位序 而L.data是数组 */
最好情况:表尾插入i=n+1 ,不执行语句 O(1)
最坏情况:表头插入i=1 ,n 条语句执行,O(n)
平均情况:插入一个结点的概率,p=i/(n+1) 平均移动次数 n/2. O(n)
删除操作 删除第i位置的元素
bool ListDelete(Sqlist &L,int i,Elemtype &e) {
if(i<1||i>L.length)
return false;
e=L.data[i-1] ;
for(int j=i;j<=L.length;j--)
L.data[j-1]=L.data[j];
L.length--;
return true;
}
最好情况:表尾删除i ,不移动 O(1)
最坏情况:表头删除,需要移动n-1个元素,时间复杂度O(n)
平均情况:删除一个结点的概率,p=1/n 移动次数 n-i 平均移动次数 n-1/2. O(n)
按值顺序查找
查找e,并返回其位序
思想:数组循环遍历,返回i+1 位序
int LocateElem(SqList L,ElemType e){
int i;
for(i=0;i<=L.length;i++)
if(L.data[i]=e);
return i+1;
return 0;
}
最好情况:表头i ,一次就好 O(1)
最坏情况:表尾,需要比较n个元素,时间复杂度O(n)
平均情况:查找一个结点的概率,p=1/n 查找次数 i 平均查找次数 n+1/2. O(n)