线性表

Posted basonwoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性表相关的知识,希望对你有一定的参考价值。

零个或多个数据元素的有限序列,较复杂的线性表中,一个数据元素可以由若干个数据项组成

ADT 线性表(List)

Data

    线性表的数据对象集合每个元素的类型均为Datatype,数据元素之间的关系是一对一的。

Operation

    InitList(*L)            :初始化操作,建立一个空的线性表L

    ListEmpty(L)            :若线性表为空,返回true,否则返回false

    ClearList(*L)           :将线性表清空

    GetElem(L,i,*e)         :将线性表L中第i个位置元素值返回给e
    
    LocateElem(L,e)         :在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败

    ListInsert(*L,i,e)      :在线性表L中第i个位置插入新元素e

    ListDelete(*L,i,*e)     :删除线性表L中第i个位置元素,并用e返回其值

    ListLength(L)           :返回线性表L的元素个数

endADT

实现两个线性表集合A和B的并集操作

/*将所有的在线性表Lb中但不在La中的数据元素插入到La中*/

void unionL(List *La,List Lb)
{
    int La_len,Lb_len,i;
    Elemtype e;                     /*声明与La和Lb相同的数据元素e*/
    La_len = ListLength(*La);       /*求线性表La长度*/
    Lb_len = ListLength(Lb);
    for(i=1;i<=Lb_len;i++)
    {
        GetElem(Lb,i,&e);           /*取Lb中第i个数据元素赋给e*/
        if(!LocateElem(*La,e))      /*La中不存在和e相同数据元素*/
            ListInsert(La,++La_len,e);/*插入*/
    }
}

线性表的顺序存储结构

用一段地址连续的存储单元一次存储线性表的数据元素,可以用C语言的一堆数组来实现

# define MAXSIZE 20             /*存储空间初始分配量*/
typedef int ElemType;           /*ElemType类型根据实际情况而定,这里假设为int*/
typedef struct
{
    ElemType data{MAXSIZE};     /*数组存储数据元素,最大值为MAXSIZE*/
    int length;                 /*线性表当前长度*/
}Sqlist
  • 存储器中的每个存储单元都有自己的编号,称之为地址。

获得元素操作

如果要实现GetElem操作,只需将第i个位置元素值返回。对程序而言,只要i的数值在数组下标范围内,就是把数组第i-1下标的值返回即可。

#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/
/*操作结果:用e返回L中第i个数据元素的值*/
Status GetELem(SqList L,int i,ElemType *e)
{
    if(L.length==0 || i<1 || i>L.length)
        return ERROR;
    *e=L.data[i-1];
    return OK;
}

这里返回值类型Status是一个整型,返回OK代表1,ERROR代表0。

插入操作

  • 如果插入位置不合理,抛出异常;
  • 如果线性表长度大于数组长度,则抛出异常或动态增加容量;
  • 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移一位;
  • 将要插入元素填入位置i处;
  • 表长加1

    /初始条件:顺序线性表L已存在,1≤i≤ListLength(L)/
    /操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1/
    Status ListInsert(SqList L,int i;ElemType e)
    {
    int k;
    if(L->length==MAXSIZE) /
    顺序线性表已满/
    return ERROR;
    if(i<1 || i>L->length+1) /
    当i不在范围内时/
    return ERROR;
    if(i<=L->length) /
    若插入数据位置不在表尾/
    {
    for(k=L->length-1;k>=i-1;k--) /
    将要插入位置后数据元素向后移动一位/
    L->data[k+1]=L->data[k];
    }
    L->data[i-1]=e; /
    将新元素插入*/
    L->length++;
    return OK;
    }

删除操作

  • 如果删除位置不合理,抛出异常;
  • 取出删除元素;
  • 从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置;
  • 表长减1

    Status ListDelete(SqList L,int i,ElemType e)
    {
    int k;
    if(L->length==0) /线性表为空/
    return ERROR;
    if(i<1 || i>L->length) /删除位置不正确/
    return ERROR;
    e=L->data[i-1];
    if(i<L-length) /
    如果删除不是最后位置/
    {
    for(k=i;k
    将删除位置后继元素前移*/
    L->data[k-1]=L->data[k];
    }
    L->length--;
    return OK;
    }

线性表的顺序存储结构,在存、读数据时,不管是哪个位置,时间复杂度都是O(1);而插入或删除时,时间复杂度都是O(n)。这说明,它比较是和元素个数不太变化,而更多是存取数据的应用。

































以上是关于线性表的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中的地图片段内中心线性布局?

垂直线性布局中的多个片段

线性表的插入和删除操作代码(C语言)

在android中的类内的对话框片段的线性布局中添加textview

数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)

数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)