【图文并茂】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.rhkb.cn/news/123973.html

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

相关文章

Docker基础入门:Docker基础总结篇--超详细

Docker基础入门&#xff1a;Docker基础总结篇[docker3要素、docker安装配置、容器使用、镜像管理发布] 一、Docker 3要素1.1、镜像&#xff08;Image&#xff09;1.2、容器&#xff08;Container&#xff09;1.3、仓库&#xff08;Registry&#xff09;1.4 、总结 二、Docker安…

Exception_json反序列化失败_JSONException

TokenGroup tokenGroup JSONObject.parseObject(tokenGroup1, TokenGroup.class);com.alibaba.fastjson.JSONException: create instance error, null, public com.daikin.snapshot.controller.auth.token.TokenGroup 解决方法: 在反序列化失败的实体类添加无参构造方法

QT 使用信号与槽实现界面跳转

一、创建一个新的页面 1 > 在原有工程上新建一个页面 2 > 选择Qt - Qt 设计师界面类 - choose 3 > 选择Widget模板 - 下一步 4 > 输入自定义类名 - 下一步 会自动生成其同名的.h .cpp .ui文件 5 > 最终效果 Headers存放.h文件 Soueces存放.cpp文件 Forms存放.u…

微服务·架构组件之网关- Spring Cloud Gateway

微服务架构组件之网关- Spring Cloud Gateway 引言 微服务架构已成为构建现代化应用程序的关键范式之一&#xff0c;它将应用程序拆分成多个小型、可独立部署的服务。Spring Cloud Gateway是Spring Cloud生态系统中的一个关键组件&#xff0c;用于构建和管理微服务架构中的网…

java八股文面试[数据库]——写失效(双写缓冲区)

InnoDB的页和操作系统的页大小不一致&#xff0c;InnoDB页大小一般为16K&#xff0c;操作系统页大小为4K&#xff0c;InnoDB的页写入到磁盘时&#xff0c;一个页需要分4次写。 如果存储引擎正在写入页的数据到磁盘时发生了宕机&#xff0c;可能出现页只写了一部分的情况&#…

使用element-ui导航,进入对应的三级页面菜单保持点击状态

1.注意事项 01.路由中使用了keepAlive属性&#xff0c;要用keepAlive&#xff1a;true&#xff0c;不能等于false&#xff0c;使用false页面会刷新 2.使用的方法 NavMenu 导航菜单 3.项目实例 <template><div class"policy-home"><div class"…

C++:类和对象(中)

目录 1. 类的6个默认成员函数 四个重要默认函数语法示例&#xff1a; 2. 构造函数 2.1概念 2.2特性 3. 析构函数 3.1概念 3.2特性 4. 拷贝构造函数 4.1概念 4.2特性 5. 赋值运算符重载 5.1运算符重载 5.2 赋值运算符重载 6. const成员函数 7. 取地址及const取地…

day-06 多进程服务器端 -- 进程间通信

一.多进程服务器端 &#xff08;一&#xff09;进程概念及应用 利用之前学习到的内容&#xff0c;我们的服务器可以按照顺序处理多个客户端的服务请求。在客户端和服务时间增长的情况下&#xff0c;服务器就不足以满足需求了。 1.两种类型的服务器端 &#xff08;1&#xff…

Stable Diffuse 之 安装文件夹、以及操作界面 UI 、Prompt相关说明

Stable Diffuse 之 安装文件夹、以及操作界面 UI 、Prompt相关说明 目录 Stable Diffuse 之 安装文件夹、以及操作界面 UI 、Prompt相关说明 一、简单介绍 二、安装文件相关说明 三、界面的简单说明 四、prompt 的一些语法简单说明 1、Prompt &#xff1a;正向提示词 &am…

【全网严谨版】L1-016 查验身份证 (C++解法 整理分析了多种方法)

问题描述 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下&#xff1a; 首先对前17位数字加权求和&#xff0c;权重分配为&#xff1a;{7&#xff0c;9&#xff0c;10&#xff0c;5&#xff0c;8&#xff0c;4&#xff0c;2&#…

