线性表
我是说明==
工作考研狗复习而已,平常写的都是java,突然转c有点懵,写的也可能不规范。有错大家指正,玻璃心别喷我!!!!后期可能会整理黑皮书java版的算法与数据结构
声明:不会解释基础概念,想看自己百度或者自己买书
复习资料(部分非全名)为:
《王道数据结构》
清华大学出版社《数据结构(C语言版)》严蔚敏 吴伟民编著
知识是有价的,这只是我的整理资料,需要好好复习或学习的自己买书!!!
多好的书!!!一定要买它!!买它!!买它!!
一、线性表的类型和定义
1.线性表抽象类型定义
ADT List{
数据对象:D={ai | ai ∈ ElementSet, i = 1,2,...,n,n≥0}
数据关系:R1={<ai-1,ai>|ai,ai∈ D,i = 2,...,n}
基本操作:
InitList(&L)
操作结果:构造一个空的线性表;
DestoryList(&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中数据元素个数;
LocateElem(L,e,compare())
初始条件:线性表L已存在,compare()是数据元素判定函数;
操作结果:返回L中第1个与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的长度+1
ListDelete(&L,i,&e)
初始条件:线性表L已存在且非空,1≤i≤ListLength(L);
操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1
ListTraverse(L,visit())
初始条件:线性表L已存在;
操作结果:依次对L的每个数据元素调用函数visit(),一旦visit()失败,则操作失败
} ADT List
例2-1 合并A,B两个线性表,生成一个新表A
时间复杂度 O(ListLength(LA) X ListLength(LB))
题目 假设利用两个线性表LA和LB分别表示两个集合A和B(即线性表中的数据元素即为集合中的成员),现要求一个新的集合A= A∪B.
分析 则需要如下操作:
1.扩大线性表LA
2.将存在于线性表LB中而不存在与线性表LA中的插入到线性表LA中去
只要从线性表LB中依次取得每个数据元素,并依值在线性表LA中进行查访,若不存在,则插入
void union(List &La,List Lb) {
//将所有在线性表Lb中但不在La中的数据元素插入到La中
//线性表LA的长度
La_len = ListLength(La);
//线性表LB的长度
Lb_len = ListLength(Lb);
//只要从线性表LB中依次取得每个数据元素,并依值在线性表LA中进行查访,若不存在,则插入
for(i=1;i<=Lb_len;i++){
//获取Lb中第i个数据元素赋给e
GetElem(Lb,i,e);
//遍历La,若La中不存在和e相同的数据元素,则插入之
if(!LocateElem(La,e,equal))ListInsert(La,++La_len,e);
}
}
例2-2 合并A.B生成有序表C
时间复杂度为 O(ListLength(LA) + ListLength(LB))
题目 已知线性表LA和LB中的数据元素按值非递减有序排列,现要求将LA和LB归并为一个新的线性表LC,且LC中的元素仍按值非递减有序排列。
分析 LC中的数据元素或是LA中的数据元素,或是LB中的数据元素,则只要先设LC为空表,然后将LA或LB中的元素逐个插入到LC中
操作 为使LC中元素按值非递减有序排列,可设两个指针i和j分别指向LA和LB中某个元素。
//书上的代码,但作为工作狗的我。。。感觉需要给LA和LB加个判定。。。那个非空注释。。emmm。。。
void MergeList(List La,List Lb,List &Lc){
//已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列;
//构造一个新的空表Lc
InitList(Lc);
//定义变量i,j,k
i = j = 1;
k = 0;
//线性表LA的长度
La_len = ListLength(La);
//线性表LB的长度
Lb_len = ListLength(Lb);
while((i <= La_len)&&(j<= Lb_len)){//La 和 Lb均非空
//获取La中第i个数据元素赋给ai
GetElem(La,i,ai);
//获取Lb中第j个数据元素赋给bj
GetElem(Lb,j,bj);
//判断插值
if(ai<= bj) {
ListInsert(Lc,++k,ai);
++i;
}else{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<= La_len){
//获取La中第i个数据元素赋给ai
GetElem(La,i,ai);
ListInsert(Lc,++k,ai);
}
while(j<= Lb_len){
//获取Lb中第j个数据元素赋给bj
GetElem(Lb,j,bj);
ListInsert(Lc,++k,bj);
}
}
加了判定非空的
void MergeList(List La,List Lb,List &Lc){
//已知线性表La和Lb中的数据元素按值非递减排列
//归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列;
//构造一个新的空表Lc
InitList(Lc);
//定义变量i,j,k
i = j = 1;
k = 0;
if(ListEmpty(La) || ListEmpty(Lb)){
prinf("Error,list is empty");
exit;
}else{
//线性表LA的长度
La_len = ListLength(La);
//线性表LB的长度
Lb_len = ListLength(Lb);
while((i <= La_len)&&(j<= Lb_len)){//La 和 Lb均非空
//获取La中第i个数据元素赋给ai
GetElem(La,i,ai);
//获取Lb中第j个数据元素赋给bj
GetElem(Lb,j,bj);
//判断插值
if(ai<= bj) {
ListInsert(Lc,++k,ai);
++i;
}else{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<= La_len){
//获取La中第i个数据元素赋给ai
GetElem(La,i,ai);
ListInsert(Lc,++k,ai);
}
while(j<= Lb_len){
//获取Lb中第j个数据元素赋给bj
GetElem(Lb,j,bj);
ListInsert(Lc,++k,bj);
}
}
}