10.线性表代码实战

10.1 与408关联解析及本节内容介绍

链表比顺序表出现的顺序更加的频繁。

10.2线性表地顺序表示原理解析

 线性表的特点:

(1)表中的元素的个数是有限的

(2)表中元素的数据类型相同。意味着每一个元素占用相同大小的空间。

(3)表中元素具有逻辑上的顺序性,在序列中的个元素排序有先后顺序。

线性表是逻辑存储结构。

 使用数组(顺序存储)来实现的

数组:

可以随机存取(根据初始地址和元素序号)表中的任意一个元素

线性表的顺序表示简称顺序表

 

 

 

 原来是7个元素,但是你是可以插入到第8个位置的。

 意思就是数组第j个位置的数放到j+1个位置,第i-1个位置的放到第i个位置,

再在空出的i-1个位置处放入x。

删除操作:

 

把删除的元素赋值给e,保存下来。

空间没有被释放,因为数组一开始申请的时候已经定义好了。

另外一种实现顺序表的方法(动态分配) 

不应去定义数组,而是去定义指针。

10.3顺序表的初始化及插入操作实战

因为是实战,全程手撸代码,是C++可执行文件

 建议直接使用静态分配,动态空间容易出错(要用malloc申请空间),无非是一个在堆空间,一个是在栈空间。

驼峰命名法需要每个首字母大写

 下面我将展示顺序表的插入实战代码及其解析:

#include <stdio.h>

#define MaxSize 50
typedef int ElemType;
typedef struct{
    ElemType data[MaxSize];
    int length;//顺序表长度
}SqList;
//让顺序表存储其他类型元素时,可以快速完成代码修改,就是如果说改成char类型,通过别称只需要改动这一个就行


bool ListInsert(SqList &L,int  i,ElemType element){  //判断 i 是否合法
if(1>i || i>L.length+1){ //判断插入的位置是否合法

    return false;
}
//如果存储空间满了,不能插入
if(L.length>=MaxSize){  //超出空间了
    return false;
}
//把后面的元素依次往后移动,空出位置,
for(int j=L.length;j>=i;j--){
    L.data[j]=L.data[j-1];}//移动顺序表中的元素
    L.data[i-1]=element;  //放入要插入的元素
    L.length++;  //顺序表要加1
    return true;
}

//打印函数输出
void PrintList(SqList L){
    int i;
    for(i=0;i<L.length;i++){
        printf("%3d",L.data[i]); //为了打印到一行
    }
    printf("\n");
}

//主函数部分
int main() {
    SqList L;//定义一个顺序表,变量L

    bool ret;//ret用来装函数的返回值
    L.data[0]=1; //放置元素
    L.data[1]=2;
    L.data[2]=3;
    L.length=3;  //设置长度
    ret=ListInsert(L,2,60);//第一个是顺序表名L,第二个是要插入的位置,第三个是元素
    if(ret){
        printf("insert sqlist success\n");
        PrintList(L);
    }else{
        printf("insert sqlist failure");
    }
    return 0;
}

结果展示:

10.4顺序表的删除及查询

因为结构体,我们删除的时候会改变数组的值和长度,所以要加上引用,

删除的元素需要带出来,所以要加上引用。

子函数一旦走到return就结束了

实参和形参的值可以不一样

bool ListDelete(SqList &L,int  i,ElemType &e){  //判断 i 是否合法
    if(1>i || i>L.length){ //判断删除的位置是否合法

        return false;
    }
//把后面的元素依次往后移动,空出位置,
    e=L.data[i-1]; //获取顺序表中对应的元素,赋值给e
    for(int j=i;j<L.length;j++){
        L.data[j-1]=L.data[j];}//移动顺序表中的元素

    L.length--;  //顺序表要加1

    return true;
}
int LocateElem(SqList L,ElemType e){
    int i;
    for(i=0;i<L.length;i++){
        if(L.data[i]==e){
            return i+1;  }//i+1就是数组在顺序表中的位置
    }
}

主函数如下:

int main() {
    SqList L;//定义一个顺序表,变量L
    int del;
    bool ret;//ret用来装函数的返回值
    L.data[0]=1; //放置元素
    L.data[1]=2;
    L.data[2]=3;
    L.length=3;  //设置长度
    ret=ListDelete(L,1,del);//第一个是顺序表名L,第二个是要插入的位置,第三个是元素
    if(ret){
        printf("delete succcess \n");
        printf("deleted item value is %d\n",del);
        PrintList(L);
    }else{
        printf("delete failure");
    }
    ret=LocateElem(L,1);
    if(ret){
        printf("find success\n");
        printf("element position is %d\n",ret);
    }else{
        printf("查找失败\n");
    }
    return 0;
}

