当前位置: 首页 > news >正文

04-4.1.2 串的存储结构

  • 👋 Hi, I’m @Beast Cheng
  • 👀 I’m interested in photography, hiking, landscape…
  • 🌱 I’m currently learning python, javascript, kotlin…
  • 📫 How to reach me --> 458290771@qq.com

喜欢《数据结构》部分笔记的小伙伴可以订阅专栏,今后还会不断更新。🧑‍💻
此外,《程序员必备技能》专栏日后会逐步更新,感兴趣的小伙伴可以点一下订阅、收藏、关注!🚀
谢谢大家!🙏

顺序存储

// 静态数组实现
#define MAXLEN 255    // 预定义最大串长为255
typedef struct{char ch[MAXLEN];  // 每个分量存储一个字符int length;       // 串的实际长度
}SString;// 动态数组实现
typedef struct{char *ch;    // 按串长分配存储区,ch指向串的基地址int length;  // 串的长度
}HString;HString S;
S.ch = (char *) malloc (MAXLEN * sizeof(char));
S.length = 0;

考试过程中如果有提问优缺点,可以结合顺序表的知识思考优缺点[[2.2.1 顺序表的定义#顺序表的特点]]

串长的两种方案

  1. char ch[10] 变量 length 在最后
  2. char ch[0] 充当 length
    • 优点:字符的位序和数组下标相同
    • 缺点:字符串长度不能超过 255
  3. 没有length 变量,以字符 '\0' 表示结尾(对应 ASCII 码的 0)
    • 缺点:每次都需要遍历,如果经常需要使用到这个参数,这个方案不适合
  4. 教材采用的方案ch[0] 废弃不用,但是仍然在结尾处 int length;

链式存储

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

用这种存储方式,存储密度低,每个字符 1B,每个指针要用 4B 来存储,要解决这种问题,可以使每个结点存储多个字符

typedef struct StringNode{char ch[4];      // 每个节点存储4个字符,实际上还能更多struct StringNode *next;
}StringNode, *String;

基于顺序存储实现基本操作

SubString(&Sub, S, pos, len) 求子串

S.ch = "wangdao";
S.length = 7;// 求子串
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;
}

StrCompare(S, T) 比较两个串

// 比较
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;
}

Index(S, T) 定位

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;elsereturn i;     // 返回子串在主串中的位置}return 0;             // S中不存在与T相等的子串
}

相关文章:

  • 每日5题Day22 - LeetCode 106 - 110
  • windows上安装MongoDB,springboot整合MongoDB
  • vllm 使用FP8运行模型
  • iMazing3软件安装包下载
  • 【C++】——继承(详解)
  • 如何选择靠谱的LabVIEW外包公司
  • Web前端浪漫源码:编织梦想与爱的交织乐章
  • np.array()按权重求平均值详解
  • vue2插槽
  • PayPal,stripe,square轮询系统你不知道的秘密
  • 三次样条曲线和三次多项式曲线
  • 用质量属性场景来描述可用性(2024年上半年软考系统架构师案例分析题)
  • CSS中,设置 0.5px 会生效吗
  • Flask基础2-Jinja2模板
  • git版本控制工具常用命令
  • python3.6+scrapy+mysql 爬虫实战
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【面试系列】之二:关于js原型
  • Consul Config 使用Git做版本控制的实现
  • httpie使用详解
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • MobX
  • oschina
  • python学习笔记 - ThreadLocal
  • SpringCloud集成分布式事务LCN (一)
  • SpriteKit 技巧之添加背景图片
  • webgl (原生)基础入门指南【一】
  • Webpack 4 学习01(基础配置)
  • 第2章 网络文档
  • 关于for循环的简单归纳
  • 基于游标的分页接口实现
  • 开发基于以太坊智能合约的DApp
  • 盘点那些不知名却常用的 Git 操作
  • 强力优化Rancher k8s中国区的使用体验
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 无服务器化是企业 IT 架构的未来吗?
  • 7行Python代码的人脸识别
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • UI设计初学者应该如何入门?
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • # 数论-逆元
  • #pragma data_seg 共享数据区(转)
  • #QT项目实战(天气预报)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (1)(1.11) SiK Radio v2(一)
  • (1)常见O(n^2)排序算法解析
  • (2)Java 简介
  • (Python第六天)文件处理
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (STM32笔记)九、RCC时钟树与时钟 第一部分
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (十)Flink Table API 和 SQL 基本概念
  • (四) Graphivz 颜色选择