数据结构_线性表

 线性表的定义和特点

线性表是具有相同特性的数据元素的一个有限序列

(a_{1},a_{2},a_{3},......a_{i-1},a_{i},a_{i+1},....a_{n})

a{_{1}}:线性起点/起始节点

a_{i-1} :a_{i}直接前驱

a_{i+1} :a_{i}直接后继

a_{n}:线性终点/终端节点

n:元素总个数,表长

下标:是元素的序号,表示元素在表中的位置

n=0时称为空表

线性表

由n(n>0)个数据元素(结点),a_{1},a_{2},...a_{n}组成的有限序列

将非空的线性表(n>0)记作:(a_{1},a_{2},...a_{n})

这里的数据元素a_{i}(1\leq i\leq n)只是一个抽象的符号,其具体含义在不同的情况下,可以不同

例1

分析26个英文字母组成的英文表

        (A,B,C...Z)

数据元素都是字母,元素间关系是线性关系

例2

分析学生情况登记表

每条记录也是线性关系

例3

某单位历年拥有计算机的数量(4,6,45,34,33) 线性关系(先后)

例4 

12星座 (白羊座,金牛座,...双鱼座) 线性关系(先后)

同一线性表的元素必定有相同特性,数据元素之间的关系是线性关系

综上 线性表的逻辑特征是:
在非空的线性表中,有且一个开始节点a_{1},它没有直接前趋,仅有一个后继a_{2}

在非空的线性表中,有且一个终端节点a_{n},它没有直接后继,仅有一个前趋a_{n-1}

其余节点a_{i}(2\leq i\leq n-1) 仅有一个前趋a_{i-1},仅有一个后继a_{i+1}

线性表是一种典型的线性结构

线性表案例

例1

一元多项式的运算:实现两个多项式加,减,乘运算

P_{n}(x) = p_{0} + p_{1}x + p_{2}x^{2} + ... + p_{n}x^{n}

线性表P=(p_{0},p_{1},p_{2},...,p_{n})

每一项的指数i隐含在其系数p_{i}的序号中

用数组来表示

P(x) = 10 + 5x - 4x^{2} + 3x^{3} + 2x^{4}

指数用下标表示,系数用具体值表示

操作

两个多项式相加

R_{n}(x) = P_{n}(x) + Q_{m}(x)

线性表R  = (p_{0} + q_{0},p_{1} + q_{1},p_{2} + q_{2},...p_{n} + q_{m...})

例2:稀疏多项式

S(x) = 1 + 3x^{10000} + 2x^{20000}

如果用前面下标代表指数,会造成空间浪费

多项式非零项的数组表示

A(x) = 7 + 3x + 9x^{8} + 5x^{17}

B(x) = 8x + 22x^{7} - 9x^{8}

线性表  P = ((p1,e1),(p2,e2),(p3,e3),....(pm,em))

线性表A=((7,0),(3,1),(9,8).(5,17))

线性表B=((8,1),(22,7),(-9,8))

创建一个新数组c

分别从头遍历比较a和b的每一项

指数相同,对应系数相加,若其和不为0,则在c中加一个新项

指数不相同,则将指数较少的项复制到c中

一个多项式遍历完毕时,将另一个剩余项依次复制到c即可

缺陷:并不知道数组c的空间要分配多少

顺序存储结构存在问题

存储空间分配不灵活

运算的空间复杂度高(需要额外的空间)

解决问题

链式存储结构 后续详细介绍

例3:图书信息管理系统

需要的功能: 增(插入)删改查排序计数

图书表抽象为线性表

表中每本书抽象成线性表中的数据元素

图书顺序表:数组存储

图书链表:链表存储

选择适当的存储结构

实现此存储结构上的基本操作

利用基本操作完成功能

总结:

线性表中数据元素的类型可以为简单类型,也可以为复杂类型

许多实际应用问题所涉及的基本操作有很大相似性,不应为每个具体应用单独编写一个程序

