您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习笔记——线性表的逻辑结构

2015-12-30 22:24 190 查看

线性表的基本特征

线性结构是一个数据元素的有序集

集合中必须存在唯一一个“第一元素”

集合中必须存在唯一一个“最后元素”

除最后元素外,均有唯一的后继

除第一个元素之外,均有唯一的前驱

基本操作

初始化操作

InitList(&L) 操作结果:构造一个空的线性表L

结构销毁操作

DestoryList(&L)

初始条件:线性表L已存在

操作结果:销毁线性表L

引用型操作(对L无修改,L前无&)

ListEmpty(L); Listlength(L);

PriorElem(L,cure_e,&pre_e);NextElem(L,cure_e,&next_e);

GetElem(L,i,&e)(按序查找);

LocateElem(L,e,compare())(按值查找);

Listtraverse(L,visit())(遍历线性表)

初始条件:线性表L已存在; visit()为某个访问函数;

操作结果:依次对L中每个元素调用函数visit()。一旦visit()失败,则遍历失败。

加工型操作(对L做了修改,&L)

ClearList(&L);PutElem(&L,i,&e);

ListInsert(&L,i,e);ListDelete(&L,i,&e);

其它更为复杂的操作往往可以拆解为以上这些基本操作

例:已知线性表LA和LB中的数据元素按值非递减有序排列。例如,设LA=(3,5,8,11) LB=(2,6,8,9,11,15,20)则 LC=(2,3,5,6,8,9,11,11,15,20)

注:若线性表中的数据元素相互之间可以比较,并且数据元素在表中依值非递减或非递增有序排列(其实就是可以存在相等的元素),即ai≥ai−1ai≥ai−1或ai≤ai−1ai≤ai−1(i=1,2,……,ni=1,2,……,n),则称该表为有序表。

拆解为基本操作:

1. 初始化LC为空表;——InitList(&L);

2. 分别从LA和LB中取得当前元素ai和bi;—— GetElem(L,i,&e);

3. 若ai≤bi,则将ai插入到LC中,否则将bi插入到LC中;——ListInsert(&L,i,e);

4. 重复2和3两步,直至LA或LB中元素被取完为止;

5. 将LA表或LB表中剩余元素复制插入到LC表中。——GetElem(L,i,&e);ListInsert(&L,i,e);

算法

void MergeList(List La, List Lb, List &Lc) {
// 已知线性表La和Lb中的元素按值非递减排列。
// 归并La和Lb得到新的线性表Lc,Lc的元素也按值非递减排列。
int La_len, Lb_len;
ElemType ai, bj;
int i=1, j=1, k=0;
InitList(Lc);
La_len = ListLength(La);
Lb_len = ListLength(Lb);
while ((i <= La_len) && (j <= Lb_len)) {  // La和Lb均非空
GetElem(La, i, ai);
GetElem(Lb, j, bj);
if (ai <= bj) {
ListInsert(Lc, ++k, ai);
++i;
} else {
ListInsert(Lc, ++k, bj);
++j;
}
}
while (i <= La_len) {// 表La非空且表Lb空
GetElem(La, i++, ai);  ListInsert(Lc, ++k, ai);
}
while (j <= Lb_len) {// 表Lb非空且表La空
GetElem(Lb, j++, bj);  ListInsert(Lc, ++k, bj);
}
} // MergeList


完整代码实现

#include"c1.h"
typedef int ElemType;
#include"c2-1.h"
#include"bo2-1.cpp"

void MergeList(SqList La,SqList Lb,SqList &Lc)
{ // 已知线性表La和Lb中的数据元素按值非递减排列。
// 归并La和Lb得到新的线性表Lc,Lc的数据元素也按值非递减排列
int i=1,j=1,k=0;
int La_len,Lb_len;
ElemType ai,bj;
InitList(Lc); // 创建空表Lc
La_len=ListLength(La);
Lb_len=ListLength(Lb);
while(i<=La_len&&j<=Lb_len) // 表La和表Lb均非空
{
GetElem(La,i,ai);
GetElem(Lb,j,bj);
if(ai<=bj)
{
ListInsert(Lc,++k,ai);
++i;
}
else
{
ListInsert(Lc,++k,bj);
++j;
}
}
while(i<=La_len) // 表La非空且表Lb空
{
GetElem(La,i++,ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len) // 表Lb非空且表La空
{
GetElem(Lb,j++,bj);
ListInsert(Lc,++k,bj);
}
}

void print(ElemType &c)
{
printf("%d ",c);
}

void main()
{
SqList La,Lb,Lc;
int j,a[4]={3,5,8,11},b[7]={2,6,8,9,11,15,20};
InitList(La); // 创建空表La
for(j=1;j<=4;j++) // 在表La中插入4个元素
ListInsert(La,j,a[j-1]);
printf("La= "); // 输出表La的内容
ListTraverse(La,print);
InitList(Lb); // 创建空表Lb
for(j=1;j<=7;j++) // 在表Lb中插入7个元素
ListInsert(Lb,j,b[j-1]);
printf("Lb= "); // 输出表Lb的内容
ListTraverse(Lb,print);
MergeList(La,Lb,Lc);
printf("Lc= "); // 输出表Lc的内容
ListTraverse(Lc,print);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: