串的存储结构

news2025/7/18 10:00:50

串其实是一种特殊的线性表,用什么样的存储结构实现线性表就可以类似的用什么样的方法实现串

一、串的顺序存储

1.静态数组(定长顺序存储):

//定义一个静态数组实现

#define MAXLEN 255        //预定义最大串长为255
typedef struct{
    char ch [MAXLEN];         //每个分量存储一个字符
    int length;               //串的实际长度
}SString;


分配连续的存储空间,每个char字符占1B                          length为串的实际长度

该方法的缺点就是长度固定不可变

 2.动态数组(对分配存储):

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

 


HString S;
s.ch = ( char *) malloc(MAXLEN* sizeof( char) ) ;      //用完需要手动free
s.length = 0;


 二、串的链式存储

typedef struct StringNode{
    char ch;             //每个结点存1个字符
    struct StringNode * next;
}StringNode,* String;

 存储密度低:每个字符1B,每个指针4B 。

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

存储密度提高。

 

三、基本操作的实现:

StrAssign(&T,chars):赋值操作。把串T赋值为chars。

StrCopy(&T,S):复制操作。由串s复制得到串T。
StrEmpty(S):判空操作。若s为空串,则返回TRUE,否则返回FALSE。

StrLength(S):求串长。返回串s的元素个数。
ClearString(&S):清空操作。将s清为空串。

DestroyString(&S):销毁串。将串s销毁(回收存储空间)。
Concat(&T,S1,S2):串联接。用T返回由S1和S21联接而成的新串


 

1. SubString(&Sub,S,pos,len):求子串。用Sub返回串S的第pos个字符起长度为len的子串。
 

//定义一个静态数组实现

#define MAXLEN 255        //预定义最大串长为255
typedef struct{
    char ch [MAXLEN];         //每个分量存储一个字符
    int length;               //串的实际长度
}SString;



//求子串
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;
}

2. StrCompare(S,T):比较操作。若S>T,则返回值>0;若S=T,则返回值=O;若S<T,则返回值<0。


 

//比较操作。若S>T,则返回值>0;若S=T,则返回植=若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;
}

3.Index(S,T):定位操作。若主串S中存在与串T值相同的子串,则返回它在主串S中第一次出现位置;否则函数值为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) ;
       if(StrCompare(sub,T)!=0)    ++i;
       else return i;        //返回子串在主串中的位置
    }
    return 0;                //S中不存在与T相等的子串
}

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

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

相关文章

代码随想录35期Day08-字符串

