【数据结构】线性表(一)线性表的定义及其基本操作(顺序表插入、删除、查找、修改)

这篇具有很好参考价值的文章主要介绍了【数据结构】线性表(一)线性表的定义及其基本操作(顺序表插入、删除、查找、修改)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、线性表

1. 线性表的定义

2. 线性表的要素

二、线性表的基本操作

三、线性表的顺序存储结构

1. 定义

2. 顺序表的操作      

a. 插入操作

b. 删除操作

c. 查找操作

d. 修改操作

e. 代码实例


一、线性表

1. 线性表的定义

        一个线性表是由零个或多个具有相同类型的结点组成的有序集合。

        这里用(a1,a2,…,an)来表示一个线性表,n为自然数:

① 当n=0时,线性表中无结点(或曰包含零个结点),这样的线性表被称为空表

② 当n=1时,线性表中仅有一个结点,该结点既是表头(head),又是表尾(tail)

③ 当n≥1时,称a1为线性表的表头,称an为线性表的表尾;

④ 当n≥2时,称aiai+1的前驱结点,称ai+1为ai后继结点,其中1≤ i < n;表头结点无前驱结点,表尾结点无后继结点。

        线性表中的元素之间存在一对一的关系,也就是说每个元素都有一个直接前驱和一个直接后继,除了第一个元素没有前驱,最后一个元素没有后继。线性表可以用来表示各种具有线性关系的数据,例如数组、链表等。

2. 线性表的要素

  • 元素类型:线性表中的元素具有相同的数据类型,可以是整数、字符、结构体等。
  • 元素个数:线性表中的元素个数可以是任意的,可以是有限的或无限的
  • 元素顺序:线性表中的元素按照一定的次序排列,每个元素都有一个唯一的位置
  • 关系定义:线性表中的元素之间存在顺序关系,每个元素都与它的前驱和后继相连。
  • 表头和表尾:线性表有一个表头和一个表尾,表头是线性表中第一个元素,表尾是线性表中最后一个元素。

二、线性表的基本操作

        ①创建一个线性表

        ②确定线性表的长度

        ③确定线性表是否为空

        ④存取表中指定位置结点的字段值

        ⑤查找指定字段值在表中的位置

        ⑥删除表中指定位置的结点

        ⑦在表中指定位置插入一个新结点

三、线性表的顺序存储结构

1. 定义

        按照线性表结点间的逻辑顺序依次将它们存储于一组地址连续的存储单元中的存储方式被称为线性表的顺序存储方式

        按顺序存储方式存储的线性表具有顺序存储结构,一般称之为顺序表。换言之,在程序中采用定长的一维数组,按照顺序存储方式存储的线性表,被称为顺序表。若顺序表中的元素按其值有序,则称其为有序顺序表

        在高级程序设计语言中,“数组”这种数据类型同样具有随机存储的特性,因此用高级程序设计语言实现线性表的顺序存储结构时,通常选择数组。因此,数组的长度就是顺序表的最大长度(MaxSize),顺序表的实际长度为length,其值必须小于等于MaxSize。

熟悉线性表及其顺序存储结构,掌握顺序表的插入、删除和其他操作。完成案例的,数据结构,算法,数据结构,链表

// 定义顺序表结构体
typedef struct {
    int data[MAX_SIZE];  // 用数组存储元素
    int length;          // 顺序表的长度
} SeqList;

结构体基础知识:

【重拾C语言】八、表单数据组织——结构体(类型、类型别名、直接/间接访问;典例:复数、成绩单)-CSDN博客https://blog.csdn.net/m0_63834988/article/details/133793105?spm=1001.2014.3001.5502

2. 顺序表的操作      

// 初始化顺序表
void initSeqList(SeqList *list) {
    list->length = 0;
}

a. 插入操作

        插入操作用于向顺序表中插入一个新的元素:需要将插入位置之后的所有元素依次后移一位,为新元素腾出空间,并将新元素放入目标位置。

int insert(SeqList *list, int position, int element) {
    if (position < 0 || position > list->length || list->length == MAX_SIZE) {
        return 0;  // 插入位置非法或顺序表已满,插入失败
    }

    // 将插入位置之后的元素依次后移一位
    for (int i = list->length - 1; i >= position; i--) {
        list->data[i + 1] = list->data[i];
    }

    // 在插入位置放入新元素
    list->data[position] = element;
    list->length++;

    return 1;  // 插入成功
}

