线性表操作的实现--顺序表

news2024/10/2 1:28:00

本文参考朱战力老师的数据结构与算法--使用C语言一书

文章目录

前言

一、线性表是什么?

二、具体实现

1.顺序表的定义

2.初始化ListInitiate(L)

3.求当前元素个数ListLength(L)

4.插入元素ListInsert(L,i,x)

5.删除元素ListDelete(L,i,x)

6.取元素ListGet(L,i,x)

7.小试牛刀

总结


前言

        本文所介绍的内容为数据结构与算法的基础内容--顺序表操作的实现,笔者通过不断的深入学习发现,后续的数据结构中,包括堆栈、队列、串、数组、表、数和二叉树无不是通过线性表去实现,故很好的理解线性表的操作对于广大的读者来说非常的有必要!


一、线性表是什么?

        线性表的抽象数据类型是线性表的逻辑结构,它表示线性表的元素、元素之间的逻辑关系以及线性表的操作集合。任何需要计算机进行管理和处理的元素都必须首先按照某种方式存储在计算机中。线性表有两种存储结构:一种是顺序存储结构,另一种是链式存储结构。一旦确定了线性表的存储结构,线性表操作集合中的所有操作就可以具体实现。

二、具体实现

1.顺序表的定义

代码如下(示例):

typedef struct {
    DataType list[MaxSize];
    int size;
}SeqList;

其中,DataType为数组元素的数据类型,MaxSize表示数组元素的最大个数,list表示顺序表的数组成员,size表示顺序表中当前存储的数组元素个数成员,且满足条件size<=MaxSize,SeqList是结构名。

2.初始化ListInitiate(L)

代码如下(示例):

void ListInitiate(SeqList* L) {
    L->size = 0;
}

说明:由于函数中要改变参数L的size域的值,因此参数L应设计为输出型参数,即参数L设计为SeqList的指针类型,否则,size域的修改值将不能带回去。

3.求当前元素个数ListLength(L)

代码如下(示例):

int ListLength(SeqList L) {
    return L.size;
}

4.插入元素ListInsert(L,i,x)

代码如下(示例):

int ListInsert(SeqList* L, int i, DataType x) {
    //在顺序表L的第i(0~size)个位置前插入x
    //插入成功返回1,插入失败返回0
    int j;
    if (L->size >= MaxSize) {
        printf("顺序表已满无法插入!\n");
        return 0;
    }
    else if (i<0 || i>L->size) {
        printf("参数i不合法!\n");
        return 0;
    }
    else {
        //从前向后依次后移数据,为插入做准备
        for (j = L->size; j > i; j--)
        {
            L->list[j] = L->list[j - 1];
        }
        L->list[i] = x;        //插入x
        L->size++;            //元素个数加1
        return 1;
    }
}

此过程中,插入成功返回1,插入失败返回0.

顺序(步骤):

(1)判断条件:

1.判断顺序表是否已满

2.判断插入的位置是否合法

(2)操作过程:

3.进行移位操作(空出插入位置)

4.直接赋值(插入)

5.使元素个数+1

图示如下:

5.删除元素ListDelete(L,i,x)

代码如下(示例):

int ListDelete(SeqList* L, int i, DataType* x) {
    //删除顺序表L中第i(0~size-1)个位置处的元素并保存到x中
    //删除成功返回1,删除失败返回0
    int j;
    if (L->size <= 0) {
        printf("顺序表已空无元素可删!\n");
        return 0;
    }
    else if (i<0 || i>L->size - 1) {
        printf("参数i不合法");
        return 0;
    }
    else {
        *x = L->list[i];        //保存删除元素到x中
        //从前向后依次前移
        for (j = i + 1; j <= L->size - 1; j++)
        {
            L->list[j - 1] = L->list[j];
        }
        L->size--;
        return 1;
    }
}

此过程中,删除成功返回1,删除失败返回0.

顺序(步骤):

(1)判断条件:

1.判断顺序表是否有元素可删

2.判断i是否合法

(2)操作过程:

3.使用变量x带走删除值

4.后续相应元素进行前移

5.使元素个数-1

图示如下:

6.取元素ListGet(L,i,x)

代码如下(示例):

int ListGet(SeqList L, int i, DataType* x) {
    //取顺序表L中第i个元素存于x中,成功返回1,失败返回0
    if (i<0 || i>L.size - 1) {
        printf("参数i不合法!\n");
        return 0;
    }
    else {
        *x = L.list[i];
        return 1;
    }
}

