数据结构——线性表与链表

看了一下其他链接,真正的循序表应该支持随机索引的,也就是new的时候就将内存分配好。

这里是像链表一样申请了,当做链表看吧

参考链接:数据结构与算法——顺序表和链表的优缺点(区别、特点)详解_顺序表和链表的优缺点(区别、特点)详解-CSDN博客

代码

#include<iostream>
#include<cmath>
using namespace std;
// 具体的元素 ,这里以书本为例 
struct element {element * next;int index; // 书本编号 int value;	// 价格 string name; // 书本名称 
};
// 代表序列整体信息 
struct sequence{element * next; // 指向下一个序列的指针int size; // 当前元素树木个数int maxIndex; // 最大编号 int sum; // 寻找最后一个元素指針 element* findLast() {element* it = this->next;while(it->next) {it = it->next;
//			cout<<"寻找下一个"<<endl;}return it;	} // 最后一个值 int last() {element* it = this->findLast();return it->value;}// 第一个值 int front() {element* it = this->next->next;return it->value;}// 向顺序表添加末尾一个元素 void push(int price,string name ) {element* newEle = new element();
//		cout<<"断点1"<<endl; newEle->index = this->maxIndex;newEle->value = price;newEle->name = name;
//		cout<<"断点2"<<endl; // 将新节点加入最后 element* last = this->findLast();last->next = newEle;
//		cout<<"断点3"<<endl; // 更新数据this->size ++; this->maxIndex ++; // 确保每本书的Id不一样 this->sum += newEle->value;} // 向顺序表删除第一个元素 ,返回被删除的值 ,假设一切操作合理 int pop() {
//		cout<<"断点4"<<endl; element* ele = this->next->next;this->next->next = ele->next;
//		cout<<"断点5"<<endl; // 更新数据 this->size --;this->sum -= ele->value;return ele->value;}// 打印順序表状态void printSate()  {cout<<"序列长度:"<<this->size<<endl;cout<<"序列总和:"<<this->sum<<endl;}// 清空void reset() {// 后续加上回收 this->next = new element();this->size = 0;this->sum = 0;} // 获取第x个元素,如果超出则显示最后一个元素 int getElement(int num) {int len = min(num,this->size); element* it = this->next;for(int i=0 ;i<len;i++) {it = it->next;}return it->value;} // 按照name字段查找 返回index int findByName(string name){element* it = this->next;while(it->next) {it = it->next;if(it->name == name) {return it->index;} }return -1;// 没找到 }// 遍历元素 打印书本价格 void printELementsValue() {element* it = this->next;while(it->next) {it = it->next;cout<<it->value<<" ";}cout<<endl;} // 遍历元素 打印书本名称 void printELementsName() {element* it = this->next;while(it->next) {it = it->next;cout<<it->name<<" ";}cout<<endl;} 
}; 
// 思考:
// 1.无效的操作如何阻止,比如在没有元素时的pop和front和last操作? 
// 2. 如何将指针->引用,使用属性.引用 代替? // 初始化一个空顺序表
sequence* initSequence() {sequence* a = new sequence();a->size = 0;a->sum = 0;a->maxIndex = 0; a->next = new element(); // 确认必须会有一个element return a;
}// 测试样例 1 (Accept)只有push 
void test1(sequence *seq);
// 测试样例 2 (Accept)push + pop
void test2(sequence *seq);
// 测试样例 3 (Accept)push + reset
void test3(sequence *seq);
// 测试样例 4 (Accept)push + pop + front + last
void test4(sequence *seq);
// 测试样例 5 (Accept)push + pop + printELementsValue + printELementsName
void test5(sequence *seq);signed main() {cout<<"断点start"<<endl; sequence* seq = initSequence(); test1(seq);test2(seq);test3(seq);test4(seq);test5(seq);cout<<"断点end"<<endl; return 0;
}void test1(sequence *seq) {seq->push(1,"Alice");seq->push(2,"Bob");seq->push(3,"安徒生");seq->push(2,"Alice");seq->push(7,"格林语言");seq->push(5,"中华上下五千年");seq->printSate();
}void test2(sequence *seq) {seq->push(3,"钢铁是怎样炼成的");seq->push(2,"A");seq->push(1,"B");seq->push(5,"V");seq->push(7,"D");seq->printSate();seq->pop();seq->pop();seq->printSate();
}
void test3(sequence *seq) {test1(seq);seq->reset();seq->printSate();
}
void test4(sequence *seq){test2(seq);cout<<seq->front()<<endl;cout<<seq->last()<<endl;
}
void test5(sequence *seq){test1(seq);test2(seq);seq->printELementsValue();seq->printELementsName();
}

