【数据结构】串 解析+完整代码(求子串、比大小、定位操作)

1.串的实现

1.1 串的定义

  • 定义

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

    串是一种特殊的线性表,数据元素间呈线性关系。

    • 空串:串长度为0时;
    • 子串:串中任意个连续的字符组成的子序列;
    • 主串:包含子串的串;
    • 字符在主串中的位置:字符在串中的符号;
    • 子串在主串中的位置:子串的第一个字符在主串中的位置。
  • 静态数组实现(定长顺序存储)

    typedef struct{
        char ch[MaxSize]; //用数组存储字符
        int length; //串的长度
    }SString;
    
  • 动态数组实现(堆分配存储)

    用完需要手动free

    typedef struct{
        char*ch; //按串长分配存储区,ch指向串的基地址
        int length; //串的长度
    }HString;
    
  • 串的顺序存储

  • 串的链式存储

    typedef struct StringNode{
        char ch[4]; //每个结点存多个字符,提高存储密度
        struct StringNode *next;
    }StringNode,*String;
    

1.2 串的基本操作

  • 基于静态数组
1.2.1 求子串
//用sub返回串s的第pos位置长度为len的子串
bool SubString(SString &Sub,SString S,int pos,int len){
    if(pos+1en-1>S.length)return false; //子串越界
    for(int i=pos;i<pos+len;i++){
        Sub.ch[i-pos+1]=S.ch[i]
    }
    Sub.length=len;
    return true;
}
1.2.2 比大小
  • 字符串的大小比较方法:

    从左往右逐个比较,哪个字符的编码大,就哪个串更加大;

    若前面的字符都相同,哪个串长就哪个大。

//若S>T,返回值>0;若S=T,返回值=0;若S<T,返回值<0.
int StrCompare(SString S,SString T){
    for(int i=1;i<=S.length&&i<=T.length;i++){
        if(S.ch[i]!=T.ch[i])
            return S.ch[i]-T.ch[i];
    }
    //扫描过的所有字符都相同,则长度长的串长
    return S.length-T.length;
}
1.2.3 定位操作
  • 若主串S中存在与T值相同的子串,则返回它在主串中第一次出现的位置,否则函数值为0。
int Index(SString S,SString T){
    int i=1,n=StrLength(S),m=StrLength(T);
    SString sub;
    while(i<=n-m+1){
        SubString(sub,S,i,m); //sub存放从i位置起,长为len的可能子串
        if(StrCompare(sub,T)!=0) //如果不是子串,下一位置继续
            i++;
        else
            return i;
    }
    return 0;
}
*完整代码 串
#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

#define MaxSize 99

//定长顺序存储
typedef struct {
	char ch[MaxSize];
	int length;
}SString;

//赋值操作
//把T赋值为chars
void StrAssign(SString& T, char chars[]) {
	for (int i = 0; i < strlen(chars); i++) {
		T.ch[i + 1] = chars[i];
	}
	T.length = strlen(chars);
}

//复制操作
//由S复制得到T
void StrCopy(SString& T, SString S) {
	T.length = S.length;
	for (int i = 1; i <= T.length; i++) {
		T.ch[i] = S.ch[i];
	}
}

//判空
bool StrEmpty(SString S) {
	if (S.length == 0)
		return true;
	else
		return false;
}

//比较
//若S>T,返回值>0;若S=T,返回值=0;若S<T,返回值<0.
int StrCompare(SString S, SString T) {
	for (int i = 1; i <= S.length && i <= T.length; i++){
		if (S.ch[i] != T.ch[i])
			return S.ch[i] - T.ch[i];
	}
	return S.length - T.length;
}

//求子串
//用sub返回串s的第pos位置长度为len的子串
bool SubString(SString& Sub, SString S, int pos, int len) {
	if (pos + len - 1 > S.length)return false;
	for (int i = pos; i < pos + len; i++) {
		Sub.ch[i - pos + 1] = S.ch[i];
	}
	Sub.length = len;
	return true;
}

//串连接
//用T返回由S1、S2组成的新串
void Concat(SString& T, SString S1, SString S2) {
	T.length = S1.length + S2.length;
	for (int i = 1; i <= T.length; i++) {
		if (i <= S1.length) {
			T.ch[i] = S1.ch[i];
		}
		else {
			T.ch[i] = S2.ch[i - S1.length];
		}
	}
}

//定位
//若主串S中存在与T值相同的子串,则返回它在主串中第一次出现的位置,否则函数值为0。
int Index(SString S, SString T) {
	int i = 1;
	SString sub;
	while (i < S.length - T.length + 1) {
		SubString(sub, S, i, T.length);
		if (StrCompare(sub, T) != 0)
			i++;
		else
			return i;
	}
	return 0;
}

//清空
void ClearString(SString &S) {
	S.length = 0;
}

