首先线性表的基本函数:
1. InitList(&L) 创建一个空的线性表L
2. DestoryList(&L) 如果线性表已经存在的话,则销毁线性表L
3.ListLength(L) 返回线性表的元素个数
4.GetList(L, i ,&e) 用e返回线性表第i个元素的值
5.LocateElem(L, e ,compare()) 返回L中第一个与e满足compare()的数据元素的位序
6.ListInsert(&L, i ,e) 在L的第i个位置上加入元素e,L的长度加1
等等........
例1:两个线性表LA和LB 创建一个新的集合A = AUB;
//2020.7.23 飞飞飞
void unoin (List &LA, List LB){
//定义一个函把A和B的并集放到A中
LA_len = ListLength(LA);
LB_len = ListLength(LB);
for(i = 0 ; i < LB_len-1 ; i++){
GetElem(L, i , e); //利用循环提取LB中的元素赋值给e
if(! LocateElem(LA, e ,equal)) //用函数来把LB的值e和LA比较 如果不相等则把e放到LA的顺序表后
ListInsert(&LA , ++LA_len, e); //注意是 ++LA_len
}
}
例2:
有两个线性表LA = (3,5,8,11), LB = (2,6,8,9,11,15,20) ,则要求LC = (2,3,5,6,8,9,11,15,20),其中线性表都是按照递增顺序排列的,实现代码为
//2020.7.23 飞飞飞
void MergeList(List LA, List LB, List &LC){
//创建一个空的线性表LC
InitList(& LC);
LA_len = Listlength(LA); LB_len = Listlength(LB);
int i =1 ,j =1;
int k = 0;
//提取LA,LB元素的单一值
while( i < = LA_len && j < = LB_len ){
GetElem(LA, i ,& ai);
GetElem(LB, j ,& bi);
if(ai<= bi) {ListInsert(LC , k++ , ai ); i = i + 1}
else
{ListInsert(LC , k++ , bi); j = j + 1;}
} //当其中的一个表没有元素的时候跳转此过程,把元素放到LC中
while(i < = LA_len) {GetElem (LA , i++ , & ai); ListInsert(LC , k++ ,ai)}
while(j < = LB_len) {GetElem (LB , j++ , & bi); LiatInsert(LC , k++ ,bi)}
}
线性表中的顺序表:
以元素在计算机内的“物理地址相邻”来表示线性表中数据元素之间的逻辑关系。
将顺序表中的第i个元素之前插入一个元素:
//2020.7.23 飞飞飞
Status ListInsert_Sq (SqList &L , int i , ElemType e){
//L表的第i个元素前加入元素e 1< = i <= L.length
if(i < 1 || i > L.length + 1) return ERROR;
if(L.length > = L.listsize){
newbase = (Elemtype *) realloc (L.elem, (L.Listsize + LISTINCREMENT) * sizeof (ElemType));
if(! newbase) exit (OVERFLOW);
L.elem = newbase;
L.listsize += LISTINCREMENT;
}
q =& L.elem[i - 1];
for(p = L.elem[L.length - 1] ; q < = p ; p--)
{
*(p + 1) = *p;
}
*q = e ;
++L.length;
return OK;
}
同理运用顺序表的知识也可以把第二个算法写一下:
//2020.7.23 飞飞飞
void MergeList_Sq(SqList LA, SqList LB , SqList &LC){
pa = LA.elem; pb = LB. elem; //分别把LA,LB两个顺序表的基址赋值
LC.Listsize = LA.length+ LB.length;
pc = LC.elem = (ElemYype *) malloc (LC.listsize* sizeof(ElemType)); //建立LC顺序表
if(! LC.elem) exit (OVERFLOW);
pa_last = pa + LA.length-1; //最后一个的位置
pb_last = pb + LB.length-1;
while(pa < pa_last && pb < pb_last)
//pa pb地址的值进行比较
{ if(*pa < = * pb){
*pc++ = *pa++ ; //赋值给LC
}
else *pc++ = *pb++ ;
}
while(pa < pa_last) { *pc++ = *pa++ ; } //进行到最后把剩下的赋值给LC
while(pb < pb_last) { *pc++ = *pb++ ; }
}