数据结构与算法1—线性表

news2024/10/6 1:48:45

1. 线性表的定义

  • 线性表L是n(n≥0)个具有相同属性的数据元素a1,a2,a3,…,an组成的有限序列,其中序列中元素的个数n称为线性表的长度。
  • 当n=0时称为空表,即不含有任何元素。
  • 常常将非空的线性表L(n>0)记作:L=(a1,a2,…an)
  • 其中ai-1为ai的直接前驱,ai+1为ai的直接后继。a1为表头元素,an为表尾元素。
  • 线性表(Linear list)是最简单且最常用的一种数据结构,其逻辑结构为线性结构。

  • 线性表具有下列特点:

    存在唯一的一个没有前驱的(头)数据元素;

     存在唯一的一个没有后继的(尾)数据元素;

    每个数据元素(除表头元素)均有一个直接前驱;

    每个数据元素(除表尾元素)均有一个直接后继;

    表中数据元素的类型是相同的

2. 线性表的基本运算

数据结构的运算是定义在逻辑结构层次上的,而运算的具体实现则是建立在存储结构上的。

(1)初始化线性表L:InitList(L)

(2)求线性表L的长度:GetLength(L)

(3)按序号取元素:GetNode(L,i)

(4)按值查找:LocateList(L,e)

(5)插入新元素:InsertList(L,i,e)

(6)在线性表中删除元素:DeleteList(L,i)

(7)把已有线性表置为空表:ClearList(L)

3. 线性表的实现

  • 顺序表在具体实现时,一般用高级语言中的数组来对应连续的存储空间。设最多可存储MaxLen个元素,在C语言中可用数组data[MaxLen]来存储数据元素,为保存线性表的长度需定义一个整型变量length。
  • 线性表的第l,2,…,n个元素分别存放在此数组下标为0,1,…,length-1数组元素中,如下图所示

c语言示例:

#include<stdio.h>

# define MaxLen 100

typedef struct
{
    int no;
    int score;
}DataType;

typedef struct
{
    DataType data[MaxLen];  // 定义存储表元素的数组
    int length;
}SeqList;

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

// 顺序表的创建
void CreatList(SeqList *p){
    int i = 0;
    DataType x;
    printf("请输入学号和成绩,以学号-1为结束:\n");
    scanf("%d",&x.no);
    while(x.no!=-1)
    {
        scanf("%d",&x.score);
        p->data[i]=x;
        scanf("%d",&x.no);
        i++;
    }
    p->length=i;
}

// 顺序表中插入元素
void InsertList(SeqList *p, int i, DataType x){
    for(int j=p->length-1; j>i-1; j--){
        p->data[j+1] = p->data[j];
    }
    p->data[i-1] = x;
    p->length++;
}

// 按序号顺序表中元素
DataType GetNode(SeqList *L, int i){
    if(i<1 || i>L->length) printf("position error\n");
    return L->data[i-1];
}

// 在顺序表中查找元素
int LocateList(SeqList *p, int no)
{
    int i = 0;
    while(i<p->length && p->data[i].no != no)
        i++;

    if(i<p->length)  return i+1;  //第i+1个元素,i从0开始
    else return -1;
}

// 修改第i个元素
void EditList(SeqList *p,int i,DataType e)
{
    if(i<1 || i>p->length)     
    { 
       printf("position error\n");
    }
    p->data[i-1]=e;
}

// 删除第i个元素
void DeleteList(SeqList *L,int i) 
{
    if(i<1 || i>L->length)     
    { 
       printf("position error\n");
    }
   for(int j=i;j<=L->length-1;j++)
      //向前移动元素
      L->data[j-1]=L->data[j];  
   L->length--; 
}

void PrintList(SeqList *p)
{
    int i;
    for(i=0;i<p->length;i++)
        printf("[%d,%d]\n",p->data[i].no,p->data[i].score);
    printf("\n");
}