说明:取元素操作与删除元素操作类同,但更简单,取元素操作只需取元素list[i]到参数x中。

7.小试牛刀

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define MaxSize 100
typedef struct Student {
    long number;    //学号数据项
    char name[10];    //姓名数据项
    char sex[3];    //性别数据项
    int age;        //年龄数据项
}StudentType;        //定义学生信息结构体
    
typedef StudentType DataType;    //定义DataType
#include"SeqList.h" //包含顺序表头文件

void main(void) {
    SeqList myList;
    int i;
    StudentType x[3] = { {2000001,"张三","男",20},{2000002,"李四","男",21},{2000003,"王五","女",22} };
    StudentType s;

    ListInitiate(&myList);    //初始化函数调用
    ListInsert(&myList, 0, x[0]);    //插入函数调用
    ListInsert(&myList, 1, x[1]);
    ListInsert(&myList, 2, x[2]);

    for (i = 0; i < ListLength(myList); i++) {    //当前元素个数函数调用
        ListGet(myList, i, &s);                    //取元素函数调用
        printf("%d    %s    %s    %d\n", s.number, s.name, s.sex, s.age);
    }
}

运行结果:


总结

        顺序表是一种基于顺序存储结构的数据结构,通过数组来表示元素的连续存储空间。顺序表具有快速访问任意位置的元素的优势,适用于对元素的随机访问较频繁的场景。

        在顺序表中,插入和删除元素的操作可能需要移动大量的元素,导致操作的时间复杂度较高。此外,顺序表的大小是固定的,一旦存储空间被占满,就无法再插入新的元素。

        总的来说,顺序表是一种简单而常见的数据结构,适用于需要快速访问元素和对存储空间连续性要求较高的场景。然而,需要注意在插入和删除操作频繁的情况下,可能会影响性能。

        通过顺序表,我们可以实现元素的插入、删除、查找等基本操作,并通过下标来快速定位元素。掌握顺序表的操作,对于理解和应用其他数据结构也具有重要的意义。

        通过使用顺序表,我们可以高效地组织和处理大量的数据,提高程序的运行效率和开发效率。要根据具体的需求选择合适的数据结构,以便在不同的场景中充分发挥其优势。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1128917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js 导出文字到txt文件

简介&#xff1a; js 导出文字到txt文件 效果展示&#xff1a; 代码示例&#xff1a; /*** 导出文字到txt文件* param filename* param text*/ function exportToTxt(filename, text) {if (filename undefined) {filename "example-";}if (text undefined) {tex…

【IDEA配置】IDEA配置

参考视频&#xff1a;【idea必知必会】优化设置 告别卡顿 1. 显示内存 右击底下空白区域&#xff0c;出现memory indicator内存指示器&#xff0c;点击勾选即可显示。有的是在Settings->Appearance->Window Options里&#xff0c;如图所示&#xff1a; 2. 内存设置 …

傻瓜式调用阿里云的接口进行三要素(姓名、手机号和身份证号)校验

傻瓜式调用阿里云的接口进行三要素&#xff08;姓名、手机号和身份证号&#xff09;校验 一、准备1、购买阿里云的三要素核验套餐包2、申请开通三要素一致性核验3、查看AccessKey 二、调用三要素核验接口1、查看接口文档2、查看阿里云的调用示例3、阿里云完整示例代码4、改造后…

高级深入--day39

(实战项目三)新浪网分类资讯爬虫 爬取新浪网导航页所有下所有大类、小类、小类里的子链接&#xff0c;以及子链接页面的新闻内容。 效果演示图&#xff1a; items.py import scrapy import sys reload(sys) sys.setdefaultencoding("utf-8")class SinaItem(scrapy.I…

STM32Cube高效开发教程<基础篇>(七)----基础定时器

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。    本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。 一、 概述 STM…

new Vue() 发生了什么?

目录 前言 用法 代码和效果图 效果图 理解 高质量的使用 前言 Vue.js是一个流行的JavaScript前端框架&#xff0c;用于构建单页面应用&#xff08;SPA&#xff09;和用户界面。当我们使用new Vue()来创建一个Vue实例时&#xff0c;Vue会执行一系列的初始化过程&#xff0…

Tomcat 和 HTTP 协议