b. 删除操作

        删除操作用于从顺序表中删除指定位置的元素:需要将删除位置之后的所有元素依次前移一位,覆盖被删除的元素,同时将顺序表的长度减一。

int delete(SeqList *list, int position) {
    if (position < 0 || position >= list->length) {
        return 0;  // 删除位置非法,删除失败
    }

    // 将删除位置之后的元素依次前移一位
    for (int i = position + 1; i < list->length; i++) {
        list->data[i - 1] = list->data[i];
    }

    list->length--;

    return 1;  // 删除成功
}

c. 查找操作

        查找操作可以根据元素的值进行查找,也可以根据位置进行查找。

  • 对于按值查找,需要遍历顺序表的所有元素,逐个比较元素的值;
  • 对于按位置查找,直接通过索引访问数组中的元素即可。
int search(SeqList *list, int element) {
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == element) {
            return i;  // 找到元素,返回索引
        }
    }

    return -1;  // 未找到元素
}

d. 修改操作

        修改操作用于修改顺序表中指定位置的元素的值:可以通过索引直接访问到目标位置的元素,并进行修改。

        在顺序存储结构中,插入和删除操作可能需要移动大量元素,导致时间复杂度较高。而查找和修改操作可以在常数时间内完成,时间复杂度为O(1)。

int modify(SeqList *list, int position, int newElement) {
    if (position < 0 || position >= list->length) {
        return 0;  // 修改位置非法,修改失败
    }

    list->data[position] = newElement;

    return 1;  // 修改成功
}

e. 代码实例

#include <stdio.h>

#define MAX_SIZE 100

// 定义顺序表结构体
typedef struct {
    int data[MAX_SIZE];  // 用数组存储元素
    int length;          // 顺序表的长度
} SeqList;

// 初始化顺序表
void initSeqList(SeqList *list) {
    list->length = 0;
}

// 插入操作
int insert(SeqList *list, int position, int element) {
    if (position < 0 || position > list->length || list->length == MAX_SIZE) {
        return 0;  // 插入位置非法或顺序表已满,插入失败
    }
    
    // 将插入位置之后的元素依次后移一位
    for (int i = list->length - 1; i >= position; i--) {
        list->data[i + 1] = list->data[i];
    }
    
    // 在插入位置放入新元素
    list->data[position] = element;
    list->length++;
    
    return 1;  // 插入成功
}

// 删除操作
int delete(SeqList *list, int position) {
    if (position < 0 || position >= list->length) {
        return 0;  // 删除位置非法,删除失败
    }
    
    // 将删除位置之后的元素依次前移一位
    for (int i = position + 1; i < list->length; i++) {
        list->data[i - 1] = list->data[i];
    }
    
    list->length--;
    
    return 1;  // 删除成功
}

// 查找操作(按值查找)
int search(SeqList *list, int element) {
    for (int i = 0; i < list->length; i++) {
        if (list->data[i] == element) {
            return i;  // 找到元素,返回索引
        }
    }
    
    return -1;  // 未找到元素
}

// 修改操作
int modify(SeqList *list, int position, int newElement) {
    if (position < 0 || position >= list->length) {
        return 0;  // 修改位置非法,修改失败
    }
    
    list->data[position] = newElement;
    
    return 1;  // 修改成功
}

int main() {
    SeqList list;
    initSeqList(&list);
    
    // 在顺序表中插入元素
    insert(&list, 0, 10);
    insert(&list, 1, 20);
    insert(&list, 2, 30);
    
    // 删除顺序表中的元素
    delete(&list, 1);
    
    // 查找顺序表中的元素
    int index = search(&list, 30);
    if (index != -1) {
        printf("元素30的索引为:%d\n", index);
    } else {
        printf("未找到元素30\n");
    }
    
    // 修改顺序表中的元素
    modify(&list, 0, 40);
    
    return 0;
}

熟悉线性表及其顺序存储结构,掌握顺序表的插入、删除和其他操作。完成案例的,数据结构,算法,数据结构,链表
 文章来源地址https://www.toymoban.com/news/detail-776276.html