这里的想法是,线性表是一个独立的个体,但是它又由多个元素组成

于是将线性表设计成单独的结构体,此外的元素对象单独再设计另一个结构体

// 具体的元素 ,这里以书本为例 
struct element {element * next;int index; // 书本编号 int value;	// 价格 string name; // 书本名称 
};
// 代表序列整体信息 
struct sequence{element * next; // 指向下一个序列的指针int size; // 当前元素树木个数int maxIndex; // 最大编号 int sum; 
}

我们创建好结构体之后,使用 new()就可以创建一个该对象。

为了能够检测到sequence对象是否为空,我们会再第一个元素设置一个空的元素对象,当做虚拟头结点,放在初始化的时候

// 初始化一个空顺序表
sequence* initSequence() {sequence* a = new sequence();a->size = 0;a->sum = 0;a->maxIndex = 0; a->next = new element(); // 确认必须会有一个element return a;
}

在结构体下面写一些函数,使用this指代当时实例化的对象,其再运行时确定具体值,用来引用自身属性。

// 寻找最后一个元素指針 element* findLast() {element* it = this->next;while(it->next) {it = it->next;
//			cout<<"寻找下一个"<<endl;}return it;	} // 最后一个值 int last() {element* it = this->findLast();return it->value;}// 第一个值 int front() {element* it = this->next->next;return it->value;}// 向顺序表添加末尾一个元素 void push(int price,string name ) {element* newEle = new element();
//		cout<<"断点1"<<endl; newEle->index = this->maxIndex;newEle->value = price;newEle->name = name;
//		cout<<"断点2"<<endl; // 将新节点加入最后 element* last = this->findLast();last->next = newEle;
//		cout<<"断点3"<<endl; // 更新数据this->size ++; this->maxIndex ++; // 确保每本书的Id不一样 this->sum += newEle->value;} // 向顺序表删除第一个元素 ,返回被删除的值 ,假设一切操作合理 int pop() {
//		cout<<"断点4"<<endl; element* ele = this->next->next;this->next->next = ele->next;
//		cout<<"断点5"<<endl; // 更新数据 this->size --;this->sum -= ele->value;return ele->value;}// 打印順序表状态void printSate()  {cout<<"序列长度:"<<this->size<<endl;cout<<"序列总和:"<<this->sum<<endl;}// 清空void reset() {// 后续加上回收 this->next = new element();this->size = 0;this->sum = 0;} // 获取第x个元素,如果超出则显示最后一个元素 int getElement(int num) {int len = min(num,this->size); element* it = this->next;for(int i=0 ;i<len;i++) {it = it->next;}return it->value;} // 按照name字段查找 返回index int findByName(string name){element* it = this->next;while(it->next) {it = it->next;if(it->name == name) {return it->index;} }return -1;// 没找到 }// 遍历元素 打印书本价格 void printELementsValue() {element* it = this->next;while(it->next) {it = it->next;cout<<it->value<<" ";}cout<<endl;} // 遍历元素 打印书本名称 void printELementsName() {element* it = this->next;while(it->next) {it = it->next;cout<<it->name<<" ";}cout<<endl;} 

测试样例使用方法进行模拟,传入具体的顺序表的实例对象,即可进行添加操作

void test1(sequence *seq) {seq->push(1,"Alice");seq->push(2,"Bob");seq->push(3,"安徒生");seq->push(2,"Alice");seq->push(7,"格林语言");seq->push(5,"中华上下五千年");seq->printSate();
}void test2(sequence *seq) {seq->push(3,"钢铁是怎样炼成的");seq->push(2,"A");seq->push(1,"B");seq->push(5,"V");seq->push(7,"D");seq->printSate();seq->pop();seq->pop();seq->printSate();
}
void test3(sequence *seq) {test1(seq);seq->reset();seq->printSate();
}
void test4(sequence *seq){test2(seq);cout<<seq->front()<<endl;cout<<seq->last()<<endl;
}
void test5(sequence *seq){test1(seq);test2(seq);seq->printELementsValue();seq->printELementsName();
}

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

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

