串的存储结构 --王道

简介: 目录一、串的顺序存储1、静态数组实现(定长顺序存储)2、动态数组实现(堆分配存储) 3、存储方案​编辑 4、串的链式存储5、基本操作的实现6、求子串的实现方式7、比较俩个串的大小8、定位操作

目录

一、串的顺序存储

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

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

3、存储方案编辑

4、串的链式存储

5、基本操作的实现

6、求子串的实现方式

7、比较俩个串的大小

8、定位操作


一、串的顺序存储

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、存储方案

image.png

4、串的链式存储

(一)

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

image.png

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

(二)

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

image.png

存储密度提高


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


6、求子串的实现方式

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

7、比较俩个串的大小

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; 
 }

8、定位操作

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相等的子串
}


相关文章
免费物流快递单号查询API接口及使用教程
因为需要对接物流/快递公司接口,时常会陷入选择服务商的困境,这次我整理了市场上几乎所有主流的物流/快递api接口,并且按照支持数量、接口的丰富性/稳定性/即时性,以及价格等因素,对各大服务商做了一个评级。
|
11月前
|
安全 网络协议 Linux
内网穿透工具Frp
【10月更文挑战第6天】内网穿透工具Frp
1012 67
|
缓存 负载均衡 网络协议
一文讲懂Nginx常用配置及和基本功能
一文讲懂Nginx常用配置及和基本功能
751 1
|
关系型数据库 分布式数据库 数据库
PolarDB产品使用问题之数据库处于只读状态,如何恢复其读写功能
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之数据库处于只读状态,如何恢复其读写功能
|
11月前
|
网络协议 大数据 网络架构
桥接模式和NET模式的区别
桥接模式和NET模式的区别
413 0
|
存储 算法 安全
一文带你学习“国密算法”
一文带你学习“国密算法”
1716 3
一文带你学习“国密算法”
|
并行计算 安全 Python
深入理解Python多线程:GIL全局解释器锁的影响
深入理解Python多线程:GIL全局解释器锁的影响
369 0
|
运维 Kubernetes 安全
评测文章:阿里云容器服务ACK
阿里云容器服务(Alibaba Cloud Container Service for Kubernetes,简称 ACK)是一个全托管的 Kubernetes 容器管理服务。它可以帮助企业在云上高效地部署、管理和扩展容器化应用。本文将详细评测 ACK 的功能、优势及其应用场景,帮助读者更好地理解和使用这一服务。
|
机器学习/深度学习 存储 人工智能
深度学习经典网络解析图像分类篇(五):VGG
 VGGNet是在ImageNet Challenge 2014在定位和分类过程中分别获得了第一名和第二名的神经网络架构。VGGNet是牛津大学计算机视觉组和DeepMind公司的研究员一起研发的深度卷积神经网络。VGG主要探究了卷积神经网络的深度和其性能之间的关系,通过反复堆叠3×3的小卷积核和2×2的最大池化层,VGGNet成功的搭建了16-19层的深度卷积神经网络。
663 0
|
人工智能 搜索推荐
‘通义万相’使用体验——令人惊艳的AI绘画创作大模型
7月7日,阿里云在2023世界人工智能大会上宣布,AI绘画创作大模型通义万相开启定向邀测。通义万相是阿里云“通义”大模型系列第三个产品,此前的通义千问、通义听悟分别具备文字问答和语音文字处理的功能。目前该模型已经开启定向邀测.