数据结构(C语言)线性表(顺序表)

首先线性表的基本函数:

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++ ; }  
	} 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值