void main(){
    SeqList L;
    DataType e;

    InitList(&L);
//创建
    CreatList(&L);
    PrintList(&L);
//插入
    e.no=9;  e.score=80;
    InsertList(&L,L.length+1,e);
    printf("插入后:\n");
    PrintList(&L);
//查询
    int i=LocateList(&L,3);
    if (i>0)
        printf("学号为3的成绩: %d \n",GetNode(&L,i).score);
    else
        printf("Can't find the elem.\n");
//修改
    e.no=3;  e.score=65;
    int m=LocateList(&L,3);
    EditList(&L,m,e);
    printf("修改后:\n");
    PrintList(&L);
//删除
    int k=LocateList(&L,2);
    DeleteList(&L,k);
    printf("删除学号为2的记录后:\n");
    PrintList(&L);
}

4. 线性表的顺序存储结构的特点

优点:顺序表中的任意数据元素的存储地址可由公式直接导出,因此顺序表可以“随机存取”其中的任意元素。

不足:

  • 需预先分配相应的存储空间。预分配空间过小,存储空间不便于扩充;预分配空间过大,容易造成空间浪费。
  • 插入与删除运算的效率很低,插入、删除操作时需移动大量数据。

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

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

相关文章

express接口

文章目录什么是接口创建 API 路由模块编写 GET 接口编写 POST 接口完整代码CORS 跨域资源共享使用 CORS 中间件解决跨域问题实现 JSONP 接口什么是接口 API (Application Programming Interface&#xff0c;应用程序编程接口 ) 是一些预先定义的函数&#xff0c;目的是提供应用…

TCP/IP 网络模型有哪几层

备注&#xff1a;本文参考小林coding相关内容&#xff0c;侵权请联系作者删除 1.应用层 最上层的&#xff0c;也是我们能直接接触到的就是应用层&#xff08;Application Layer&#xff09;&#xff0c;我们电脑或手机使用的应用软件都是在应用层实现。那么&#xff0c;当两个…

高并发系统设计 -- 登录系统设计

同源策略 同源策略是一种安全策略。是游览器最核心最基本的安全功能。防止XSS&#xff0c;CSFR等攻击具体表现是游览器在执行脚本之前&#xff0c;会判断脚本是否与打开的网页是同源的&#xff0c;也就是协议&#xff0c;域名&#xff0c;端口是否都相同&#xff0c;相同就是同…

记录--前端性能监控初步实战

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 在当下前后端分离的主流环境下&#xff0c;前端部分的优化变得越来越重要。为了提升前端的性能和用户体验&#xff0c;我觉得可能需要从三个维度采集数据进行分析。 前端埋点。通过埋点收集和统计…

SCRM与CRM的区别

当私域流量的概念兴起时&#xff0c;企业直接触达用户的场景也越来越丰富&#xff0c;SCRM形式的私域运营已然成为很多企业数字化转型布局的关键阵地。 前言 当私域流量的概念兴起时&#xff0c;企业直接触达用户的场景也越来越丰富&#xff0c;SCRM形式的私域运营已然成为很多…

服务器部署所有前后端分离项目

1、Linux服务器安装好jdk、mysql、redis、node 2、拉取最新代码 gitee仓库项目地址&#xff1a;https://gitee.com/y_project/RuoYi-Vue 拉取代码到本地 3、修改后端配置 3.1、修改系统内上传文件位置的配置&#xff1a; 默认是windows系统的配置&#xff0c;将此配置修改…

JMeter接口测试使用教程哪里有?

JMeter接口测试使用教程哪里有&#xff1f;接口测试是测试工程师的必备技能之一&#xff0c;运用JMeter工具一步步实现接口请求&#xff0c;数据参数化&#xff0c;断言等操作&#xff0c;通过常见的企业实际测试场景详解JMeter各项技术使用&#xff0c;最后结合Jenkins持续集成…

Django搭建个人博客Blog-Day01

创建虚拟环境虚拟环境相当于一个抽屉&#xff0c;在这个抽屉里面安装的任何软件&#xff0c;都不会影响到其他抽屉&#xff0c;所以利用虚拟环境就可以做到同时安装不同版本的第三方库&#xff0c;而互不影响。使用虚拟环境的目的是为了防止一些第三方库出现版本不兼容问题&…

c++11 标准模板(STL)(std::forward_list)(五)

定义于头文件 <forward_list> template< class T, class Allocator std::allocator<T> > class forward_list;(1)(C11 起)namespace pmr { template <class T> using forward_list std::forward_list<T, std::pmr::polymorphic_…

当我们在谈论DataOps时,我们到底在谈论什么

1. DataOps到底是什么&#xff1f; 伴随着全球数字化转型的高速发展&#xff0c;在云计算、物联网、5G、边缘计算、元宇宙等新技术的驱动下&#xff0c;数据爆炸的时代已经来临。IDC Global DataSphere显示&#xff0c;2021年&#xff0c;全球数据总量达到了84.5ZB&#xff0c…

Java多线程案例——阻塞队列(生产者消费者模型)

一&#xff0c;阻塞队列1.阻塞队列的概念和作用阻塞队列同数据结构中的队列一样都遵守“先进先出”的原则&#xff08;不了解队列相关知识的朋友请查看之前队列的博文&#xff1a;(6条消息) 栈和队列&#xff08;内附模拟实现代码&#xff09;_徐憨憨&#xff01;的博客-CSDN博…

功率放大模块如何选择(安泰功率放大器模块产品介绍)

功率放大器模块系列产品介绍 一、功率放大模块介绍 功率放大模块&#xff1a; 功率放大模块具有体积小&#xff0c;集成度高&#xff0c;使用方便&#xff0c;应用广泛等优点&#xff0c;凭借着输出频率广、输出电压高、输出功率大等特性&#xff0c;能够广泛应用在各种领域…

动态范围控制原理

DRC介绍 开门见山&#xff0c;动态范围的定义就是信号的最大幅值和最小幅值比值的对数(单位dB)&#xff0c; 动态范围会受到系统中各个环节的影响。例如同样是这段音乐&#xff0c;在一个40dB背景噪声的环境中播放&#xff0c;那么由于掩蔽效应等因素的影响&#xff0c;最终实际…

前端跳转第三方网页中间页

前端跳转安全提示 掘金跳转中间页背景介绍跳转过渡页的优点实现原理解析哈喽啊小伙伴们久等了 消失了有半年了 &#xff0c;因为个人工作原因没腾出时间给大家分享日常踩坑和特殊功能的讲解。不过这次我回来了就要好好分享了背景介绍 前端小伙伴一定知道CSDN 和 稀土掘金 两大…

Dev-C++下载安装详细教程

文章目录前言一、下载Dev-C二、安装Dev-C三、使用Dev-C打印HelloWorld总结前言 本文总结了关于Dev-C下载与安装的详细过程&#xff0c;并使用Dev-C打印了“Hello World!”。本篇博客面向C语言初学者&#xff0c;或者考研复试的学生使用&#xff0c;因为大部分学校的考研复试都使…

为什么 TCP 建立连接需要三次握手

TCP 协议是我们几乎每天都会接触到的网络协议&#xff0c;绝大多数网络连接的建立都是基于 TCP 协议的&#xff0c;学过计算机网络或者对 TCP 协议稍有了解的人都知道 —— 使用 TCP 协议建立连接需要经过三次握手&#xff08;three-way handshake&#xff09;。 如果让我们简…

多线程案例-线程池

1.什么是线程池线程存在的意义是当使用进程进行并发编程太重了,此时引入了一个"轻量级的"进程-线程.创建线程比创建进程更高效,销毁线程比销毁进程更高效,调度线程比调度进程更高效..此时我们就用多线程来代替进程进行并发编程了,但是随着对性能的要求的提高,线程相对…

大数据必学Java基础(一百一十八):什么是Maven和它的下载整合

文章目录 什么是Maven和它的下载整合 一、什么是Maven 二、IDEA默认整合了Maven 三、下载地址

【Linux】RHEL8 中nmcli使用,必备!

redhat8中nmcli日常使用 第 2 章 配置以太网连接 Red Hat Enterprise Linux 为管理员提供不同的选项来配置以太网连接。例如&#xff1a; 在命令行中使用 nmcli 配置连接。使用 nmtui 在基于文本的用户界面中配置连接。使用 RHEL 系统角色在一个或多个主机上自动配置连接。使…

电脑小问题:定时关机的设置

设置定时关机生活中&#xff0c;我们有时候需要对电脑进行定时关机。那么&#xff0c;如何设置定时关机呢&#xff1f;步骤如下&#xff1a; 1. 按 win R &#xff0c;弹出命令窗口&#xff0c;输入 taskschd.msc &#xff0c;点击确定。 2. 弹出任务计划程序窗口&#xff0c;…