首页 > 其他分享 >02. 线性表

02. 线性表

时间:2023-03-17 12:33:14浏览次数:29  
标签:02 结点 return 线性表 int List PtrL

一、什么是线性表

  线性表(Linear List)是由同类型数据元素构成 有序序列线性结构。表中元素个数称为线性表的 长度,线性表没有元素时,称为 空表。表起始位置称为 表头,表结束位置称为 表尾

  线性表的抽象数据类型描述

  • 类型名称:线性表(List)
  • 数据对象集:线性表是 n ( ≥ 0 ) 个元素构成有序序列(a1,a2,...,an)
  • 操作集:线性表 L ∈ List,整个 i 表示位置,元素 X ∈ ElementType
List MakeEmpty();                           // 初始化一个空线性表L
ElementType FindKth(int K,List L);          // 根据位序K,返回相应元素
int Find(ElementType X,List L);             // 在线性表L中查找X的第一次出现位置
void Insert(ElementType X,int i,List L);    // 在位序i前插入一个新元素X
void Delete(int i,List L);                  // 删除指定位序i的元素
int Length(List L);                         // 返回线性表L的长度n

二、线性表的顺序存储实现

  我们可以利用数组的连续存储空间顺序存放线性表的各元素。

线性表的顺序存储实现

struct LNode
{
    ElementType Data[MAXSIZE];
    int Last;
};

typedef struct LNde * List;

struct LNode L;
List PtrL;

  • 访问下标为 i 的元素:L.Data[i]PtrL->Data[i]
  • 线性表的长度:L.Last+1PtrlL->Last+1

  主要操作的实现:

【1】、初始化(建立空的顺序表)

List MakeEmpty()
{
    List PtrL;
    PtrL = (List)malloc(sizeof(struct LNode));
    PtrL->Last = -1;
    return PtrL;
}

【2】、查找

int Find(ElementType X,List PtrL)
{
    int i = 0;
    while(i <= PtrL->Last &&  PtrL->Data[i] != X)
    {
        i++;
    }

    if (i > PtrL->Last){
        return -1;          // 如果没有找到,返回-1
    } 
    else 
    {
        return i;           // 找到后返回的是存储位置
    }
}

查找成功的平均比较次数为 (n+1)/2,平均时间性能为 O(n);

【3】、插入(第 i (1 ≤ i ≤ n+1)个位置插入一个值为X的新元素)

线性表的线性存储插入元素

void Insert(ElementType X,int i,List PtrL)
{
    int j;

    if (PtrL->Last == MAXSIZE-1)                // 表已经满了,不能插入
    {
        printf("表已经满了,无法插入新的元素\n");
        return ;
    }

    if (i < 1 || i > PtrL->Last+2)              // 检查插入位置的合法性
    {
        printf("插入的位置不合法\n");
        return;
    }
  
    for(j = PtrL->Last; j >= i-1; j--)
    {
        PtrL->Data[j+1] = PtrL->Data[j];        // 将a[i]~a[n]倒序向后移动
    }

    PtrL->Data[i-1] = X;                        // 新元素插入
    PtrL->Last++;                               // Last仍指向最后元素
}

平均移动次数为 n/2,平均时间性能为 O(n);

【4】、删除(删除表的第 i(1 ≤ i ≤ n)个位置上的元素)

线性表的线性存储删除元素

void Delete(int i,List PtrL)
{
    int j;

    if (i < 1 || i >PtrL->Last+1)           // 检查空表及删除位置的合法性
    {
        printf("不存在第 %d 个元素\n",i);
        return;
    }
  
    for (j = i; j <= PtrL->Last; j++)
    {
        PtrL->Data[j-1] = PtrL->Data[j];    // 将a[i+1]~a[n]顺序向前移动
    }
    PtrL->Last--;                           // Last仍指向最后元素
}

平均移动次数为 (n-1)/2,平均时间性能为 O(n);

三、线性表的链式存储实现

  线性表的链式存储不要求逻辑上相邻的两个元素物理上也相邻;我们可以通过“链”建立起数据元素之间的逻辑关系。此时,插入、删除元素不需要移动数据元素,只需要修改“链”就可以了。

线性表的链式存储实现

struct LNode
{
    ElementType Data;
    List Next;
};

typedef struct LNode *List;

struct LNode L;
List PtrL;

  主要操作的实现:

【1】、求表长

int Length(List PtrL)
{
    List p = PtrL;      // p指向表的第一个结点
    int j = 0;

    while(p)
    {
        p = p->Next;
        j++;            // 当前p指向的第j个结点
    }

    return j;
}

时间性能为 O(n)

【2】、查找

  ①、按序号查找:FindKth

List FindKth(int K,List PtrL)
{
    List p = PtrL;
    int i = 1;

    while(p != NULL && i < K)
    {
        p = p->Next;
        i++;
    }

    if(i == K)
    {
        return p;       // 找到第K个,返回指针
    }
    else{
        return NULL;    // 否则返回空
    }
}

  ②、按值查找:Find

List Find(ElementType X,List PtrL)
{
    List p = PtrL;
  
    while(p != NULL && p->Data != X)
    {
        p = p->Next;
    }

    return p;
}

平均时间性能为 O(n)