344.反转字符串 位运算 func reverseString(s []byte) {l : 0r : len(s) - 1for l < r {s[l] ^ s[r]s[r] ^ s[l]s[l] ^ s[r]lr--} }541. 反转字符串II 没技巧 func reverseStringRange(s []byte, l int, r int) {if r > len(s) {r len(s) - 1}for l < r {s[l] ^…

【智能算法】火鹰优化算法(FHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2023年&#xff0c;M Azizi等人受到自然界火鹰狩猎行为启发&#xff0c;提出了火鹰优化算法&#xff08;Fire Hawk Optimizer, FHO&#xff09;。 2.算法原理 2.1算法思想 FHO使用特殊的控制和捕…

DepthFormer论文详解

摘要 本文旨在解决有监督单目深度估计的问题&#xff0c;我们从一项细致的试点研究开始&#xff0c;以证明远程相关性对于准确的深度估计至关重要。我们建议使用Transformer以有效地注意力机制对这种全局上下文进行建模。我们还采用一个额外的卷积分支来保留局部信息&#xff0…

使用Datax自定义采集组件Reader/Writer实现国产数据库支持以及_Datax数据清洗/过滤规则功能自定义---大数据之DataX工作笔记007

我们基于datax来做的自己的数据采集系统,现在基本的数据采集已经实现了,也就是调用datax的数据采集能力,实现在已支持的数据库之间同步数据.我们是基于datax-web实现的,里面都有开源的代码了,可以分析以后拿过来用,这个过程并不复杂,而且,结合xxljob的web那个开源项目,也可以让…

wps可以打钩的框框

方法一&#xff1a; 输入2611&#xff0c;按下altx 方法二&#xff1a; R 选中后->开始->字体wingdings字体

密码学与密码安全:理论与实践

title: 密码学与密码安全&#xff1a;理论与实践 date: 2024/4/10 21:22:31 updated: 2024/4/10 21:22:31 tags: 密码学加密算法安全协议密码分析密码安全实际应用未来发展 第一章&#xff1a;密码学基础 1.1 密码学概述 密码学是研究如何保护信息安全的学科&#xff0c;旨在…

SSRF靶场

SSRF概述 ​ 强制服务器发送一个攻击者的请求 ​ 互联网上的很多web应用提供了从其他服务器&#xff08;也可以是本地)获取数据的功能。使用用户指定的URL&#xff0c;web应用可以获取图片&#xff08;载入图片&#xff09;、文件资源&#xff08;下载或读取)。如下图所示&…

【鸿蒙开发】应用状态管理LocalStorage,AppStorage,PersistentStorage

0. 应用状态管理 LocalStorage&#xff1a;页面级UI状态存储&#xff0c;通常用于UIAbility内、页面间的状态共享。AppStorage&#xff1a;特殊的单例LocalStorage对象&#xff0c;由UI框架在应用程序启动时创建&#xff0c;为应用程序UI状态属性提供中央存储&#xff1b;Pers…

鸿蒙HarmonyOS开发实例:【分布式关系型数据库】

介绍 本示例使用[ohos.data.relationalStore]接口和[ohos.distributedDeviceManager] 接口展示了在eTS中分布式关系型数据库的使用&#xff0c;在增、删、改、查的基本操作外&#xff0c;还包括分布式数据库的数据同步同能。 效果预览 使用说明: 启动应用后点击“ ”按钮可…

实验1 eNSP安装与使用

实验1 eNSP安装与使用 一、 原理描述二、 实验目的三、 实验内容四、 实验步骤1.下载并安装eNSP2.eNSP软件界面3.搭建并运行网络拓扑4. Wireshark 捕获分组并分析 一、 原理描述 eNSP&#xff08;Enterprise Network Simulation Platform&#xff09;是由华为提供的免费网络模…

TrollInstallerX官方一键安装巨魔商店

TrollInstallerX是巨魔官方开发的一款一键巨魔商店安装器&#xff0c;完美支持iOS 14.0 – 16.6.1的设备&#xff0c;操作非常简单&#xff0c;TrollInstallerX依然有个小小的限制&#xff0c;部分机型&#xff0c;还是要采用间接安装方法。 一&#xff0c;直接安装方法 通过…

探索进程控制第一弹(进程终止、进程等待)

文章目录 进程创建初识fork函数fork函数返回值fork常规用法fork调用失败的原因 写时拷贝进程终止进程终止是在做什么&#xff1f;进程终止的情况代码跑完&#xff0c;结果正确/不正确代码异常终止 如何终止 进程等待概述进程等待方法wait方法waitpid 进程创建 初识fork函数 在…

C++ 线程库(thread)与锁(mutex)

一.线程库(thread) 1.1 线程类的简单介绍 thread类文档介绍 在C11之前&#xff0c;涉及到多线程问题&#xff0c;都是和平台相关的&#xff0c;比如windows和linux下各有自己的接口&#xff0c;这使得代码的可移植性比较差。C11中最重要的特性就是对线程进行支持了&#xff…

数据结构与算法——字符串暴力匹配

一、字符串的组成 1.数据域&#xff0c;字符串的内容 2.字符串的长度 二、模式匹配-暴力匹配原理 1.两个字符串一个主串一个模式串用两个指针对其进行匹配 2、两个指针所对应的值相同时继续匹配下一个 3、当出现不匹配的情况时&#xff0c;回溯主串的指针到刚开始起点的下一个位…

IP地址定位技术在各领域的作用

IP地址定位是通过确定IP地址的物理位置来定位一个设备的技术&#xff0c;它在现代社会的多个领域中都有着广泛的应用。以下将详细探讨IP地址定位的应用场景&#xff0c;以期对读者有所启发。 首先&#xff0c;在网络安全领域&#xff0c;IP地址定位发挥着至关重要的作用。网络…

业务逻辑漏洞(靶场) fiddler

目录 fiddler简介&#xff1a; 业务逻辑漏洞&#xff1a; fiddler下载 靶场&#xff1a; 实验一 ​编辑实验二&#xff08;ps 更改实验url会变&#xff0c;fiddler没抓到东西看看代理改没改&#xff09; 实验三 实验四 fiddler简介&#xff1a; 一款网络抓包工具&#…

如何丝滑地切换node版本

背景 由于有些比较老的系统&#xff0c;使用的node版本较低&#xff0c;本机装的node版本又比较高&#xff0c;不想降node版本&#xff0c;那么就需要考虑能不能在系统里管理多个node版本呢&#xff1f;由于我使用的操作系统是Mac&#xff0c;下面将主要讲解如何在Mac上快速切…

Tmux 使用笔记

Tmux 是一个终端复用器&#xff08;terminal multiplexer&#xff09;&#xff0c;非常有用&#xff0c;属于常用的开发工具。 本文记录个人使用 Tmux的命令。 1. tmux简介 命令行的典型使用方式是&#xff0c;打开一个终端窗口&#xff0c;连接计算机&#xff0c;在里面输入…

LeetCode-热题100:148. 排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a; head [4,2,1,3] 输出&#xff1a; [1,2,3,4] 示例 2&#xff1a; 输入&#xff1a; head [-1,5,3,4,0] 输出&#xff1a; [-1,0,3,4,5] 示例…

探索未来产业:新技术、新商业、新趋势

引言 随着科技的迅速发展和全球经济的不断变化&#xff0c;未来产业已经成为全球关注的焦点之一。未来产业的兴起不仅代表着新的商业机遇&#xff0c;更是对传统产业模式的颠覆和重构。在这个充满挑战和机遇的时代&#xff0c;我们不得不认真思考未来产业的重要性和前景。 未…