从具体应用中抽象出共性的逻辑结构和基本操作(抽象数据类型),然后实现其存储结构和基本操作

线性表的类型定义

抽象数据类型线性表的定义如下:

ADT List{

        数据对象: D = {   a_{i} | a_{i}属于Elemset,(i=1,2,....,n,n\geq 0)  }

        数据关系: R = { <a_{i-1},a_{i}> | a_{i-1},a_{i} 属于D_{i} (i=2,3,....n)}

        基本操作:

                InitList(&L)

        略

} ADT List

基本操作:

初始化线性表

InitList(&L)

操作结构:构造一个空的线性表L

销毁线性表

DestroyList(&L)

初始条件:线性表L已经存在

操作结果:销毁线性表L

清除线性表

ClearList(&L)

初始条件:线性表L已经存在.

操作结果:将线性表L重置为空表

判断线性表是否为空

ListEmpty(L)

初始条件:线性表L已经存在

操作结果:若线性表L为空表,则返回Ture,否则返回False

返回线性表L的元素个数

ListLlenth(L)

初始条件:线性表L已经存在

操作结果:返回线性表L中的数据元素个数

返回线性表第i个元素的值

GetElem(L,i,&e);

初始条件:线性表L已经存在,1<=i <= ListLenth(L)

操作结果:用e 返回线性表L中第i个元素的值

返回L中第1个与e满足compare()的数据元素的位序

LocateElem(L,e,compare())

初始条件:线性表L已经存在,compare()是数据元素判定函数

操作结果:返回L中第1个与e满足compare()的数据元素的位序,若这样的数据元素不存在则返回值为0.

待补充

忘保存,明天补上

线性表的顺序表示和实现2

顺序表的特点:

以物理位置相邻表示逻辑关系

任一元素均可随机存取(优点)

用高级语言实现数据类型

用一维数组表示顺序表

线性表可变(删除)

数组长度不可动态定义

注:一维数组的定义方式

类型说明符 数组名[常量表达式]

说明:常量表达式中可以包含常量和符号常量,不能包含变量,, 即C语言中不允许对数组的大小做动态定义

解决方式:用一变量表示顺序表的长度属性

如下所示

c定义结构体

#define LIST_INIT_SIZE 100 
//线性表存储空间的初始分配量
//定义了一个结构体 ​SqList​,包含一个数组和一个整型变量 
typedef struct { Elem Type elem[LIST_INIT_SIZE];int length; //当前长度
} SqList;

实例

多项式的顺序存储结构类型定义

c实现

#define MAXSIZE 1000
//多项式可能达到的最大长度//结构体:多项式非零项定义
typedef struct {float p; //系数int e; //指数
} Polynomial;//结构体:多项式顺序存储结构
typedef struct{Polynomial *elem; //基地址int length; //当前项个数
} SqList;

图书表的顺序存储结构类型定义

#define MAXSIZE 10000
//图书表可能达到的最大长度//图书信息定义
typedef struct {char no[20]; //图书ISBNchar name[50]; //图书名字float price; //图书价格
} Book;//图书表顺序存储结构类型为SqList
typedef struct {Book *elem; //存储空间的基地址int length; //图书表中当前图书个数
}SqList; //图书表的顺序存储结构类型为SqList

补充知识:

元素类型说明

顺序表类型定义

类c

typedef struct {ElemType data[]; //ElemType一般是自定义的顺序表里的元素类型int length;
} SqList; //顺序表类型

ElemType一般是自定义的顺序表里的元素类型

如下所示

typedef strcut {float p;int e;
} Polynomial;typedef strcut {Polynomial *elem;int length;
}SqList;

数组定义

静态分配

typedef struct {ElemType data[MaxSize];int length;
} SqList; 

动态分配

typedef struct{ElemType *data;int length;
}SqList;

动态分配创建变量

