【图文并茂】C++介绍之串

1.1串

引子——

​ 字符串简称为串,串是由字符元素构成的,其中元素的逻辑关系也是一种线性关系。串的处理在计算机非数值处理中占用重要的地位,如信息检索系统,文字编辑等都是以串数据作为处理对象

串是由零个或多个字符组成的有限序列。

两个串相等,当且仅当两个串长度相等且对应位置上字符一样

1.2串的抽象数据类型

(如图所示)

在这里插入图片描述


1.3顺序串基本算法实现

和线性表一样,串也要顺序存储结构和链式存储结构,前者称为顺序串,后者称为链串

顺序串的存储方式又有两种。一种是每个字只存一个字符,这称为非紧缩格式。另一种是每个字存放多个字符,称为紧凑格式

(1)声明

typedef struct
{char data[MaxSize]; int length;
}SqString; //存放串字符//存放串长//顺序串类型

(2)生成串

void StrAssign(SqString& s, char cstr[]) {int i;for (i = 0; cstr[i] != '\0'; i++)s.data[i] = cstr[i];s.length = i; //s为引用型参数//设置串s的长度
}

(3)销毁串

void DestroyStr(SqString&s)
{ }

(4)串的复制

void StrCopy(SqString& s, SqString t)
{//s为引用型参数int i;for (i = 0; i < t.length; i++)s.data[i] = t.data[i];s.length = t.length;//复制t的所有字符//设置串s的长度
}

(5)判断串相等

//判断串相等
bool StrEqual(SqString s,SqString t) {bool same=true; int i; if(s.length!=t.length)same=false; else for (i=0;i<s.length;i++) if (s.data[i] = t.data[i]){same = false;break;}return same;
}

(6)求串长

int StrLength(SqString s)
{return s.length;
}

(7)串的连接

SqString Concat(SqString s, SqString t)
{SqString str;int i;str.length = s.length + t.length;for (i = 0; i < s.length; i++)str.data[i] = s.data[i];for (int i = 0; i < t.length; i++)str.data[s.length + i] = t.data[i];return str;
}

(8)字串插入

SqString InsStr(SqString s1, int i, SqString s2)
{int j;SqString str;	//定义结果串str.length = 0;if (i <= 0 || i > s1.length + 1)return str;for (j = 0; j < i - 1; j++)str.data[j] = s1.data[j];for (j = 0; j < s2.length; j++)str.data[i + j - 1] = s2.data[j];for (j = i - 1; j < s1.length; j++)str.data[s2.length + j] = s1.data[j];str.length = s1.length + s2.length;return str;
}

(9)字串删除

SqString DelStr(SqString s, int i, int j)
{int k;SqString str;str.length = 0;if (i <= 0 || i > s.length || i + j > s.length + 1)return str;for (k = 0; k < i - 1; k++)str.data[k] = s.data[k];for (k = i + j - 1; k < s.length; k++)str.data[k - j] = s.data[k];str.length = s.length - j;return str;
}

(10)字串替换

//字串的替换
SqString RepStr(SqString s, int i, int j, SqString t)
{int k;SqString str;str.length = 0;if (i <= 0 || i > s.length || i + j > s.length + 1)return str;for (k = 0; k < i - 1; k++)str.data[k] = s.data[k];for (k = 0; k < t.length; k++)str.data[i + k - 1] = t.data[k];for (k = i + j - 1; k < s.length; k++)str.data[t.length + k - j] = s.data[k];str.length = s.length - j + t.length; return str;
}

(11)输出串

//输出串
void DispStr(SqString s)
{int i;if (s.length > 0){for (i = 0; i < s.length; i++)printf("%c", s.data[i]);printf("\n");}
}

1.4链串

串的链式存储结构是链串,这里介绍采用带头结点的单链表作为链串。

(如图)

在这里插入图片描述


1.5链串的基本算法实现

(1)声明

typedef struct snode {char data;struct snode* next;
}LinkStrNode;

(2)尾插法生成串