10.5线性表的链式存储

顺序表是线性表的线性存储,由于线性表占用了一段连续的存储空间(造成了很多碎片),数组的大小也不好确定,插入和删除移动了大量元素。

数组申请了50个空间,只用了3个,造成大量碎片。

 

 结构体里面用到了LNode,所以要事先声明结构体名称为LNode.

最后一个next指针域存储的是NULL

 

 在a1前面还放了一个结点

头指针:链表中第一个结点的存储位置,用来标识单链表。

头节点:在单链表第一个结点之前附加的一个结点,为了操作上的方便。

 

(1)表头插入

(2)中间插入

 

 

p->next指向的是ai的位置赋给了q->next。

 

p->next=q

再把q指针赋给p->next

中间的先就可以去掉了

(3)表尾插入元素

 q的指针域是空值

p的指针域位置指向q

接下来我们来看单链表删除操作

 (1)表头删除元素

 

把q的指针位置就是a2赋给p的指针位置。

 这就叫做断链。

(2)中间删除元素(表尾删除元素)跟前面差不多。

查找操作:

(1)按照序号查找

 

 10.6OJ  作业说明

 我们把输入,输出这样的一种组合,称为一个测试用例。

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Dism++和360安全卫士搞定Windows10离线升级

Windows10有很多版本&#xff0c;常见的由1903、1909、20H1、21H2等&#xff0c;在离线状态下&#xff0c;很难下载到匹配的升级补丁。期间尝试多种方法均失败&#xff0c;最后用Dism和360安全卫士组合拳搞定。 1、使用下载补丁&#xff0c;升级失败 比如这里介绍了常见补丁&a…

【SL101】 传感器接入chirpstack平台

【SL101】 传感器接入chirpstack平台使用硬件SL100工程师答疑chirpstack 中 net-server 使能 80-87 频段网关开启80-87 频段设备传感器端配置频点连接成功测试结果---chirpstackSL100系列温湿度传感器产品&#xff08;墨水屏版&#xff09;接入chirpstack 平台笔记记录 使用硬件…

mysql学习之数据系统概述

☀️马上要成为打工人&#xff0c;这几天把前面的知识都捡了捡&#xff0c;发现自己对关系数据库这块的学习还有所缺失&#xff0c;于是本章开始学习mysql 这里写目录标题1. 数据库系统的发展1.1 人工管理阶段1.2 文件系统阶段1.3 数据库阶段1.4 大数据阶段2 数据库系统的组成2…

了解这7个Node.js库,让你的开发效率提升不止一点点

Node.js是一个流行的JavaScript运行时环境&#xff0c;拥有庞大的生态系统和丰富的库&#xff0c;使得在Node.js上构建高效、可靠的应用程序变得非常容易。在这篇文章中&#xff0c;我们将分享七个有用的Node.js库&#xff0c;它们可以提高您的工作效率&#xff0c;让您更轻松地…

android:手搓一个即时消息聊天框(包含消息记录)

先看一下效果 1.后端 要实现这个&#xff0c;先说一下后端要实现的接口 1.创建会话id 传入“发送id”和“接收id”给服务端&#xff0c;服务端去创建“会话id” 比如 get请求&#xff1a;http://xxxx:8110/picasso/createSession?fromUserId1&toUserId2 返回seesionId…

【SSconv:全色锐化:显式频谱-空间卷积】

SSconv: Explicit Spectral-to-Spatial Convolution for Pansharpening &#xff08;SSconv&#xff1a;用于全色锐化的显式频谱-空间卷积&#xff09; 全色锐化的目的是融合高空间分辨率的全色&#xff08;PAN&#xff09;图像和低分辨率的多光谱&#xff08;LR-MS&#xff…

HTML5 Web 存储

HTML5 Web 存储 在HTML5之前&#xff0c;主要是使用cookies存储&#xff0c;cookies的缺点有&#xff1a;需要在请求头上带着数据&#xff0c;存储大小不过&#xff0c;在4k之内。本节&#xff0c; HTML5 web 存储&#xff0c;一个比cookie更好的本地存储方式。 什么是 HTML5 …

Redis技术详解

Redis技术详解 Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存&#xff0c;事件发布或订阅&#xff0c;高速队列等场景。支持网络&#xff0c;提供字符串&#xff0c;哈希&#xff0c;列表&#xff0c;队列&#xff0c;集合结构直接存取&#xff0c;基于内存&…

Proxmox VE 超融合集群虚拟的NFS服务性能很差的问题解决