相关文章

03.DDD六边形架构

学习视频来源&#xff1a;DDD独家秘籍视频合集 https://space.bilibili.com/24690212/channel/collectiondetail?sid1940048&ctype0 文章目录 什么是依赖DDD四层架构六边形架构代码实现 想要详细了解六边形架构&#xff0c;可以看我之前的一篇文章。是对六边形架构原文的翻…

前端开发实现自定义勾选/自定义样式,可复选,可取消勾选

基于后端返回数组实现多选、复选 以下代码基于vue2&#xff0c;如果有需要React/Vue3或者其他框架代码的&#xff0c;可以通过国内直连GPT4o进行代码转换&#xff0c;转换正确率99% 前端代码如下(直接拷贝到你的vue代码即可)&#xff1a; <!-- CustomCheckboxList.vue --&g…

新型智慧城市顶层设计方案(118页word)

文档介绍&#xff1a; 新型智慧城市顶层设计方案是一种全局性、前瞻性的规划&#xff0c;旨在通过整合城市各类资源&#xff0c;运用新一代信息技术&#xff0c;推动城市治理、民生服务、产业发展等领域的全面升级&#xff0c;以实现城市的可持续发展和居民生活质量的提升。该…

nginx-proxy-manager实现反向代理+自动化证书(实战)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 &#x1f38f;&#xff1a;你只管努力&#xff0c;剩下的交给时间 &#x1f3e0; &#xff1a;小破站 cnginx-proxy-manager实现反向代理自动化证书 nginx-proxy-manager是什么搭建nginx-proxy-manage…

定时器入门:Air780E定时器基础与进阶

今天我们学习的是Air780E定时器基础与进阶&#xff0c;让大家更深入的了解定时器。 一、定时器(timer)的概述 在Air780E模组搭载的LuatOS系统中&#xff0c;定时器&#xff08;timer&#xff09;是一项基础且关键的服务。它允许开发者在特定的时间点或周期性地执行代码段&…

C语言复习第7章 自定义类型(结构体+位段+枚举+联合体)

目录 一、结构体1.1 内置类型和自定义类型1.2 结构体的概念1.3 结构体基本的声明1.4 区分两种创建结构体变量的方式1.5 结构体变量的定义和初始化1.6 区分一下typdef和变量列表1.7 匿名结构体类型1.8 访问结构体成员1.9 修改字符数组成员变量的时候 要用strcpy1.10 结构体的传参…

Twitter(X)2024最新注册教程

Twitter 现名为X&#xff0c;因为图标是一只小鸟的形象&#xff0c;大家也叫它小蓝鸟&#xff08;埃隆马斯克于 2023 年对该平台进行了品牌重塑&#xff09;&#xff0c;目前仍然是全球最受欢迎的社交媒体和微博平台之一&#xff0c;全球活跃用户量大概在4.5亿。尤其是欧美国家…

[单例模式]

[设计模式] 设计模式是软件工程中的一种常见做法, 它可以理解为"模板", 是针对一些常见的特定场景, 给出的一些比较好的固定的解决方案. 不同语言适用的设计模式是不一样的. 这里我们接下来要谈到的是java中典型的设计模式. 而且由于设计模式比较适合有一定编程经…

[mysql]DDL,DML综合案例,

综合案例 题目如下 目录 综合案例 ​编辑 ​编辑 # 1、创#1建数据库test01_library # 2、创建表 books&#xff0c;表结构如下&#xff1a; # 3、向books表中插入记录库存 # 4、将小说类型(novel)的书的价格都增加5。 # 5、将名称为EmmaT的书的价格改为40&#xff0c;并将…

day-81 打家劫舍 II

思路 与LCR 089. 打家劫舍相比&#xff0c;本题所有房屋围成了一圈&#xff0c;那么第一间房子和最后一间房子不能同时打劫&#xff0c;那么就可以分为两种情况&#xff1a;1.选第一间房打劫&#xff1b;2.选最后一间房打劫 解题过程 然后依次计算出以上两种情况的最大金额&am…

