数据结构:线性表的类型定义

线性表的类型定义

线性表是最简单、也是最基本的一种线性数据结构。它有两种存储表示方法:顺序表和链表,它的主要基本操作是插入、删除和查找。

线性表是n(n>=0)个数据元素的有限序列,表中各个数据元素具有相同特性,即属同一数据对象,表中相邻的数据元素之间存在“序偶”关系。通常将线性表记做

(a1,a2, …,ai-1,ai,ai+1,…,an-1,an)

则表中ai-1领先于ai,ai领先于ai+1,称ai-1是ai的直接前驱元素,ai+1是ai的直接后继元素。当i=1,2,…,n-1时,ai有且仅有一个直接后继,当i=2,3,…,n时,ai有且仅有一个直接前驱.

线性表中的个数n(n>=0)定义为线性表的长度,n=0时称为空表。在非空表中每个数据元素都有一个确定的位置,如用ai表示数据元素,则i称为数据元素ai在线性表中的位序

特征:
1.集合中必存在唯一的一个“第一元素”。
2.集合中必存在唯一的一个 “最后元素” 。
3.除最后一个元素之外,均有唯一的后继(后件)。
4.除第一个元素之外,均有唯一的前驱(前件)。

线性表的基本操作

在应用程序中经常会用到线性表,每一个具体的应用所涉及的线性表的操作不尽相同。综合各种情况,对线性表经常进行的基本操作有:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

基本操作实例

现在我们举三个栗子来练习一下这些基本操作:

1、假设利用两个线性表 La 和 Lb 分别表示两个集合 A 和 B(线性表中的数据元素即为集合中的成员),求一个新的集合 A=AUB。

具体的操作步骤为:
(1)从线性表 Lb 中取得一个数据元素;
(2)依该数据元素的值在线性表 La 中进行查访;
(3)若线性表 La 中不存在和其值相同的数据元素,则将从 Lb 中删除的这个数据元素插人到线性表 La 中;重复以上操作直至 Lb 为空表止。

void union (List &La, List &Lb)
{
   // 将线性表 Lb 中所有在 La 中不存在的数据元素插人到 La 中
   // 算法执行结束后,线性表 Lb 不再存在
   La_len= Listlength (La) ;// 求线性表 La 的长度
   while (!ListEmpty (Lb)) // Lb 表的元素尚未处理完
   {
      ListDelete(Lb,1, e) ;// 从 Lb 中删除第一个数据元素赋给 e
      if (!LocateElem(La, e)) 
      ListInsert (La,++La_len,e) ;
      // 若 La 中不存在值和 e 相等的数据元素
      // 则将它插入在 La 中最后一个数据元素之后
   }// while
   DestroyList (Lb) ;// 销毁线性表 Lb
)// union

2、已知一个非纯集合 B(即集合 B 中可能有相同元素),试构造一个纯集合 A,使A 中只包含 B 中所有值各不相同的成员。

具体操作步骤为:
(1)构造一个空的线性表 La;
(2)从线性表 Lb 中取得一个数据元素;
(3)依该数据元素的值在线性表 La 中进行查访;
(4)若线性表 La 中不存在和其值相同的数据元素,则将从 Lb 中删除的这个数据元素插入到线性表 La 中:重复(2)至(4)的操作直至Lb 为空表止。

void purge(List &La,List &Lb)
{
    // 构造线性表 La,使其只包含 Lb 中所有值不相同的数据元素,
    //操作完成后,线性表 Lb 不再存在
    InitList(La); 创建一个空的线性表La
    La_len=0; 
    while(!ListEmpty(Lb))//Lb表的元素尚未处理完
    {
          ListDelete(Lb,1,e)//从Lb中删除第一个数据元素赋给e
          if (!LocateElem(La, e)) 
          ListInsert (La,++La_len,e) ;// 若 La 中不存在值和 e 相等的数据元素,则插入进去
     }//while
     DestroyList (Lb) ;// 销毁线性表 Lb
}//purge

3、判别两个集合 A 和 B 是否相等

两个集合相等,指的是这两个集合中包含的成员相同。当以线性表表示集合时,则要求分别表示这两个集合的线性表 La 和 Lb 不仅长度相等,所含数据元素也必须一一对应。值得注意的是,两个“相同”的数据元素在各自的线性表中的“位序”不一定相同。

具体操作步骤为:先构造一个和线性表 La 相同的线性表 Lc,然后对 Lb 中每个数据元素,在 Lc 中进行查询,若存在则从 Lc 中删除之,显然,当 Lb 中所有元素检查完毕时,“Lc 为空”是两个集合相等的标志。上述算法中构造的线性表 Lc 是一个辅助结构,它的引入是为了在程序执行过程中不破坏原始数据 La,因此在算法的最后应销毁 Lc 这个辅助结构。

bool isequal (List La, List Lb)
{
     // 若线性表 La 和 Lb 不仅长度相等,且所含数据元素也相同,则返回 TRUE
     // 否则返回 FALSE
     La_len= ListLength (La) ; 
     Lb_len= ListLength (Lb) ; //求表长 
     if (La_len != Lb_len) 
      return FALSE;
     else
     {
        InitList (Lc) ;// 构造空线性表 Lc
        for (k= 1; k< = La_len; k++) // 生成线性表La的“复制品”Lc
        (
              GetElem(La,k,e) ;
              ListInsert (Lc,k,e) ;
        )//for
        found=TRUE;
        for(k=1;k<=Lb_len;k++)
        {
             GetElem(Lb,k,e);//取Lb中第k个元素
             i=LocateElem(Lc,e);//在Lc中进行查询
             if(i==0)
             found=FALSE; La中不存在和该数据元素相同的元素
             else
             ListDelete(Lc,i,e); 从 Lc中删除该数据元素
        }//for
        if(found&&ListEmpty(Lc))
        return TRUE;
        else
        return FALSE;
     }//else
}//isequal
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tyro达令

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值