#include <stdlib.h>
typedef struct{ElemType *data;int length;
}SqList;SqList L;
L.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize);
//MaxSize:数组最大长度 sizeof:获取类型长度 malloc分配固定长度的空间
//释放指针p所指变量的存储空间,即彻底删除一个变量
free(L.data)

c++动态存储分配

new 类型名(初值列表)

功能:申请用于存放T类型对象的内存空间,并根据初值列表赋初值

结果值;

成功:T类型的指针,指向新分配的内存

失败:0

int *p1 = new int;
int *p2 = new int(10);
delete p1;

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jenkins在使用pipeline时,为何没有方块形视图

项目场景&#xff1a; 安装完Jenkins时后&#xff0c;通过pipeline创建的项目任务。 问题描述 在立即构建后&#xff0c;没有显示每个阶段的视图。 原因分析&#xff1a; 原因是&#xff0c;刚安装的Jenkins&#xff0c;这个视图不是Jenkins自带的功能&#xff0c;而必须安装…

【计算机网络基础知识】

首先举一个生活化的例子&#xff0c;当你和朋友打电话时&#xff0c;你可能会使用三次握手和四次挥手的过程进行类比&#xff1a; 三次握手&#xff08;Three-Way Handshake&#xff09;&#xff1a; 你打电话给朋友&#xff1a;你首先拨打你朋友的电话号码并等待他接听。这就…

Selenium IDE 的使用指南

Selenium IDE 的使用指南 在自动化测试的领域中&#xff0c;Selenium 是一个广为人知且强大的工具集。而 Selenium IDE 作为其中的一个组件&#xff0c;为测试人员提供了一种便捷且直观的方式来创建和执行自动化测试脚本。 一、Selenium IDE 简介 Selenium IDE 是一个用于录…

二、从多臂老虎机看强化学习

二、从多臂老虎机看强化学习 2.1 多臂老虎机问题2.1.1 问题定义2.2.2 问题建模2.2.3 累积懊悔2.2.4 估计期望奖励 2.2 强化学习中的探索与利用平衡2.3 贪心策略2.4 上置信界算法2.5 汤普森采样算法 2.1 多臂老虎机问题 2.1.1 问题定义 在多臂老虎机(mutil-armed bandit, MAB)问…

深度神经网络语言识别

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础人工智能Python基础人工智能基础核心知识人工智能BI核心知识人工智能CV核心知识 使用 DNN 和字符 n-gram 对一段文本的语言进行分类&#xff08;附 Python 代码&#xff09; 资料来源&#xff0c;flaticon&#xff1a;htt…

开发一套java语言的智能导诊需要什么技术?java+ springboot+ mysql+ IDEA互联网智能3D导诊系统源码

开发一套java语言的智能导诊需要什么技术&#xff1f;java springboot mysql IDEA互联网智能3D导诊系统源码 医院导诊系统是一种基于互联网和3D人体的智能化服务系统&#xff0c;旨在为患者提供精准、便捷的医院就诊咨询服务。该系统整合了医院的各种医疗服务资&#xff1b;智慧…

20.【C语言】初识结构体(重要)

定义&#xff1a;由一批数据组合而成的结构型数据 作用&#xff1a;描述复杂对象&#xff0c;创建新的类型 格式&#xff1a; struct 对象 { …… } 介绍. 用法&#xff1a;结构体变量.成员变量 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> struct hotal…

nuxt、vue树形图d3.js

直接上代码 //安装 npm i d3 --save<template><div class"d3"><div :id"id" class"d3-content"></div></div> </template> <script> import * as d3 from "d3";export default {props: {d…

Facebook广告被拒:常见原因以及避免屏蔽的方法

大多数情况下&#xff0c;广告被屏蔽是因为违反了规则&#xff0c;这不仅仅是因为审核因素。有些规则并不明显&#xff0c;也没有在任何地方指定。例如&#xff0c;在广告中使用广告政策中未列出的停用词&#xff1b;审核算法确定照片描绘的模特过于暴露。下面小编将为你介绍Fa…