目 录 HTTP 协议HTTP 是什么理解 HTTP 协议的工作过程抓包结果HTTP请求HTTP响应 HTTP 请求 (Request)认识 URL认识 "方法" (method)认识请求 "报头"&#xff08;header&#xff09;认识请求 "正文" (body) HTTP 响应认识 "状态码" (st…

NFS性能瓶颈分析

前言 atop – run it with -d option or press d to toggle the disk stats view. iostat – try it with the -xm 2 options for extended statistics, in megabytes, and in two-second intervals. iotop – top-like I/O monitor. Try it with the -oPa options to show the…

Redis数据类型——list类型数据的扩展操作

1.list阻塞式数据获取 2.list类型数据业务场景

基于蜻蜓算法的无人机航迹规划-附代码

基于蜻蜓算法的无人机航迹规划 文章目录 基于蜻蜓算法的无人机航迹规划1.蜻蜓搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用蜻蜓算法来优化无人机航迹规划。 1.蜻蜓搜索算法 …

华盛顿特区选举委员会:黑客可能已侵入整个选民名册

导语 近日&#xff0c;华盛顿特区选举委员会&#xff08;DCBOE&#xff09;传来了一条令人担忧的消息&#xff1a;黑客可能已经侵入了整个选民名册。这一事件引发了公众的广泛关注和担忧。本文将为大家详细介绍这一事件的经过以及可能带来的后果&#xff0c;并探讨选民数据的保…

KekeBlog项目实战后台模块(二)(已完结)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…

Python与Appium实现手机APP自动化测试的示例代码

本文主要介绍了Python与Appium实现手机APP自动化测试的示例代码&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 1.什么是Appium appium是一个开源的测试自动化框架&#xff0c;可以与原生的、混合的和移…

借助文心大模型4.0轻松搞定中文语境,生成技术视频十分强悍,并能自主添加各种方言!

在10月17日的百度世界2023上&#xff0c;文心大模型4.0版本正式发布&#xff01;百度直接放话&#xff1a;文心大模型4.0是目前最强大的文心大模型。会上百度董事长李彦宏为我们展示了文心大模型4.0在搜索、地图、商业智能、智能会议、智能视频、多轮对话方面的强悍。那文心大模…

【vue3+ts】@设置别名

新建的vue3ts项目&#xff0c;建路由的时候报错&#xff1a; 在vite.config.ts中新增如下代码&#xff1a; import { defineConfig } from vite import vue from vitejs/plugin-vue import path from "path" // https://vitejs.dev/config/ export default defineC…

1990-2021年上市公司债务融资成本数据(原始数据+stata处理代码+计算结果)

1990-2021年上市公司债务融资成本数据&#xff08;原始数据处理代码计算结果&#xff09; 1、时间&#xff1a;1990-2021年 2、来源&#xff1a;上市公司年报 3、指标&#xff1a;编码、年份、证券代码、短期借款、长期借款、应付债券、长期应付款、负债合计、行业代码、财务…

实现基于 Jenkins 的多服务器打包方案

实现基于 Jenkins 的多服务器打包方案 在实际项目中&#xff0c;我们经常会遇到需要将一个应用程序或服务部署到不同的服务器上的需求。而使用 Jenkins 可以很方便地自动化这个过程。 设置参数 首先&#xff0c;我们需要设置一些参数&#xff0c;以便在构建过程中指定要部署…

vue项目中隐藏右侧滑动栏,使用鼠标滚轮滑动

直接加一个样式&#xff0c;就什么也不用管了 ::-webkit-scrollbar {display: none; }

解决windows中安装VMware后宿主机wifi网卡无法正常使用的问题

问题描述 笔者在安装了 VMware16 后&#xff0c;出现了宿主机托盘中的wifi图标消失、宿主机无法上网、设备管理器中wifi网卡出现43代码错误等情况。在网上搜索良久&#xff0c;找到的解决方法大多为卸载 VMware16 然后清除注册表中的VMware记录等操作&#xff0c;参考性不是很…

数据结构和算法(14):串

串及串匹配 串或字符串&#xff08;string&#xff09;属于线性结构&#xff0c;可直接利用向量或列表等序列结构加以实现&#xff1a;结构简单&#xff0c;规模庞大&#xff0c;元素重复率高。 串 由 n 个字符构成的串记作&#xff1a; S " a 0 a 1 . . . a n − 1 &…