顺序表和线性表的算法补充(个人复盘)

这篇具有很好参考价值的文章主要介绍了顺序表和线性表的算法补充(个人复盘)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、顺序表

1)有序表的归并---1
将两个均为升序线性表 la lb合并成一个新的升序线性表lc
算法的基本思想:先设lc为空表然后按从头到尾顺序对la lb中的当前元素ab进行比较将较小者插到lc的表尾

步骤:

1)  设置两个指针i j分别为la lb中当前进行比较的元素ab的位序ij的初值均为1,再设置指针k表示lc的表尾位置初值为  

2) 元素 a b 比较后 将较小者 插入 lc 同时应后移 较小者所在线性表 la lb 指针 i j
3) 当一个表的所有元素均已 插入 lc 另一个表尚有残尾 应将其接到 lc 之后
代码:
void MergeList (List La , List Lb , List &Lc )  {
     //将两个均为升序表 la 、lb 归并为新的升序表lc 
     InitList(Lc);  i=1;   j=1 ;   k=0 ; 
     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尚有剩余元素(残尾)
      { GetElem( La , i++ , ai ) ; 
        ListInsert( Lc , ++k_, ai ) ; }        
       while (j<= Lb_len )  // Lb尚有剩余元素(残尾)
      { GetElem( Lb , j++ , bj ) ;
        ListInsert( Lc , ++k_, bj ) ; 
      }
 } 
(2)线性表的顺序存储结构的优缺点和归并算法
优点: 无须为表示结点间的逻辑关系而增加额外的 存储空间 ;
            可以方便的随机存取表中的任一结点。
缺点: 插入和删除运算不方便,需移动大量元素;
           由于要求占用连续的存储空间,存储分配只 能按最大存储空间预先进行,致使存储空间不能得到充分利用; 表的容量难以扩充。
(2-1)有序顺序表的归并: 已知顺序线性表La和Lb的元素按值非递减排列
void MergeList_Sq (SqList La , SqList Lb , SqList &Lc )  {
  //将两个均为升序顺序表La、Lb 归并为新的升序顺序表Lc 
  pa= La.elem;      pb= Lb.elem; 
  Lc.listsize= Lc.length= La.length +Lb.length;
  pc=Lc.elem=(ElemType*)malloc(Lc.listsize  *sizeof(ElemType));
  if(! Lc.elem)exit(OVERFLOW);
  pa_last=La.elem+La.length-1;
  pb_last=Lb.elem+Lb.length-1;
   while ( pa<= pa_last ) &&( pb<= pb_last ) 
      { if(*pa<=*pb) *pc++=*pa++; else *pc++ = *pb++; } 
  while ( pa<= pa_last ) *pc++ = *pa++; 
  while ( pb<= pb_last ) *pc++ = *pb++; }// MergeList_Sq 

二、单链表相关

1.L为带头结点的单链表头指针,当i元素存在时,其值赋给e 

Status GetElem_L(LinkList L,int i,ElemType &e){
      
//L为带头结点的单链表的头指针
   p=L->next;     j=1;
   while ( p && j < i) { 
//顺指针向后查找,直到P指向   

                                      //i个数据元素或p为空 。         

      p = p->next ;    ++j;  }
    if ( !p ||
j > i ) return ERROR; //i个数据元素不存在
    e = p->data;     //取第i个数据元素

   return OK;
}
//GetElem_L

2.带头结点的单链线性表L中第i个位置之前插入元素e 

Status ListInsert_ L(LinkList &L, int i, ElemType e) {
//在带头结点的单链线性表L中第i个位置之前插入元素e
p = L;   j = 0;
while ( p &&  j <  i-1 )  { p =p -> next;  ++ j; }
              //寻找第i-1个结点
if ( !p || j  > i- l ) return ERROR;  //不存在第i个元素
s = (LinkList) malloc ( sizeof (LNode));
s -> data = e;    s -> next = p -> next;
p -> next = s;
return OK;
} // LinstInsert_L

3.带头结点的单链线性表L中,删除第i个元素,并由e返回 

Status ListDelete_ L(LinkList &L, int i, ElemType &e) {
//在带头结点的单链表L中,删除第i个元素,并由e返回其值
      p=L;     j = 0;
      while(p -> next & & j < i- 1) {
              //寻找第i个结点,并令P指向其前驱
         p = p->next;     ++ j;    }
    if ( ! (p -> next) ||  j > i-1 ) return ERROR
    q = p -> next;      p -> next = q -> next;
    e = q -> data;      free(q);
    return OK;
}  // ListDelete_ L

4.已知单链线性表La和Lb的元素按值非递减排列,归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列  

注意:LaLbLc不可移动; 不可释放La 头结点操作的结果仅保存链表Lc,而两操作链表不复存在 

