文章主要是对于
数据结构与算法课程学习的读书记录
。欢迎学习交流。
[内容范围]第二章线性表-顺序表和链式表概念及其代码实现。
1 线性表的定义
线性表: n个同类型数据元素的有限序列,记为:
L= (a1,a2,…,ai,…,an)
L为表名;
i为数据元素ai 在线性表中的位序;
n为线性表的表长; n=0 时称为空表;
数据元素之间的关系是:
ai-1领先于ai,ai领先于ai+1。
称ai-1是ai的直接前驱,ai+1是ai的直接后继,
除第一元素a1外,均有唯一的前驱;
2 基于线性表的简单操作
2.1 合并线性表
算法设计:
思想:从LB中逐一取出元素,判断元素是否存在LA中,若不在则将这个元素插入到LA中
//依次从LB中取出第i个数据元素:List_Retrieve(Lb, i, &elem) →elem
//判elem是否在LA中存在:List_Locate(La,elem,&j)
//若不存在,则将elem插入到LA中:List_Insert(La,1,elem)
Status List_Union (SqListPtr La, SqListPtr Lb){
ElemType elem; /* 存放从Lb中取出的元素*/
Status status; /*状态代码*/
int i, j, len = List_Size(Lb); /*len存放Lb的元素个数*/
for (i=1; i<=len; i++){
List_Retrieve(Lb, i, &elem); /*取出Lb中第i个数据元素*/
status = List_Locate(La,elem,&j); /*判它是否在La中*/
if(status!= success){
/*如果不在*/
status = List_Insert(La,1,elem); /*插入到第一个位置*/
if(status!= success) break; /*插入失败则退出*/ }
else List_Add(La,j,1);/*La的第j个数据加1*/
}
return status;
}
2.2 合并有序表
问题:已知线性表La和Lb中的元素按照递增顺序排列,现要求将他们合并成一个新的线性表Lc,病似的Lc中元素也按照递增的顺序排列
思想:线性表Lc初始为空。依次扫描La和Lb中的元素,比较
当前元素的值,将较小值的元素插入Lc的表尾之后,如此反
复,直到一个线性表扫描完毕,然后将未完的那个线性表中
余下的元素逐个插入到Lc的表尾之后
Status List_Merge (SqListPtr La, SqListPtr Lb, SqListPtr Lc){
ElemType elem1, elem2; status = List_Init(Lc);
int i=1, j=1, k=1; /*i, j, k分别用于指示La, Lb, Lc中当前元素*/
int n = List_Size(La),m = List_Size(Lb);
while(i<=n && j<=m){
/*两个表都还未处理完*/
List_Retrieve(La,i,&elem1); List_Retrieve(Lb,j,&elem2);
if(elem1<elem2){
status = List_Insert(Lc,k,elem1); i=i+1; }
else{
status = List_Insert(Lc,k,elem2); j=j+1; }
k=k+1;
}
Status List_Merge (SqListPtr La, SqListPtr Lb, SqListPtr Lc){
…….
while(i&