//尾插法建立链串
void StrAssign(LinkStrNode*& s, char cstr[])
{int i;LinkStrNode* r, * p;s = (LinkStrNode*)malloc(sizeof(LinkStrNode));r = s;for (i = 0; cstr[i] != '\0'; i++){p = (LinkStrNode*)malloc(sizeof(LinkStrNode));p->data = cstr[i];r->next = p;r = p;}r->next = NULL;
}

(3)销毁串

//销毁串
void DestroyStr(LinkStrNode*&s)
{LinkStrNode* pre = s, * p = s->next;while (p != NULL){free(pre);pre = p;p = pre->next;}
}

(4)串的复制

void StrCopy(LinkStrNode*& s, LinkStrNode* t)
{LinkStrNode* p = t->next, * q, * r;s = (LinkStrNode*)malloc(sizeof(LinkStrNode));r = s;while (p != NULL){q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data;r->next = q; r = q;p = p->next;}r->next = NULL;
}

(5)判断串相等

//判断串相等
bool StrEqual(LinkStrNode* s, LinkStrNode* t)
{LinkStrNode* p = s->next, * q = t->next;while (p != NULL && q != NULL && p->data == q->data){p = p->next;q = q->next;}if (p == NULL && q == NULL)return true;return false;
}

(6)求串长

//求串长
int StrLength(LinkStrNode* s)
{int  i = 0;LinkStrNode* p = s->next;while (p != NULL){i++;p = p->next;}return i;
}

(7)串的连接

LinkStrNode* contact(LinkStrNode * s, LinkStrNode * t)
{LinkStrNode* str, * p = s->next, * q, * r;str = (LinkStrNode*)malloc(sizeof(LinkStrNode));r = str;while (p != NULL){q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data;r->next = q;r = p;p = p->next;}p = t->next;while (p != NULL){q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data;r->next = q; r = q;p = p->next;}r->next = NULL;return  str;
}

(8)求子串

//求子串
LinkStrNode* SubStr(LinkStrNode* s, int i, int j)
{int k;LinkStrNode* str, * p = s->next, * q, * r;str = (LinkStrNode*)malloc(sizeof(LinkStrNode));str->next = NULL;if (i <= 0 || i > StrLength(s) || j<0 || i + j - 1>StrLength(s))return str;for (k = 1; k < i; k++)p = p->next;for (k = 1; k <= j; k++){q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data;r->next = q;r = q;p = p->next;}r->next = NULL;return NULL;
}

(9)子串插入

//子串插入
LinkStrNode* InsStr(LinkStrNode* s, int i, LinkStrNode* t)
{int k;LinkStrNode* str, * p = s->next, * pl = t->next, * q, * r;str = (LinkStrNode*)malloc(sizeof(LinkStrNode));str->next = NULL;r = str;if (i <= 0 || i > StrLength(s) + 1)return str;for (k = 1; k < i; k++) //置结果串str为空串//:指向结果串的尾结点//参数不正确时返回空申//将s的前i个结点复制到str {q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data;r->next = q; r = q;p = p->next;}while (pl!=NULL) { //将t的所有结点复制到str q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = pl->data;r->next = q; r = q;pl = pl->next;}while (p != NULL) {//将t的所有结点复制到str q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data;r->next = q; r = q;p = p->next;}r->next = NULL;
}

(10)子串删除

//字串删除
LinkStrNode* DelStr(LinkStrNode* s, int i, int j)
{int k;LinkStrNode* str, * p = s->next,*q, * r;str = (LinkStrNode*)malloc(sizeof(LinkStrNode));str->next = NULL;r = str;if (i <= 0 || i > StrLength(s) || j<0 || i + j - 1>StrLength(s));return str;for (int k = 1; k < i; k++){q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data;r->next = q; r = q;p = p->next;}for (k = 0; k < j; k++)p = p->next;while (p != NULL){q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data;r->next = q;r = q;p = p->next;}r->next = NULL;return str;
}

(11)子串的替换