void PrintS(SString S) {
	printf("Str:");
	for (int i = 1; i <= S.length; i++)
		printf("%c", S.ch[i]);
	printf("\n");
	//printf(" , Length: %d\n", S.length);
}

int main() {
	SString str1, str2, result, sub;
	char c1[] = "Hello", c2[] = "World";
	StrAssign(str1, c1);
	StrAssign(str2, c2);

	printf("\nAssign:\n");
	PrintS(str1);
	PrintS(str2);

	// 测试复制操作
	printf("\nCopy:\n");
	StrCopy(result, str1);
	PrintS(result);

	// 测试判空操作
	printf("\nStr1 is empty: %s\n", StrEmpty(str1) ? "Yes" : "No");

	// 测试比较操作
	printf("\nCompare Str1 and Str2: %d\n", StrCompare(str1, str2));

	// 测试求子串操作
	if (SubString(sub, str1, 2, 3)) {
		printf("\nSubString of Str1 from 2, length 3: \n");
		PrintS(sub);
	}
	else {
		printf("\nSubString operation failed.\n");
	}

	// 测试串连接操作
	Concat(result, str1, str2);
	printf("\nConcatenated Str1 and Str2: \n");
	PrintS(result);

	// 测试定位操作
	char c3[] = "ll";
	StrAssign(sub, c3);
	printf("\nIndex of 'll' in Str1: %d\n", Index(str1, sub));

	// 测试清空操作
	ClearString(str1);
	printf("\nAfter Clear Str1: Length: %d\n", str1.length);

	return 0;
}

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

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

相关文章

ConcurrentHashMap 为什么不能插入 null?

1、典型回答 简单来说&#xff0c;ConcurrentHashMap 不允许插入 null 值是JDK 源码规定的&#xff0c;如下源码所示(此源码基于JDK 1.8)&#xff1a; 从上述源码可以看出&#xff0c;在添加方法的第一句就加了判断&#xff1a;如果 key 值为 null 或者是 value 值为 null&…

Spring Cloud Alibaba微服务从入门到进阶(一)(SpringBoot三板斧、SpringBoot Actuator)

Springboot三板斧 1、加依赖 2、写注解 3、写配置 Spring Boot Actuator Spring Boot Actuator 是 Spring Boot 提供的一系列用于监控和管理应用程序的工具和服务。 SpringBoot导航端点 其中localhost:8080/actuator/health是健康检查端点&#xff0c;加上以下配置&#xf…

基于PHP构建的HTML5点餐系统的设计13.91

随着互联网时代的发展&#xff0c;人们的生活方式正在发生改变。传统的餐饮行业也正在发生变革。人们不再满足过去的点餐方式&#xff0c;需要更好的体验。本课题旨在结合点餐系统的技术优势&#xff0c;设计一个能够方便顾客与商家&#xff0c;并且节约人力成本以及可以很好地…

中国金融统计年鉴、中国保险统计年鉴、中国人口与就业统计年鉴、国民经济和社会发展公报、中国劳动统计年鉴

数据下载链接&#xff1a;百度云下载链接 统计年鉴是指以统计图表和分析说明为主&#xff0c;通过高度密集的统计数据来全面、系统、连续地记录年度经济、社会等各方面发展情况的大型工具书来获取统计数据资料。 统计年鉴是进行各项经济、社会研究的必要前提。而借助于统计年…

Java代码基础算法练习---2024.3.14

其实这就是从我学校的资源&#xff0c;都比较基础的算法题&#xff0c;先尽量每天都做1-2题&#xff0c;练手感。毕竟离我真正去尝试入职好的公司&#xff08;我指的就是中大厂&#xff0c;但是任重道远啊&#xff09;&#xff0c;仍有一定的时间&#xff0c;至少要等我升本之后…

【黑马程序员】Python文件、异常、模块、包

文章目录 文件操作文件编码什么是编码为什么要使用编码 文件的读取openmodel常用的三种基础访问模式读操作相关方法 文件的写入注意代码示例 异常定义异常捕获捕获指定异常捕获多个异常捕获所有异常异常else异常finally 异常的传递 python 模块定义模块的导入import模块名from …

【北京大学】徐高《金融经济学二十五讲》

一、经济的任务 经济的任务之一是确保有效地分配稀缺资源&#xff0c;这是经济学中的一个核心问题。资源是有限的&#xff0c;而需求是无限的&#xff0c;因此经济系统需要通过合理的机制来分配资源以满足社会的需求。以下是关于经济分配资源的几个方面&#xff1a; 1. 资源配…

【RPG Maker MV 仿新仙剑 战斗场景UI (三)】

RPG Maker MV 仿新仙剑 战斗场景UI 三 二级战斗指令菜单RMMV效果代码效果 仿仙剑UI代码效果 二级战斗指令菜单 仙剑1中二级战斗的菜单内容如下&#xff1a;物品、防御、围攻、逃跑、状态这五项。 现在来完成金玉其外的UI部分&#xff0c;内核具体的功能需要后期进行填充了&…

