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

串的存储结构 --王道

本篇文章参考王道网课的内容

目录

一、串的顺序存储

1、静态数组实现(定长顺序存储)

2、动态数组实现(堆分配存储)

 3、存储方案​编辑

 4、串的链式存储

5、基本操作的实现

六、求子串的实现方式

七、比较俩个串的大小

八、定位操作


一、串的顺序存储

1、静态数组实现(定长顺序存储)

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

 

2、动态数组实现(堆分配存储)

typedef struct{
	char *ch;   //按串长分配存储区,ch指向串的基地址
	int length; //串的长度 
}HString;
//用完需要手动free 
HString S;
S.ch = (char *) malloc(MAXLEN * sizeof(char));
S.length = 0; 

 

 3、存储方案

 

 4、串的链式存储

(一)

typedef struct StringNode{
	char ch;
	struct StringLNode *next;	
}StringNode,*String;

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

 (二)

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

 

存储密度提高 

5、基本操作的实现

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和S2联接而成的新串———可能会导致存储空间的扩展;

六、求子串的实现方式

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

七、比较俩个串的大小

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

 
 int StrCompare(SString S,SString T)
 {
 	for(int i = 0;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) :定位操作。若主串S中存在与串T值相同的子串,则返回它与主串S中第一次出现的位置;否则函数值为0

// 3. 定位操作
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相等的子串
}

相关文章:

  • React路由规则的定义、声明式导航、编程式导航
  • Java_四种内部类
  • Java lang包简介说明
  • 推荐一款替代Navicat的MySQL数据库管理工具-HeidSQL
  • R语言使用lm函数构建分层线性回归模型(添加分组变量构建分层线性回归模型)、使用summary函数获取分层线性回归模型汇总统计信息
  • Maven坐标查找方法及Maven-Search 插件的使用(保姆级教学)
  • 搭建nodejs环境
  • 【Android】之屏幕适配
  • 【JavaScript】五个常用功能/案例:计时器 | 流程控制 | 闭包应用 | arguments剩余参数 | 二次封装函数
  • Java Applet
  • 回归分析与模型诊断——作业
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • CF1443C题解
  • Tomcat相关概念
  • 网上商城之订单
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 0基础学习移动端适配
  • Angular数据绑定机制
  • CentOS 7 修改主机名
  • gf框架之分页模块(五) - 自定义分页
  • IP路由与转发
  • java8 Stream Pipelines 浅析
  • Linux中的硬链接与软链接
  • Netty 4.1 源代码学习:线程模型
  • Vue.js 移动端适配之 vw 解决方案
  • Web标准制定过程
  • 安卓应用性能调试和优化经验分享
  • 搭建gitbook 和 访问权限认证
  • 关于Flux,Vuex,Redux的思考
  • 前端性能优化--懒加载和预加载
  • 小试R空间处理新库sf
  • 字符串匹配基础上
  • 你对linux中grep命令知道多少?
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • 如何用纯 CSS 创作一个货车 loader
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #pragma data_seg 共享数据区(转)
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2022 CVPR) Unbiased Teacher v2
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (C++20) consteval立即函数
  • (poj1.2.1)1970(筛选法模拟)
  • (八十八)VFL语言初步 - 实现布局
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (附源码)计算机毕业设计ssm电影分享网站
  • (南京观海微电子)——I3C协议介绍
  • (十一)图像的罗伯特梯度锐化
  • (译)2019年前端性能优化清单 — 下篇
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .a文件和.so文件
  • .NET : 在VS2008中计算代码度量值
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值