线性结构的基本特征:
线性结构是一个数据元素的有序(次序)集 1.集合中必存在唯一的一个“第一元素”
2.集合中必存在唯一的一个 “最后元素”
3.除最后元素在外,均有 唯一的后继
4.除第一元素之外,均有 唯一的前驱
一、线性表的基本概念
线性表L是n(n≥0)个具有相同属性的数据元素a1,a2,a3,…,an组成的有限序列,其中序列中元素的个数n称为线性表的长度。
当n=0时称为空表,即不含有任何元素。
常常将非空的线性表(n>0)记作:
(a1,a2,…an)
数据元素 ai(1≦i≦n)只是一个抽象的符号,其具体含义在不同的情况下可以不同。
非空的线性表的逻辑特征:
有且仅有一个开始结点a1,它没有直接前趋,仅有一个直接后继a2;
有且仅有一个终端结点an,它没有直接后继,仅有一个直接前趋an-1;
其余结点ai(2≦i≦n-1)都有且仅有一个直接前趋ai-1和一个直接后继ai+1。
运算定义在逻辑结构上,而运算的具体实现则是在存储结构上进行的。
二、线性表的类型定义
上述问题可演绎为对线性表作如下操作:
扩大线性表LA,将存在于线性表LB中而不存在于LA中的数据元素插入到线性表LA中去。
分析:设La=(a1,…,ai,…,an)
Lb= (b1,…,bi,…,bm)
Lc= (c1,…,ck,…,cm+n)
则ck=?,k=1,2,…,m+n
分别从LA,LB中取得当前元素ai和bj;
若ai<= bj,则将ai插入到Lc 中;否则将bj插入到Lc 中。
Void MergeList(List La,List Lb,List &Lc)
//巳知线性表LA和线性表LB中的数据元素按值非递减排列
//归并LA和LB得到新的线性表LC,LC中的元素仍按值非递减排列。
InitList(Lc);
i=j=1;
k=0;
La_len=ListLength(La);
Lb_len=ListLength(Lb);
while((i<=La_len)&&(j<=Lb_len)){
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){
GetElem((La,i++,ai);
ListInsert(Lc,++k,ai);
}
while(j<=Lb_len){
GetElem((Lb,j++,bj);
ListInsert(Lc,++k,bj);
}
}
boolisEqual(List LA, List LB) {
// 若线性表LA和LB不仅长度相等,且所含数据
// 元素也相同,则返回 TRUE, 否则返回 FALSE
La_len = Listlength(LA);
Lb_len = Listlength(LB);
if ( La_len != Lb_len )
return FALSE; // 两表的长度不等
else
{
i = 1; found = TRUE;
while (i<= La_len && found ) {
GetElem(LA, i, e);
if (LocateElem(LB, e, equal( ))
i++;
else found = FALSE;
}
return found;
}
}
三、线性表类型的实现——顺序映象
—— 以x的存储位置和y的存储位置之间某种关系表示逻辑关系<x,y>
最简单的一种顺序映象方法是:
令y的存储位置和x的存储位置相邻。
在C语言中,可用下述类型定义来描述顺序表:
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef struct {
ElemType *elem;
int length;
int listsize;
}sqList;
sqList L;
在实际应用中,需要将ElemType定义成实际类型
1.线性表的初始化操作
顺序表的初始化操作:为顺序表分配一个预定义大小的数组空间,并将线性表的当前长度设为0。
Status InitList_Sq(SqList &L){
L.elem=(<