一、线性表
1. 定义
是一个有限序列,表中各个元素是相继排列的,且每两个相邻元素之间都有直接前驱和直接后继的逻辑关系,是一种逻辑结构
一个线性表是 N 个具有相同特性的数据元素的有限序列
元素之间的关系是一对一的关系,除了第一个元素和最后一个元素之外,其他的元素都是首尾相连(适用于大部分的线性表)
a( i-1 ) 是 a( i ) 的直前驱元素
a( i+1 ) 是 a( i ) 的直后继元素
2. 特点
-
存在唯一的第一个元素和最后一个元素
-
除第一个元素外,其他元素有且仅有一个直接前驱(第一个元素没有直接前驱)
-
除最后一个元素外,其他元素有且仅有一个直接后继(最后一个元素没有直接后继)
-
线性表中的每一个元素都具有相同的数据类型,且不能按子表那样再分割
color = {'red','orange','yellow','green','blue','black'} score = {'667','664','659','662','610','632','651'}
3. 基本操作
-
InitList (&L)
操作结果:构造一个空的线性表L
'SqList:是结构体' int initList(SqList *L){ L->length = 0; return 1; }
-
printList (L)
操作结果:打印一个顺序表,方便测试操作是够正确
'SqList:是结构体' int printList(SqList L){ if(L.length == 0){ print("链表为空\n"); return 0; } int i; for(i = 0 ; i < L.length ; i++){ print("data[%d] = %d\n" , i , L,data[i]); } print("\n"); return 1; }
-
gerlength (L)
操作结果:获取顺序表的长度
'SqList:是结构体' int getlength(SqList L){ return L.length; }
-
createList (&L,int length)
操作结果:创建一个顺序表,每个元素的值随机赋值
'SqList:是结构体' int createList(SqList *L,int length){ srand(time(0)); '随机赋值' int i; for(i = 0 ; i < length ; i++){ L -> length++; } return 1; }
-
inserList (&L,int pos,ElemType elem)
操作结果:在指定位置处插入一个新的元素
int insertList(SqList *L,int pos,ElemType elem){ int i; if(pos < 1 || pos > L -> length){ print("插入的位置有误,无法插入数据\n"); retuen 0; } for(i = L -> length-1 ; i >= pos-1 ; i--){ L -> data[i+1] = L -> data[i]; } L -> data[pos-1] = elem; L -> lengrh++; return 1; }
-
locateElem (L,ElemType e)
操作结果:查找在线性表中时候含有指定元素
int locateElem(SqList L,ElemType e){ int i; for(i = 0 ; i < L.length ; i++){ if(L.data[i] == e){ pring("在pos[%d]位置处,查找到了元素elem:%d\n",i + 1,e); return 1; } } return 0; }
4. 练习
1.线性表是具有n个( C )的有限序列 A. B. C.数据元素 D. 2.以下( B )是一个线性表 A.由n个实数组成的集合 --> 指的是集合,集合中各元素没有前后驱关系 B.由100个字符组成的序列 C.所有整数组成的序列 --> 有限序列 D.邻接表 --> 邻接表属于存储结构 3.在线性表中,除开始元素外,每个元素( A ) A.只有唯一的前驱元素 B.只有唯一的后继元素 C.有多个前驱元素 D.有多个后继元素 4.假设利用两个线性表LA和LB分别表示两个集合A和B,现要求一个新的集合A = A ∪ B。这就要求对线性表作如下操作:扩大线性表LA,将存在线性表LB中而不存在于线性表LA中的数据元素插入到LA中去。只要从线性表LB中依次取得每个数据元素,并依值在线性表LA中进行查访,若不存在,则插入之。 答: void union(List &LA, List LB){ LA_len = ListLength(LA); LB_len = ListLength(LB); for(i = 1 ; i <= LB_len ; i++){ GetElem(LB,i,e); if(!LocateElem(LA,e,equal)ListInsert(LA,++LA_len,e)); } }