viod MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc)

 {  pa=La->next;   pb=Lb->next;

     Lc=pc=La;  // La 的头结点作为Lc 的头结点

     while(( pa != NULL ) && ( pb != NULL ))

          if ( pa->data < pb->data )
              { pc->next =pa;  pc=pa;  pa=pa->next; }

          else { pc->next =pb; pc=pbpb=pb->next; }

      pc->next = pa pa pb//插入残尾

      free (Lb) ; //释放Lb的头结点

} // MergeList_L  文章来源地址https://www.toymoban.com/news/detail-740316.html

到了这里,关于顺序表和线性表的算法补充(个人复盘)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • <数据结构>顺序表和链表的比较|缓存命中率

    💭前言:通过之前对顺序表和链表的实现,我们可以发现在增删查改某些操作上两者的效率前言有所差异,本篇文章将总结二者的异同。 顺序表的实现 http://t.csdn.cn/Lxyg2 单链表的实现 http://t.csdn.cn/rHgjG 双链表的实现 http://t.csdn.cn/j3amO 📚顺序表通过数组来实现的,所以在物理

    2024年02月05日
    浏览(50)
  • 【数据结构.C】顺序表和单链表的增删查改

    宝子,你不点个赞吗?不评个论吗?不收个藏吗? 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要。 目录 单链表增删查改 c1.h sqlist.c number.c 单链表的增删查改  c1.h stuscore.c c1.h sqlist.c number.c  c1.h stuscore.c   宝子,你不点

    2024年02月11日
    浏览(110)
  • 【数据结构篇C++实现】- 线性表 - 顺序表和链表

    友情链接:C/C++系列系统学习目录 故事导入: 幼儿园放学时,一个班级的小朋友,一个跟着一个排队出校,有一个打头,有一个收尾,当中的小朋友每一个都知道他前面和后面的一个是谁,就如同一根线把他们串联了起来。如此具有像线一样的性质的表就叫线性表 线性表(

    2024年02月07日
    浏览(54)
  • 【玩转408数据结构】线性表——双链表、循环链表和静态链表(线性表的链式表示 下)

            在前面的学习中,我们已经了解到了链表(线性表的链式存储)的一些基本特点,并且深入的研究探讨了单链表的一些特性,我们知道,单链表在实现插入删除上,是要比顺序表方便的,但是,单链表中每个结点仅存在一个指针指向其后续结点,那么如果我们想要找

    2024年04月10日
    浏览(57)
  • 【玩转408数据结构】线性表——线性表的顺序表示(顺序表)

            通过前文,我们了解到线性表是具有相同数据类型的有限个数据元素序列;并且,线性表只是一种逻辑结构,其不同存储形式所展现出的也略有不同,那么今天我们来了解一下线性表的顺序存储——顺序表。         顺序表指的是将 逻辑上相邻的元素 存储在 物理位

    2024年02月19日
    浏览(51)
  • 线性表的顺序存储实现

    线性表的顺序存储及基本操作的实现 线性表(List)是由同类型数据元素构成有序序列的线性结构,用户处理线性表数据时常常需要初始化、查找、插入、删除、计算数据长度等操作。 线性表还包含以下几个要素: 表中元素个数称为线性表的 长度 ; 线性表没有元素时,称为

    2024年01月19日
    浏览(30)
  • 线性表的顺序存储结构

    一、线性表的定义      线性表:是具有相同数据类型的n(n=0)个数据元素的有限序列,其中n为表长,当n=0时,线性表是一个空表。    记作   ( a1, ..., ai, ai+1, ..., an )   其中ai是线性表中的数据元素, n是表的长度    存在唯一的一个被称做“第一个”的数据元素 (如a1 )

    2024年02月01日
    浏览(34)
  • 顺序表和链表对应的经典算法

    目录 一,移除元素 二,合并两个有序数组 三,环形链表的约瑟夫问题 四,链表的中间节点 五,合并两个有序链表 六,反转链表 七,移除链表元素 一,移除元素 思路:定义一个循环遍历数组,如果遇到的不是val就记录下来这个元素,如果不是就跳过 定义两个指针,一个用

    2024年02月21日
    浏览(37)
  • 数据结构(六)——线性表的顺序实现

    🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉 在csdn获奖荣誉: 🏆csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣⁣ 💓csdn2023年后端赛道第第七 ⁣⁣⁣⁣ ⁣⁣⁣⁣

    2024年01月25日
    浏览(62)
  • 查找:线性表的C语言代码实现(顺序查找、折半查找)

    一、线性表结构 两个类的定义 二、线性表的初始化以及根据输入的元素建立线性表 1.线性表的初始化,初始化一个空的线性表 2.根据用户需求,向线性表中添加元素  三、顺序查找  Search1函数(没有设置哨兵,需要比较两次) 四、顺序查找(设置哨兵,不用再比较是否会越

    2024年02月09日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包