IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 4.线性表 -> 正文阅读

[数据结构与算法]4.线性表

#链表
学习链表之前,回顾一下数组的相关的特性:

  1. 在内存上连续的内存空间
  2. 数组中存储的元素类型相同
  3. 低效的插入删除
  4. 高效的查询

三种策略:先进先出FIFO,最少使用LFU,最近最少使用LRU

线性表的定义及逻辑结构

线性表就是零个或多个类型相同的数据元素,组成有限序列线性表抽象的记为:a1,a2,a3,a4,a5…an
一个线性表中的数据元素属于同一个数据对象
线性表的数据元素的个数为n(n>0)线性表的长度
当线性表数据元素的个数n=o 时,为空表

线性表的基本操作

  1. 初始化InitList(L),构造一个空表的线性表
  2. 判断线性表是否为空表,EmptyList(L):如果线性表为空,返回真,否则返回假
  3. 返回线性表的长度lengthList(L):返回线性表中所含元素的个数
  4. 获取线性表中第I个元素操作GetList(L,i),i是数据元素在线性表中的位序,i位置的要求 ,1<=i <= lengthList(L),返回线性表L中第I个元素的值或地址
  5. 按值查找操作LocalList(L,x)在线性表L(a1,a2…ai,…an)中查找X,如果线性表L中存在值和X相等的数据元素,函数返回这个数据元素在线性表中的位序,否则返回-1
  6. 插入操作InsertList(L,I,X)在线性表L(a1,a2…ai…,an)中第I个数据元素I之前插入一个新的数据元素x插入位置,1<= i <= lengthList(L)+1,插入I之后的线性表L的表长等于原线性表长度+1
  7. 删除操作,DeleteList(L,i)在给定的线性表L(a1,a2…ai,…an)中删除序号为I的数据元素删除位置I要求 1<=i <= lengthList(L)删除之后:L的长度等于原表长-1

思考题

  1. 将两个或两个以上的线性表合并成一个线性表
  2. 把一个线性表拆分成两个或两个以上的线性表
  3. 复制一个线性表
  4. 对线性表中的数据元素按照某个数据项进行排序

线性表的顺序结构

用一组地址连续的存储单元,依次存储线性表的数据元素

存放位置从起始地址为b的一段连续的存储单元中,逻辑上相邻的两个元素在物理上也相邻

线性表中的数据元素的类型都是相同的,所以每个数据元素所占空间大小一样,假设为L
第一个数据元素位置为a,地址为b
第i个数据元素的地址为b+(i-1)L

顺序表具有按数据元素的位序随机存取的特点
在这里插入图片描述

一维数据来表示顺序表的数据存储区域

数组的空量,需设计的足够大,根据实际问题定义的足够大的MAXSIZE作为上界。
线性表中的数据从数组的零位置,开始依次顺序存放

一般情况下线性表中的实际元素个数少于MAXSIZE个,因此用一个变量Last记录线性表中最后一个元素在线性表中的位置,空表last = -1

# define MAXSIZE 100
typedef struct Linear_List
{
    detatype elem[MAXSIZE];
    int list;

}SeqList

数据的长度,顺序表的存储空间大小,我们用MAXSIZE定义,分配后值不变

顺序表的长度是顺序表中数据元素的个数,也就是last+1
它随着顺序表的插入和删除操作会有变化

任何一个时刻,顺序表的长度应该小于等于数组的长度

SeqList L;
将初始值赋值给L的elem数组,last指针指向最后一个数据元素下标

练习

线性表–按值查找

typedef int datatype; 
int LocatList(SeqList *L,datatype x)
{
    int i = 0;
    #数组中没有元素,直接返回-1
    if(L->last <0 ) return -1; 
    # 如果i 的值小于数组的最后一位,且elem[i] 不等于x,i自增
    while(i< L->last &&  L->elem[i] != x ) i++;
    # 数组中的最后一位都没有找到,返回-1,否则返回i
    if (i > L->Last){
        return -1;
    }else{
        return i;
    }
}

线性表–插入删除
在这里插入图片描述

在顺序表中由于逻辑上的相邻数的数据元素在物理位置上也是相邻的,需要实现在第i个位置插入数据元素X,需要依次将ai-an往后移动,给X空出I位置

int insert(Seqlist *sq, int i , datatype x )
{
    int j;
    if(sq -> last == MAXSIZE -1)
    {
        printf("表满");
        return -1;
    }
    if(i <1 || i > sq->last +2)
    {
        printf("位置不对");
        return -1;
    }
    for(j = sq->last;j>i-1;j--)
        sq->elem[j+1]=sq->elem[j];
        sq->elem[i-1]=x;
        sq->last++;
        return -1
}


数据优缺点

优点

  1. 用数据元素之前物理位置,反映逻辑关系,无需为表示结点间的逻辑关系而增加额外的存储空间。
  2. 可方便地按元素位置随机存取表中的任一元素

缺点

  1. 插入或删除需要移动大量的数据元素
  2. 当线性表长度变化较大,难以确定存储空间的容量,需要预先设置较大的空间,造成存储空间浪费。

实际应用

在表的长度比较稳定,或插入删除在末尾进行,又经常需要按数据元素的序号存取,可以选择顺序存储结构。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-10 11:06:45  更:2021-09-10 11:07:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 1:52:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码