//子串的替换
LinkStrNode* RepStr (LinkStrNode* s, int i, int j, LinkStrNode* t)
{int k;LinkStrNode* str, * p = s->next, * p1 = t->next, * q, * r;str = (LinkStrNode*)malloc(sizeof(LinkStrNode));str->next = NULL;r = str;if (i <= 0 || i > StrLength(s) || j<0 || i + j - 1>StrLength(s))return str;for (int k = 0; k < i - 1; k++){q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data; q->next = NULL;r->next = q; r = q;p = p->next;}for (k = 0; k < j; k++)p = p->next;while(p1 !=NULL){q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p1->data; aa222q->next = NULL;r->next = q; r = q;p1 = p1->next;}while (p != NULL){q = (LinkStrNode*)malloc(sizeof(LinkStrNode));q->data = p->data; q->next = NULL;r->next = q; r = q;p = p->next;}r->next = NULL;return str;
}

(12)输出串

输出串
void DispStr(LinkStrNode* s)
{LinkStrNode* p = s->next;while (p != NULL){printf("%c", p->data);p = p->next;}printf("\n");
}

希望本文对你有所帮助!
在这里插入图片描述

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

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

相关文章

得心应手应对 OOM 的疑难杂症

Java全能学习面试指南&#xff1a;https://www.javaxiaobear.cn/ 前面我们提到&#xff0c;类的初始化发生在类加载阶段&#xff0c;那对象都有哪些创建方式呢&#xff1f;除了我们常用的 new&#xff0c;还有下面这些方式&#xff1a; 使用 Class 的 newInstance 方法。使用…

[Vue3 博物馆管理系统] 使用Vue3、Element-plus的Layout 布局构建组图文章

系列文章目录 第一章 定制上中下&#xff08;顶部菜单、底部区域、中间主区域显示&#xff09;三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus走马灯组件构建轮播图 第四章 使用Vue3、Element-plus tabs组件构建选项卡功能 第五章…

PHP反序列化漏洞

一、序列化&#xff0c;反序列化 序列化&#xff1a;将php对象压缩并按照一定格式转换成字符串过程反序列化&#xff1a;从字符串转换回php对象的过程目的&#xff1a;为了方便php对象的传输和存储 seriallize() 传入参数为php对象&#xff0c;序列化成字符串 unseriali…

go gin gorm连接postgres postgis输出geojson

go gin gorm连接postgres postgis输出geojson 1. 技术环境 go-gin-gorm postgres-postgis go vscode环境安装-智能提示配置 2. 简单实现代码 思路就是&#xff1a;采用原生sql实现查询、更新等&#xff0c;采用gorm的raw来执行sql语句 package mainimport ("fmt"&q…

JavaScript 之 Symbol 数据类型

一、简介 ​ symbol类型是ES6新引入的一种基本数据类型&#xff0c;该类型具有静态属性和静态方法。其中静态属性暴露了几个内建的成员对象&#xff0c;静态方法暴露了全局的symbol注册。 ​ symbol类型具有以下特点&#xff1a;① 唯一性&#xff1a;每个symbol值都是唯一的…

JavaScript设计模式(四)——策略模式、代理模式、观察者模式

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

【MySQL基础】事务隔离03

目录 隔离性与隔离级别事务隔离的实现事务的启动方式MySQL事务代码示例 在MySQL中&#xff0c;事务支持是在引擎层实现的。MySQL是一个支持多引擎的系统&#xff0c;但并不是所有的引擎都支持事务。比如 MySQL 原生的 MyISAM 引擎就不支持事务&#xff0c;这也是 MyISAM 被 Inn…

29 | 聊聊性能测试的基本方法与应用领域

并发用户数、响应时间、系统吞吐量之间的关系 当系统并发用户数较少时&#xff0c;系统的吞吐量也低&#xff0c;系统处于空闲状态&#xff0c;这个阶段被称为 “空闲区间”。 并发用户数进一步增长&#xff0c;系统的处理能力逐渐趋于饱和&#xff0c;因此每个用户的响应时间会…

Java 日志技术