接口测试工具开发文档

1 开发规划 1.1 开发人员 角 色 主要职责 负责模块 人员 备注 n xxx模块 xxx 1.2 开发计划 <附开发计划表> 1.3 开发环境和工具 开发工具 工具 作用 Notepad 编辑器 Perl 解释器 2 总体设计 设计思路&#xff1a;因为测试app和server。首先必须…

3、QT 的基础控件的使用

一、qFileDialog 文件窗体 Header: #include <QFileDialog> qmake: QT widgets Inherits: QDialog静态函数接口&#xff1a; void Widget::on_pushButton_clicked() {//获取单个文件的路径名QString filename QFileDialog :: getOpenFileName(this, tr("Open Fi…

Json“牵手”当当网商品详情数据方法,当当商品详情API接口,当当API申请指南

当当网是知名的综合性网上购物商城&#xff0c;由国内著名出版机构科文公司、美国老虎基金、美国IDG集团、卢森堡剑桥集团、亚洲创业投资基金&#xff08;原名软银中国创业基金&#xff09;共同投资成立1。 当当网从1999年11月正式开通&#xff0c;已从早期的网上卖书拓展到网…

【LeetCode - 每日一题】2594. 修车的最少时间(23.09.07)

2594. 修车的最少时间 题意 给定每个师傅修车的时间和需要修的车辆总数&#xff0c;计算修理所有汽车需要的最少时间。师傅可以同时修车。 解法 二分 看到题目没有任何头绪&#xff0c;直接查看题解。 至于为什么用二分做呢&#xff0c;讨论区有个友友这么说到&#xff1a…

学习心得08:OpenGL

我是想学习一下如何编程&#xff0c;这本书大多介绍的是原理。这两个完全是一回事。所以我又买了另外一本看看。

《TCP/IP网络编程》阅读笔记--Socket类型及协议设置

目录 1--协议的定义 2--Socket的创建 2-1--协议族&#xff08;Protocol Family&#xff09; 2-2--Socket类型&#xff08;Type&#xff09; 3--Linux下实现TCP Socket 3-1--服务器端 3-2--客户端 3-3--编译运行 4--Windows下实现 TCP Socket 4-1--TCP服务端 4-2--TC…

发布自定义node包,实现自定义脚本命令

比方说yarn&#xff0c;cnpm&#xff0c;vite等命令&#xff0c;无需执行node xxxx&#xff0c;可以自定义执行并完成一些操作 创建一个文件夹如下 在index.js中输入 #!/usr/bin/env node console.log(hello world);在package.json中添加 {...,"bin": {"pack…

陇剑杯2023线上wp

1. hard_web hard_web_1 题目内容&#xff1a;服务器开放了哪些端口&#xff0c;请按照端口大小顺序提交答案&#xff0c;并以英文逗号隔开(如服务器开放了 80 81 82 83 端口&#xff0c;则答案为 80,81,82,83) 半开放扫描 端口开放状态 攻击机发送 SYN 请求连接此端口靶机…

在element-plus中想要多选框(Checkbox)的功能,但是想要单选框(Radio)的圆形样式如何实现

在element plus中想要多选框&#xff08;Checkbox&#xff09;的功能&#xff0c;但是想要单选框(Radio)的圆形样式如何实现 原因 在完成一个业务需求时&#xff0c;需要一个框进行选择或者取消 element plus中的多选框&#xff08;Checkbox&#xff09;可以满足这个需求 但…

腾讯云、阿里云、华为云便宜云服务器活动整理汇总

云服务器的选择是一个很重要的事情&#xff0c;避免产生不必要的麻烦&#xff0c;建议选择互联网大厂提供的云计算服务&#xff0c;腾讯云、阿里云、华为云就是一个很不错的选择&#xff0c;云服务器稳定性、安全性以及售后各方面都更受用户认可&#xff0c;下面小编给大家整理…