作者&#xff1a;田逸&#xff08;formyz&#xff09; 场景描述 五节点Proxmox VE集群&#xff0c;万兆网络,数据网络与存储网络独立&#xff0c;接口两两bond&#xff0c;交换机堆叠。 单机配置两颗AMD 宵龙CPU&#xff0c;核心数48&#xff0c;单台线程数192&#xff0c;单台…

服务器版RstudioServer安装与配置详细教程

Docker部署Rstudio server 背景&#xff1a;如果您想在服务器上运行RstudioServer&#xff0c;可以按照如下方法进行操作&#xff0c;笔者测试时使用腾讯云服务器&#xff08;系统centos7&#xff09;&#xff0c;需要在管理员权限下运行 Rstudio 官方提供了使用不同 R 版本的 …

Baumer工业相机中偏振相机如何使用Baumer堡盟GAPI SDK来进行偏振数据的计算转换输出(C++)

项目场景 Baumer工业相机堡盟相机是一种高性能、高质量的工业相机&#xff0c;可用于各种应用场景&#xff0c;如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能&#xff0c;可以实时传输高分辨率图像。此外&#xff0c;该相机还具…

【ansible】管理变量与事实详解

目录 管理变量与事实 一&#xff0c;变量 1&#xff0c;变量命名 2&#xff0c;变量优先级&#xff08;高--低&#xff09; 3&#xff0c;命令行引用 4&#xff0c; 引用playbook中的变量 5&#xff0c; 在主机清单中定义变量 6&#xff0c; 在自定义变量文件中定义变量 7&…

Linux基础IO - 文件描述符、重定向

前面的文章中我们讲述了C语言中文件相关的操作与系统文件IO的接口&#xff0c;这篇文章中将会讲述文件描述符与重定向的知识。 运行在前文中的系统文件程序&#xff0c;通过观察可以看到图中的数据3非常的奇怪没头没尾的&#xff0c;下面我们就来从这里开始。 通过查看man手册…

console使用方法介绍

console是在写前端Javascript时经常会使用到&#xff0c;我平时使用最多的是console.log&#xff0c;相比大多数人也是如此吧&#xff01; 下面一起来看一下强大的console吧&#xff01; 01函数&#xff08;属性&#xff09; 包含如下函数 / 属性&#xff1a;memory、assert、c…

Hadoop三大框架之HDFS

一、概述HDFS产生的背景及定义HDFS产生背景随着数据量越来越大&#xff0c;在一个操作系统存不下所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;需要一种系统来管理多台机器上的文件&#xff0c;这就是分布式文件…

日入500+的程序员都在用的“接私活”平台

网上总说程序员的薪资很高&#xff0c;这我可就不同意了&#xff1a; 程序员的薪资哪里是很高&#xff0c;而是非常高&#xff01;而会接私活的程序员更是能拿到更高的收入&#xff01;作为一个程序员&#xff0c;这些接私活的网站一定要收藏起来&#xff0c;让你在“八小时外…

ChatGPT transformer 5篇经典论文以及代码和解读

一次性读懂ChatGPT的技术演进路线&#xff0c;根据李沐老师推荐的5篇经典论文&#xff0c;整理了论文原文、论文解读、Github代码实现。 2017Transformer继MLP、CNN、RNN后的第四大类架构2018GPT使用 Transformer 解码器来做预训练2018BERTTransformer一统NLP的开始2019GPT-2更…

区块链概论

目录 1.概述 2.密码学原理 2.1.hash函数 2.2.签名 3.数据结构 3.1.区块结构 3.2.hash pointer 3.3.merkle tree 3.3.1.概述 3.3.2.证明数据存在 3.3.3.证明数据不存在 4.比特币的共识协议 4.1.概述 4.2.验证有效性 4.2.1.验证交易有效性 4.2.2.验证节点有效性 …

YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py

前言 在上一篇中&#xff0c;我们简单介绍了YOLOv5的配置文件之一 yolov5s.yaml&#xff0c;这个文件中涉及很多参数&#xff0c;它们的调用会在这篇 yolo.py 和下一篇 common.py 中具体实现。 本篇我们会介绍 yolo.py&#xff0c;这是YOLO的特定模块&#xff0c;和网络构建有…

python【selenium的环境配置】

selenium 1.环境配置 1&#xff09;在环境设置里面安装selenium第三方库 pip install --user selenium2&#xff09; from selenium.webdriver import Chrome# 创建谷歌 b Chrome() # 获取网页 b.get(http://www.baidu.com) # 防止自动关闭 input()3&#xff09;在此之前&…