NET程序开发可能会用到的一些资料文档

NET程序开发使用的一些资料文件&#xff0c;NET高级调试&#xff0c;NET关键技术深入解析&#xff0c;WPF专业编程指南&#xff0c;程序员求职攻略&#xff0c;WPF编程宝典等。 下载链接&#xff1a;https://download.csdn.net/download/qq_43307934/89518582

【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(1)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

带安全启动—Ubuntu系统—手动安装Nvidia驱动

教程1&#xff1a;在启用安全启动的 Fedora 中安装英伟达驱动 教程2&#xff1a;UEFI安全启动模式下安装Ubuntu的NVIDIA显卡驱动 1. 搜索合适的驱动 Nvidia驱动官网 选择这个 驱动(.run)链接 2. 安装必要的软件依赖 CUDA底层用C写的&#xff0c;因此导入编译器 sudo apt i…

RabbitMQ入门教程(精细版二带图)

目录 六 RabbitMQ工作模式 6.1Hello World简单模式 6.1.1 什么是简单模式 6.1.2 RabbitMQ管理界面操作 6.1.3 生产者代码 6.1.4 消费者代码 6.2 Work queues工作队列模式 6.2.1 什么是工作队列模式 6.2.2 RabbitMQ管理界面操作 6.2.3 生产者代码 6.2.4 消费者代码 …

【hive】数据采样

参考https://hadoopsters.com/how-random-sampling-in-hive-works-and-how-to-use-it-7cdb975aa8e2&#xff0c;可以直接查看原文&#xff0c;下面只是对原文进行概括和实际性能测试。 1.distribute by sort by2.测试3.map端数据过滤优化采样 在说数据采样之前&#xff0c;需要…

浅析基于量子成像的下一代甚高灵敏度图像传感器技术

高灵敏度探测成像是空间遥感应用中的一个重要技术领域&#xff0c;如全天时对地观测、空间暗弱目标跟踪识别等应用&#xff0c;对于甚高灵敏度图像传感器的需求日益强烈。随着固态图像传感器技术水平的不断提高&#xff0c;尤其背照式及埋沟道等工艺的突破&#xff0c;使得固态…

2021-06-15 protues(ISIS)脉冲发生器仿真仪表使用

缘由这个脉冲发生器怎么连线_编程语言-CSDN问答

【C++】 解决 C++ 语言报错:Invalid Cast

文章目录 引言 无效类型转换&#xff08;Invalid Cast&#xff09;是 C 编程中常见且严重的错误之一。当程序试图进行不合法或不安全的类型转换时&#xff0c;就会发生无效类型转换错误。这种错误不仅会导致程序崩溃&#xff0c;还可能引发不可预测的行为。本文将深入探讨无效…

利用MATLAB绘制傅里叶变换后的图形

题目如下&#xff0c;其中周期是 2 π 2\pi 2π y { 1 0 < x < π 0 x 0 − 1 − π < x < 0 y\begin{cases} 1 \ 0<x<\pi\\ 0 \ x0\\ -1 \ -\pi <x<0\\ \end{cases} y⎩ ⎨ ⎧​1 0<x<π0 x0−1 −π<x<0​ 计算可得 a n 1 π ∫ −…

CNN文献综述

卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;是深度学习领域中的一种重要模型&#xff0c;主要用于图像识别和计算机视觉任务。其设计灵感来自于生物学中视觉皮层的工作原理&#xff0c;能够高效地处理图像和语音等数据。 基本原理…

VPSA制氧设备在不同行业的应用解析

VPSA制氧设备以其独特的吸附原理&#xff0c;能够在穿透大气压的条件下&#xff0c;通过专用的分子筛选择性吸附空气中的氮气、二氧化碳和水等杂质&#xff0c;从而制得纯度较高的氧气。本文将探讨VPSA制氧设备在不同行业中的应用及其重要性。 一、钢铁行业 在钢铁行业中&#…