到了这里,关于【数据结构】线性表(一)线性表的定义及其基本操作(顺序表插入、删除、查找、修改)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【玩转408数据结构】线性表——定义和基本操作

            线性表是算法题命题的重点,该类题目实现相对容易且代码量不高,但需要最优的性能(也就是其时间复杂度以及空间复杂度最优),这样才可以获得满分。所以在考研复习中,我们需要掌握线性表的基本操作,在平时多进行代码练习。当然在考场上,我们并不一

    2024年02月19日
    浏览(47)
  • 【数据结构】栈定义及其常用的基本操作(C/C++)

    目录 ●图示(以顺序栈为例) ●栈的类型定义 ●栈常用的基本操作 ●顺序栈 ●链式栈 ●简单案例 1.顺序栈(这里只实现用顺序表存储3个学生的学号、姓名、年龄并且将其输出查看。若进行其他操作,对代码进行简单修改即可)  2.链式栈(不做过多演示,对代码进行简单

    2024年02月07日
    浏览(51)
  • 【数据结构】线性表(六)堆栈:顺序栈及其基本操作(初始化、判空、判满、入栈、出栈、存取栈顶元素、清空栈)

       堆栈Stack 和 队列Queue 是两种非常重要的数据结构,两者都是特殊的线性表: 对于堆栈,所有的插入和删除(以至几乎所有的存取)都是在表的同一端进行 对于队列,所有的插入都是在表的一端进行,所有的删除(以至几乎所有的存取)都是在表的另一端进行。    堆

    2024年02月07日
    浏览(45)
  • 【玩转408数据结构】线性表——单链表的定义以及增删改查(线性表的链式表示 上)

            到这里我们已经了解到线性表是具有 相同数据类型 的 有限个数据元素 序列,而线性表的顺序存储也就是顺序表,顺序表的存储形式十分直观,我们在实现时使用数组进行实现,但顺序表在插入或者删除元素时需要移动大量元素,那么怎么样才能在插入删除元素时不

    2024年02月21日
    浏览(57)
  • 【数据结构】单链表——单链表的定义及基本操作的实现(头插、尾插、头删、尾删、任意位置的插入与删除)

    🧑‍💻作者: @情话0.0 📝专栏:《数据结构》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   顺序表可以随时存取表中的任意一个元素,它的存储位置可以用一个简单直观的公式表示,但是插入和删除操作需要移动

    2024年02月19日
    浏览(204)
  • 数据结构上机练习——单链表的基本操作、头文件、类定义、main函数、多种链表算法的实现,含注释

      头文件和源文件分开有很多好处:可以提高编译速度、提高代码的可维护性、提高代码的可重用性和可扩展性,同时也可以使代码结构更清晰,方便代码的管理和维护。 LinkList.h test.cpp                  (下面所有函数都默认在类中实现)   我们以

    2024年02月07日
    浏览(57)
  • 数据结构---双向链表的基本操作

    头插法 遍历链表 尾插法 头删法 尾删法 按位置插入数据 按位置删除数据 dooublelinklist.c doublelinklist.h doublemain.c

    2024年02月22日
    浏览(53)
  • 【数据结构】——单链表的基本操作(带头结点)

            单链表解决了顺序表需要大量连续存储单元的缺点,但单链表附加指针域, 存储密度较顺序表低(考点!!) 。由于单链表的元素离散地分布在存储空间中,所以单链表是 非随机存取 的存储结构,即不能直接找到表中某个特定的结点。当查找某个特定结点时,需要

    2024年02月05日
    浏览(51)
  • 【数据结构】C语言实现双链表的基本操作

    大家好,很高兴又和大家见面啦!!! 经过前面几个篇章的内容分享,相信大家对顺序表和单链表的基本操作都已经熟练掌握了。今天咱们将继续分享线性表的链式存储的第二种形式——双链表。在今天的内容中,咱们将介绍双链表的创建以及一些基本操作,接下来跟我一起

    2024年02月04日
    浏览(62)
  • 【数据结构】单链表的基本操作 (C语言版)

    目录 一、单链表 1、单链表的定义: 2、单链表的优缺点: 二、单链表的基本操作算法(C语言) 1、宏定义 2、创建结构体 3、初始化 4、插入 4、求长度 5、清空 6、销毁  7、取值 8、查找 9、删除 10、头插法创建单链表 11、尾插法创建单链表 三、单链表的全部代码(C语言)

    2024年01月22日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包