聚酰亚胺PI材料难于粘接,用什么胶水粘接?那么让我们先一步步的从认识它开始(一)

聚酰亚胺PI的基本概念 聚酰亚胺&#xff08;Polyimide&#xff0c;简称PI&#xff09;是一种重要的高性能聚合物材料。是指主链上含有酰亚胺环的一类聚合物&#xff0c;是综合性能最佳的有机高分子材料之一。它具有最高的阻燃等级&#xff08;UL-94&#xff09;&#xff0c;以及…

C语言从入门到实战————数组和指针的深入理解

前言 在C语言中&#xff0c;数组和指针有的密切得联系&#xff0c;因为数组名本身就相当于一个指针常量。指针是一个变量&#xff0c;专门用来存储另一个变量的内存地址&#xff0c;通过这个地址可以访问和操作该变量的值&#xff0c;同时也包括数组。数组是一组连续存储的同类…

离线安装数据库 mysql 5.7 linux

离线安装数据库 mysql 5.7 linux 方法一 参考链接Linux(Debian10.2)安装MySQL5.7.24环境 赋予文件执行权限chmod x 文件名 使用root用户sudo su解压文件tar xvf mysql-5.7.42-linux-glibc2.12-x86_64.tar.gz重命名mv mysql-5.7.42-linux-glibc2.12-x86_64 mysql将桌面的mys…

【WSL】Windows wsl2 子系统忘记密码,重置修改用户密码

1.问题 windows 子系统 ubuntu 忘记密码&#xff0c;sudo 命令无法使用&#xff0c;需要重置密码 2. 解决 使用 wsl 命令进行修改&#xff0c;打开 cmd 窗口 # root 打开 wsl --user root # 修改 root 密码 passwd root # 修改用户密码 passwd username

【ARM】DS中Coretex-M处理器的常用寄存器介绍

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 了解ArmDS中Coretex-M处理器的常用寄存器的名称及作用。 2、 问题场景 在对Coretex-M处理器进行开发时&#xff0c;了解常用寄存器的名称及作用&#xff0c;可以&#xff1a; 编写正确的程序: 寄存器是程序员用…

AI会取代低代码吗?——探讨两者在软件开发中的角色和关系

引言 在当今快速发展的数字化时代&#xff0c;软件开发已成为企业和商户必不可少的一项工作。为了应对不断增长的需求和日益复杂的业务要求&#xff0c;开发人员和企业正在寻求更加高效、快速的软件开发解决方案。在这样的背景下&#xff0c;低代码开发平台和人工智能&#xf…

【嵌入式开发·Arduino板】I2C接口通讯及应用 | 串口通讯实例 | I2C的类库函数,I2C接口的应用

“跟猫学,保持冷漠,适当撒娇,几乎不动心。跟猪学,保持食欲,充足睡眠,几乎不烦恼。” 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人工智能领域…

集合系列(四) -LinkedHashMap详解

一、摘要 在集合系列的第一章&#xff0c;咱们了解到&#xff0c;Map的实现类有HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties等等。 本文主要从数据结构和算法层面&#xff0c;探讨LinkedHashMap的实现。 二、简介 LinkedHashMap可…

虚拟机网络链接

在虚拟网络设置中找到如下界面&#xff1a; "子网 IP" 192.168.79.0/24 表示一个局域网络&#xff0c;它有254个可能的IP地址可供分配&#xff08;192.168.79.1到192.168.79.254&#xff09;&#xff0c;255.255.255.0 是子网掩码&#xff0c;定义了网络和主机部分。…

python练习一

1. 五个PPT上的界面打印【print、input函数】 print("\t\t\t\t\t英雄联盟商城登录界面\n~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~\n\t\t\t\t\t1. 用户登录\n\t\t\t\t\t2. 新用户注册\n\t\t\t\t\t3. 退出系统\n" "~ * ~ * ~ * ~ * ~ * ~ * ~…

代码随想录算法训练营第二十三天 | 77. 组合

回溯 77. 组合 题目链接&#xff1a;https://leetcode.cn/problems/combinations/ 文章讲解&#xff1a;https://programmercarl.com/0077.%E7%BB%84%E5%90%88.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1ti4y1L7cv/ class Solution { private:vector<…

菜刀HTTPTCP后门分析+防范

“菜刀”对于渗透测试者来说耳熟能详&#xff0c;但是大家用的菜刀真的安全吗&#xff1f;你能保证你所使用的工具不会被别人偷偷的塞入后门吗&#xff1f; 如果菜刀中被塞入后门 那我们岂不是成了别人的苦力。辛辛苦苦打下的shell就这样不知不觉的被别人窃取&#xff0c;怎能…