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

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

相关文章

NATAPP内网穿透之接口测试

下载 工具下载 下载对应系统版本的软件&#xff1a; NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 认证文件下载 使用本地配置文件config.ini - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 解压完之后&#xff0c;将配置文件放到解压后的文件夹中 申请免费隧…

编程中的信号处理和系统 - 初学者指南

信号处理是工程和编程的一个重要领域。 基本上,它允许工程师和程序员改进数据,以便人们可以更有效地使用它。 例如,由于信号处理,电话中的大部分背景噪音都被消除了。这样,通话的另一端就只能听到您的声音。 其他例子有: 音频和音乐软件图像视频处理软件医学影像软件语…

C语言常见字符串和内存函数详解

字符串和内存函数 1. 前言2. 求字符串长度2.1 strlen 3. 长度不受限制的字符串函数3.1 strcpy3.2 strcat3.3 strcmp 4. 长度受限制的字符串函数4.1 strncpy4.2 strncat4.3 strncmp 5. 字符串查找5.1 strstr5.2 strtok 6. 错误信息报告6.1 strerror 7. 字符操作函数7.1 字符分类…

通过Docker Compose安装MQTT

一、文件和目录说明 1、MQTT安装时的文件和目录 EMQX 安装完成后会创建一些目录用来存放运行文件和配置文件&#xff0c;存储数据以及记录日志。 不同安装方式得到的文件和目录位置有所不同&#xff0c;具体如下&#xff1a; 注意&#xff1a; 压缩包解压安装时&#xff0c;目…

Kafka的文件存储与稀疏索引机制

![在这里插入图片描述](https://img-blog.csdnimg.cn/dde7fc866d214985baaa87300a472578.png)这些是存储在分区(分区才是实际的存储)文件中的. seg是逻辑概念 而实际由log存储的. index是偏移量索引而timeindex是时间戳索引 log就是seg 找数据就是先找log 再从log去找

MySQL视图用户管理

文章目录 视图视图的规则用户用户信息创建用户删除用户修改密码 用户权限给用户授权回收权限 视图 视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会…

2.6 PE结构:导出表详细解析

导出表&#xff08;Export Table&#xff09;是Windows可执行文件中的一个结构&#xff0c;记录了可执行文件中某些函数或变量的名称和地址&#xff0c;这些名称和地址可以供其他程序调用或使用。当PE文件执行时Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入&…

HCIA自学笔记01-传输介质

通信网络除了包含通信设备本身之外&#xff0c;还包含连接这些设备的传输介质&#xff0c;如同轴电缆、双绞线和光纤等。不同的传输介质具有不同的特性&#xff0c;这些特性直接影响到通信的诸多方面&#xff0c;如线路编码方式、传输速度和传输距离等。 简单网络&#xff1a;…

数据分享|WEKA信贷违约预测报告:用决策树、随机森林、支持向量机SVM、朴素贝叶斯、逻辑回归...

完整报告链接&#xff1a;http://tecdat.cn/?p28579 作者&#xff1a;Nuo Liu 数据变得越来越重要&#xff0c;其核心应用“预测”也成为互联网行业以及产业变革的重要力量。近年来网络 P2P借贷发展形势迅猛&#xff0c;一方面普通用户可以更加灵活、便快捷地获得中小额度的贷…

2023高教社杯 国赛数学建模B题思路 - 多波束测线问题

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

技术面试与HR面:两者之间的关联与区别

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

Jetpack Compose 教程

一、简介 Jetpack Compose 是用于构建原生 Android 界面的新工具包。它使用更少的代码、强大的工具和直观的 Kotlin API&#xff0c;可以帮助您简化并加快 Android 界面开发。 在本教程中&#xff0c;您将使用声明性的函数构建一个简单的界面组件。您无需修改任何 XML 布局&am…