数据结构:线性表讲解

本文详细介绍了线性表的基本概念,包括线性表的定义、基本操作。接着深入探讨了线性表的顺序存储结构,阐述了构造原理、基本算法,如插入和删除元素的操作,并分析了其时间复杂度。最后通过例题说明了如何在有序顺序表中插入元素以保持非递减排序。

1.1线性表的基本概念

数据元素之间具有的逻辑关系为线性关系的数据元素结合,称为线性表,n为线性表的长度,长度为0的线性表称为空表

线性表的基本操作

  1. 创建一个新的线性表
  2. 求线性表的长度
  3. 检索线性表中第i个数据元素(1<=i<=n)
  4. 根据数据元素的某数据项(通常称为关键字)的值求该数据元素在线性表的位置
  5. 在线性表第i个位置上存入一个新的的数据元素
  6. 在线性表第i个位置上插入一个新的数据元素
  7. 删除线性表中第i个数据元素
  8. 对线性表中的数据元素按照某一个数据项的值的大小做升序或者降序排序
  9. 销毁一个线性表
  10. 复制一个线性表
  11. 按照一定的原则,将两个或两个以上的线性表合并称为一个线性表
  12. 按照一定的原则,将一个线性表分解为两个或两个以上的线性表

1.2线性表的顺序存储结构

1.2.1构造原理

用一组地址连续的存储单元一次存储线性表的数据元素,数据元素之间的逻辑关系通过数据元素的存储位置直接反映

所谓一个元素的地址:该元素占用过的k个(连续的)存储单元的第一个单元的地址(loc(ai))

结论

若假设每个数据元素占用k个存储单元,并且已知第一个元素的存储位置loc(a1),则有

LOCai=LOCa1+i-1*k

#define MaxSize 100

ElemType A[MaxSize];

int n;

1.2.2基本算法(以数组形式举例描述)

(1)确定元素item在长度为n的顺序表a中的位置

顺序查找法,时间复杂度o(n)

#include <stdio.h>

#define MaxSize 100

#define ElementType int

int LOCATE(ElementType A[],int n,int item);

int main()

{

    ElementType A[] = {1,2,3,4,5,6,7,8,9,10};

    int result = LOCATE(A,10,2);

    printf("所在位置为:%d\n",result);

};

//查找元素所在顺序表中位置

int LOCATE(ElementType A[],int n,int item){

    for(int i=0;i<n;i++){

        if (A[i]==item){

            return i+1;//查找成功,返回所在表中位置

        }

    }

    return -1;//查找失败,返回-1

};

 

(2)在长度为n的顺序表a的第i个位置插入一个新的数据元素item

在线性表的第i-1个数据元素与第i个数据元素之间插入一个由符号item表示的数据元素,使得长度为n的线性表

  1. 正常情况下需要做的工作:
    1. 将第i个元素至第n个元素依次后移一个位置
    2. 将被插入的元素插入表的第i个位置
    3. 修改表的长度(表长增1)n++
  2. 需考虑的异常情况
    1. 是否表满:n=maxsize
    2. 插入位置是否合适?正常位置1<=i<=n+1
  3. 约定
    1. 若插入成功,算法返回1,否则返回-1

//插入元素

int INSERT(ElementType A[],int n,int i,int item){

    if(n==MaxSize|| i<1||i>n+1){

        //测试空间是否满了

        return -1;//插入失败

    }else{

        for(int j=n-1;j>=i-1;j--){

            A[j+1]=A[j];//元素依次后移一个位置

        }

        A[i-1]=item;//item插入表的第i个位置

        n++;//线性表长度加1

        return 1;//插入成功

    }

};

 

算法时间复杂度分析

通常采用元素移动次数的平均值作为衡量插入和删除算法时间效率的主要指标

若假设pi为插入一个元素于线性表第i个位置的概率(概率相等),则在长度为n的线性表中插入一个元素需要移动其他的元素的平均次数为

称该算法的时间复杂度是o(n)

(3)删除长度为n的顺序表A的第i个数据元素

把线性表的第i个数据元素从线性表中去掉,使得长度为n的线性表转换为长度为n-1的线性表

正常情况下需要做的工作

          将第i+1个元素至第n个元素依次前移一个位置

          修改表的长度(表长减1)n—

需要考虑的异常情况:

          是否表空?n=0

          删除位置是否合适?正常位置1<=i<=n

约定

          若删除成功,算法返回1,否则返回-1

//删除元素,删除第i个位置的元素

int DELETE(ElementType A[],int n,int i){

    if(i<1||i>n){//测试表空和位置合适与否

        return -1;//删除失败

    }

    for(int j=i;j<n;j++){

        A[j-1]=A[j];//元素依次前移一个位置

    }

    n--;//线性表长度减1

    return 1;//删除成功

}

 

时间复杂度分析

通常采用元素移动次数的平均值作为衡量插入和删除算法时间效率的主要指标

pi为删除线性表中第i个数据元素的概率(设概率相等),在长度为n的线性表中删除第i个数据元素,需要移动其他的元素的平均次数为

称该算法的时间复杂度是o(n)

1.2.3例题有序顺序表中插入一个元素

已知长度为n的非空线性表A采用顺序存储结构,并且数据元素按值的大小非递减排序,写一算法,在该线性表中插入一个数据元素item,使得线性表仍然能保持值非递减排序

需要做的工作

  1. 特殊位置:直接将item插入表尾部
  2. 寻找插入位置:从表的第一个元素开始进行比较,若有关系item<ai则找到插入位置为表第i个位置
  3. 将第i个元素至第n个元素依次后移一个位置
  4. 将item插入表的第i个位置

时间复杂度为o(n)

//插入元素到有序数组中

void INSERTSORT(ElementType A[],int n,ElementType item){

    int i,j;

    if(item>=A[n-1]){

        //特殊情况,插入表尾部

         A[n]=item;

    }else{

        i=0;

        while(item>=A[i]){

            //寻找插入位置

           i++;

        }

        for(j=n-1;j>=i;j--){//item插入表中

            A[j+1]=A[j];

        }

        A[i]=item;

        n++;

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值