数据结构与算法学习笔记-线性表(1)

数据结构-线性表

2.1线性表的定义和基本操作

线性表是一种典型的线性结构。

  • 存在一个唯一的被称为“第一个”的数据元素;
  • 存在一个唯一的被称为“最后一个”的数据元素;
  • 除第一个元素外,每个元素均有唯一一个直接前驱;
  • 除最后一个元素外,每个元素均有唯一一个直接后继。

线性表(Linear List):是由n(n>=0)个数据元素(结点)a1,a2,…,an组成的有限序列。

所有节点具有相同的数据类型。

数据元素的个数n称为线性表的长度。

  • 当n=0时,称为空表。
  • 当n>0时,将非空的线性表记作:(a1,a2,…,an)a1称为线性表的第一个结点,an称为线性表的最后一个结点。
  • a1,a2,…,ai-1都是ai(2<=i<=n)的前驱,其中ai-1是ai的直接前驱;
  • ai+1,ai+2,…,an都是ai(1<=i<=n-1)的后继,其中ai+1是ai的直接后驱。
  1. 若线性表中的结点是按值由小到大(或大到小)排列的,称线性表是有序的。
  2. 线性表是一种相当灵活的数据结构,其长度可根据需要增长或缩短。
  3. 对线性表的数据元素可以访问,插入和删除。
线性表的抽象数据类型定义:

线性表的抽象数据类型定义

ListLength(L)

​ 初始条件:线性表L已存在;

​ 操作结果:若L为空表,则返回TRUE,否则FALSE

GetElem(L,i,&e)

​ 初始条件:线性表L已存在,1<=i<=Listlength(L)

​ 操作结果:用e返回L中的第i个数据元素的值;

ListInsert(L,i,&e)

​ 初始条件:线性表L已存在,1<=i<=ListLength(L)

​ 操作结果:在线性表L中的第i个位置插入元素e;

LocElem(LA,e,equal())

​ 初始条件:线性表L已存在,1<=i<=ListLength(L)

​ 操作结果:在线性表L中查找是否存在元素e;

例1 假设:有两个集合A和B分别用两个线性表LA和LB表示,即:线性表中的数据元素即为集合中的成员。现要求一个新的集合A = A∪B。

上述问题可演绎为如下操作:

  • 扩大线性表LA,将存在于线性表LB中而不存在于线性表LA中的数据元素插入到线性表LA中

操作步骤:

  1. 从线性表LB中依次查看每个数据元素;

    GetElem(LB,i)➡e

  2. 依次在线性表LA中进行查访;

    LocElem(LA,e,equal())

  3. 若不存在,则插入。

    ListInsert(LA,n+1,e)(n表示线性表LA当前长度)

void union(List La,List Lb){
//将所有在线性表Lb中但不在La中的数据元素插入到La中
    La_len = ListLength(La);Lb_len = ListLength(Lb);
    //求线性表长度
    for (i=1;i<=Lb_len;i++){
        GetElem(Lb,i,e);//取Lb中第i个数据元素赋给e
        if (!LocateElem(La,e,equal))
            ListInsert(La,++La_len,e);
        //La中不存在和e相同的数据元素,则插入
    }//union
}

例2 归并两个“其数据元素按值非递减有序排列”的有序表LA和LB,求得有序表LC也具有相同特性。
LA = (3,5,8,11)
LB = (2,6,8,9,11,15,20)
则LC =(2,3,5,6,8,89,11,11,15,20)

操作步骤:

  1. 初始化LC为空表;
  2. 分别从LA和LB中取得当前元素ai和bj;
  3. 若ai<=bj;则将ai插入到LC中,否则将bj插入到LC中;
  4. 重复2和3两步,直至LA或LB中元素被取完为止;
  5. 将LA表或LB表中剩余元素复制插入到LC表中。
void MergeList(List La,List Lb,List Lc){
    InitList(Lc);
    i = j = 1, k = 0;
    La_len = ListLength(La);La_len = ListLength(Lb);
    //获取La表和Lb表的长度
    while((i<=ListLength)&&(j<=Lb_len)){//La和Lb均非空
        GetElem(La,i,a);GetElem(Lb,j,bj);
        if (ai<=bj){  ListInsert(Lc,++k,ai)++i , }
        //如果ai<=bj,则把ai插入到Lc中,然后将i移动到下一位
            else{  ListInsert(Lc,++k,bj),++j, }
        //否则,把bj插入到Lc中,然后将j移动到下一位
    while(i<=La_len){
        //如果Lb已经完全遍历完了,则此时只遍历La表
        GetElem(La,i++,ai);ListInsert(Lc,++k,ai);
        }
    while(j<=lb_len){
        //如果La已经完全遍历完了,则此时只遍历Lb表
        GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);
        }//结束
    
}//MergeList
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值