秃姐学AI系列之:GRU——门控循环单元 | LSTM——长短期记忆网络

RNN存在的问题 因为RNN模型的BPTT反向传导的链式求导&#xff0c;导致需要反复乘以一个也就是说会出现指数级别的问题&#xff1a; 梯度爆炸&#xff1a;如果的话&#xff0c;那么连乘的结果可能会快速增长&#xff0c;导致梯度爆炸梯度消失&#xff1a;如果的话&#xff0c;…

OpenHarmony 入门——ArkUI 自定义组件间的父子双向同步状态装饰器@Link语法(四)

文章大纲 引言一、组件间状态装饰器Link 父子双向同步1、使用规则2、支持的观察变化的场景和ArkUI 刷新UI3、Link变量值初始化和更新机制3.1、初始渲染&#xff1a;执行父组件的build()函数后将创建子组件的新实例。3.2、Link的数据源的更新&#xff1a;即父组件中状态变量更新…

机器学习与数据挖掘_使用梯度下降法训练线性回归模型

目录 实验内容 实验步骤 1. 导入必要的库 2. 加载数据并绘制散点图 3. 设置模型的超参数 4. 实现梯度下降算法 5. 打印训练后的参数和损失值 6. 绘制损失函数随迭代次数的变化图 7. 绘制线性回归拟合曲线 8. 基于训练好的模型进行新样本预测 实验代码 实验结果 实验…

机器学习与AI|如何利用数据科学优化库存周转率?

对于所有零售商来说&#xff0c;良好的库存管理都是非常重要的。众所周知&#xff0c;商品如果不放在货架上就无法出售&#xff0c;而如果库存过多则意味着严重的财务负担。 但是做好库存管理绝非易事&#xff0c;它依赖于对未来需求的准确预测和确保始终有合适库存的敏捷供应链…

Proteus中数码管动态扫描显示不全(已解决)

文章目录 前言解决方法后记 前言 我是直接把以前写的 51 数码管程序复制过来的&#xff0c;当时看的郭天祥的视频&#xff0c;先送段选&#xff0c;消隐后送位选&#xff0c;最后来个 1ms 的延时。 代码在 Proteus 中数码管静态是可以的&#xff0c;动态显示出了问题——显示…

如何快速搭建一个spring boot项目

一、准备工作 1.1 安装JDK&#xff1a;确保计算机上已安装Java Development Kit (JDK) 8或更高版本、并配置了环境变量 1.2 安装Maven&#xff1a;下载并安装Maven构建工具&#xff0c;这是Spring Boot官方推荐的构建工具。 1.3 安装代码编辑器&#xff1a;这里推荐使用Inte…

基于ViT的无监督工业异常检测模型汇总

基于ViT的无监督工业异常检测模型汇总 论文1&#xff1a;RealNet: A Feature Selection Network with Realistic Synthetic Anomaly for Anomaly Detection&#xff08;2024&#xff09;1.1 主要思想1.2 系统框架 论文2&#xff1a;Inpainting Transformer for Anomaly Detecti…

数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看

前言 这个专栏将会用纯C实现常用的数据结构和简单的算法&#xff1b;用C基础即可跟着学习&#xff0c;代码均可运行&#xff1b;准备考研的也可跟着写&#xff0c;个人感觉&#xff0c;如果时间充裕&#xff0c;手写一遍比看书、刷题管用很多&#xff0c;这也是本人采用纯C语言…

Python | Leetcode Python题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; class Solution:def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:m, n len(matrix), len(matrix[0])# 初始化动态规划的数组&#xff0c;所有的距离值都设置为一个很大的数dist [[10**9] * n for _ in range(m)]…

ENSP作业——园区网

题目 根据上图&#xff0c;可得需求为&#xff1a; 1.配置交换机上的VLAN及IP地址。 2.设置SW1为VLAN 2/3的主根桥&#xff0c;设置SW2为VLAN 20/30的主根桥&#xff0c;且两台交换机互为主备。 3.可以使用super vlan。 4.上层通过静态路由协议完成数据通信过程。 5.AR1作为企…