所以说&#xff0c;要学Logback&#xff01; 配置文件 Logback提供了一个核心配置文件logback.xml&#xff0c;日志框架在记录日志时会读取配置文件中的配置信息&#xff0c;从而记录日志的形式。 可以配置日志输出的位置是文件还是控制台可以配置日志输出的格式还可以配置日…

55、基于 WebFlux 开发 WebSocKet

★ 基于Web Flux开发WebSocket 两步&#xff1a; &#xff08;1&#xff09;实现WebSocketHandler开发WebSocket处理类。 实现该接口时只需要实现Mono handle(WebSocketSession webSocketSession)方法即可。 &#xff08;2&#xff09;使用HandlerMapping和WebSocketHandler…

【Arduino27】DHT11温湿度传感器模拟值实验

硬件准备 DHT11温湿度&#xff1a;1个 面包板&#xff1a;1个 杜邦线&#xff1a;3根 硬件连线 VDD引脚接 5V 电源 DATE引脚接 4号 接口 GND引脚接 GND 接口 软件程序 #include<DHT.h>#define DHT11_pin 4 //温湿度传感器引脚DHT dht(DHT11_pin,DHT11);float tem…

常用echart图总结

柱状图 - category-work,grid直角坐标,legend,series-bar柱状图,tooltip提示框 - makeapie echarts社区图表可视化案例

华为OD机试 - 最多颜色的车辆 - 数据结构map(Java 2022Q4 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路1、核心思想2、题做多了&#xff0c;你就会发现&#xff0c;这道题属于送分题&#xff0c;为什么这样说&#xff1f;3、具体解题思路&#xff1a; 五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B…

C++ 模板

模板&#xff1a; 模板&#xff0c;即数据是灵魂&#xff0c;其余为肉身&#xff0c;正所谓有趣的灵魂万里挑一&#xff0c;所以想要模板变得完美&#xff0c;关键在于数据&#xff1b;其余不过是抄作业的框架。 模板函数&#xff1a; 模板函数可以自动推导出你传给他的数据类型…

便捷高效的电能管理:利用PLC远程控制网关实时监控配电箱

配电箱是工业生产过程中必不可少的设备&#xff0c;其中的PLC&#xff08;可编程逻辑控制器&#xff09;是实现自动化控制的重要组成部分。为了实时监控配电箱的数据&#xff0c;并进行远程调试上下载与管理控制&#xff0c;我们可以使用PLC数据采集与远程控制网关。 PLC数据采…

2023年全国大学生数学建模B题

多波束测线问题 1.问题提出 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播&#xff0c;在不同界面上产生反射&#xff0c;利用这一原理&#xff0c;从测量船换能器垂直向海底发射声波信号&#xff0c;并记录从声波发射到信号接…

CVE-2023-3836:大华智慧园区综合管理平台任意文件上传漏洞复现

文章目录 CVE-2023-3836&#xff1a;大华智慧园区综合管理平台任意文件上传漏洞复现0x01 前言0x02 漏洞描述0x03 影响范围0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 CVE-2023-3836&#xff1a;大华智慧园区综合管理平台任意文件上传漏洞复现 0x01 前言 免责声…

0012Java程序设计-springboot基于微信小程序的校园智慧帮系统的设计与实现

摘要目录相关技术2.1 MySQL数据库2.2 SpringBoot框架2.3 uniapp框架2.4 B/S架构 系统设计系统实现开发环境 摘要 随着移动互联网高速发展&#xff0c;手机、移动智能终端设备在生活中有着越来越重要的地位。在高校推崇以人为本的今天&#xff0c;也逐渐重视“移动互联网”技术…

Java“牵手”1688商品详情数据,1688商品详情API接口,1688API接口申请指南

1688平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xff0c;通过…

一套成熟的实验室信息管理系统(云LIS源码)ASP.NET CORE

一套成熟的实验室信息管理系统&#xff0c;集前处理、检验、报告、质控、统计分析、两癌等模块为一体的网络管理系统。它的开发和应用将加快检验科管理的统一化、网络化、标准化的进程。 LIS把检验、检疫、放免、细菌微生物及科研使用的各类分析仪器&#xff0c;通过计算机联…