【3】、插入(在第 i-1(1 ≤ i ≤ n+1)个结点后插入一个值为 X 的新结点)

  1. 先构造一个新结点,用 s 指向;
  2. 再找到链表的第 i-1 个结点,用 p 指向;
  3. 然后修改指针,插入结点(p 之后插入新节点是 s)

线性表的链式存储插入元素

List Insert(ElementType X,int i,List PtrL)
{
    List p,s;

    if(i == 1)                                      // 新节点插入在表头
    {
        s = (List)malloc(sizeof(struct LNode));     // 申请、填装结点
        s->Data = X;
        s->Next = PtrL;
        return s;                                   // 返回新表头指针
    }

    p = FindKth(i-1,PtrL);                          // 查找第i-1个结点
    if(p == NULL)                                   // 第i-1个结点存在,不能插入
    {
        printf("第 %d-1 个结点存在,不能插入\n",i);
        return NULL;
    }
    else
    {
        s = (List)malloc(sizeof(struct LNode));     // 申请、填装结点
        s->Data = X;
        s->Next = p->Next;                          // 新节点插入在第i-1个结点的后面
        p->Next = s;
        return PtrL;
    }
}

【4】、删除(删除链表的第 i(1 ≤ i ≤ n)个位置上的结点)

  1. 先找到链表的第 i-1 个结点,用 p 指向;
  2. 再用指针 s 指向要删除的结点(p 的下一个结点);
  3. 然后修改指针,删除 s 所指结点;
  4. 最后释放 s 所指结点的空间;

线性表的链式存储删除元素

List Delete(int i,List PtrL)
{
    List s,p;

    if(i == 1)                          // 若要删除的是表的第一个结点
    {
        s = PtrL;                       // s指向第1个结点
        if(PtrL != NULL)                // 从列表中删除
        {
            PtrL = PtrL->Next;
        }
        else
        {
            return NULL;
        }
        free(s);                        // 释放被删除结点
        return PtrL;
    }

    p = FindKth(i-1,PtrL);              // 查找第i-1个结点
    if(p == NULL)
    {
        printf("第%个结点不存在\n",i-1);
        return NULL;
    }
    else if(p->Next == NULL)
    {
        printf("第%d个结点不存在\n",i);
        return NULL;
    }
    else
    {
        s = p->Next;                    // s指向第i个结点
        p->Next = s->Next;              // 从链表中删除
        free(s);                        // 释放被删除结点
        return PtrL;
    }
}

标签:02,结点,return,线性表,int,List,PtrL
From: https://www.cnblogs.com/kurome/p/17226226.html

相关文章

  • 固态硬盘寿命天梯 2023.3
    排名品牌型号颗粒寿命接口#1INTELP5800x/P5810x傲腾100DWPDU.2#1大普微/铠侠X2900PSLC100DWPDU.2#3INTELP4800x/P4801x傲腾60DWPDU.2/A......
  • 2023年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 L 捡贝壳
    题目链接还没补一道类似的题线段树上维护四个信息,从左端点向右连续的最大值lmx,从右端点向左连续的做大值rmx,区间最大值mx,区间和sum,每次pushup的时候如何维护四个信息?对......
  • 省选联考 2021 A卷 图函数
    这个东西大概是可以转化成对于一个图,我们要支持加边,加边之后询问点对\((u,v)\)的对数,其中要求\(u<v\)并且\(u,v\)可以仅通过编号\(\geu\)的点双向到达。显然等价......
  • day16(2023.3.16)
    1.包装类 2.自动装箱(autoboxing)和拆箱(unboxing) 3.自定义包装类 运行结果: 4.StringBuilder类和StringBuffer类 5.效率测试 运行结果: 6.时间类......
  • 02.信息化和信息系统
    1.软件工程1.1.软件架构设计1.1.1.软件架构风格定义:软件架构设计的一个核心问题是能否达到架构级的软件复用,也就是说,能否在不同的系统中,使用同一个软件架构。......
  • 黑马阶段三 C++篇 02day
    2day1.引用是什么:给变量空间取别名intmain(){inta=0;int&b=a;b=100;cout<<a<<endl;return0;}2.引用的注意使用引用类型可以像指针那样访问只......
  • 会声会影2023安装、激活教程
    安装前准备:1、会声会影2023的安装需要在有网络接的状态下进行。请您确保安装过程中有一个良好的网络环境,并且在安装过程中,不能断网。2、安装之前退出、关闭电脑管家以及杀毒......
  • 会声会影Video Studio 2023旗舰版怎么安装、激活教程
    会声会影(VideoStudio)2023旗舰版是加拿大Corel公司制作的一款功能强大的视频编辑软件、大型视频制作软件、专业视频剪辑软件。会声会影专业视频编辑处理软件,可以用于剪辑&......
  • 2023/3/16
    今天在Androidstudio上怕下载了MySQL的jar包,并且成功配置了环境。而且将xml配置文件都配置好了。  还有连接数据库MySQLjdbc写好了 ......
  • 2023年3月16号
    马上要交打卡系统了,自己完成的要求点不多,距离星期五还有一天,感觉只有后面才能补全,现在只能说是能完成多少算多少吧,地铁系统也是一个大问题还需要解决,下次验收地铁系统第一......