4.2.2 堆分配存储结构

4.1_2串的存储结构 subString(),Sub是空串用来返回目标子串,S为原串,pos截取子串的初始索引下标(因为char[0]的第一个位置没用,所以索引下标==位序)不包括该下标元素,len为截取长度,如pos=5,len=2,即截取如下主串中的下标为6-7字符,即截取a和o,把截取的每个字符依次放到Sub结构体中的ch[]数组里,注意数组下标越界问题,即pos+len<S主串长度,比如pos=5,len=7,则从下标为5开始几d字符开始,截取7个字符,很明显主串中下标为5之后没有7个字符,即数组下标越界。 阅读详情

 /* c4-2.h 串的堆分配存储 */
 typedef struct
 {
   char *ch; /* 若是非空串,则按串长分配存储区,否则ch为NULL */
   int length; /* 串长度 */
 }HString;

                                                                      

 

 /* bo4-2.c 串采用堆分配存储结构(由c4-2.h定义)的基本操作(14个)。包括算法4.1、4.4 */

 #define DestroyString ClearString /* DestroyString()与ClearString()作用相同 */

 void StrAssign(HString *T,char *chars)
 { /* 生成一个其值等于串常量chars的串T */
   int i,j;
   if((*T).ch)
     free((*T).ch); /* 释放T原有空间 */
   i=strlen(chars); /* 求chars的长度i */
   if(!i)
   { /* chars的长度为0 */
     (*T).ch=NULL;
     (*T).length=0;
   }
   else
   { /* chars的长度不为0 */
     (*T).ch=(char*)malloc(i*sizeof(char)); /* 分配串空间 */
     if(!(*T).ch) /* 分配串空间失败 */
       exit(OVERFLOW);
     for(j=0;j<i;j++) /* 拷贝串 */
       (*T).ch[j]=chars[j];
     (*T).length=i;
   }
 }

                                                                          

 void StrCopy(HString *T,HString S)
 { /* 初始条件:串S存在。操作结果:由串S复制得串T */
   int i;
   if((*T).ch)
     free((*T).ch); /* 释放T原有空间 */
   (*T).ch=(char*)malloc(S.length*sizeof(char)); /* 分配串空间 */
   if(!(*T).ch) /* 分配串空间失败 */
     exit(OVERFLOW);
   for(i=0;i<S.length;i++) /* 拷贝串 */
     (*T).ch[i]=S.ch[i];
   (*T).length=S.length;
 }

 Status StrEmpty(HString S)
 { /* 初始条件:串S存在。操作结果:若S为空串,则返回TRUE,否则返回FALSE */
   if(S.length==0&&S.ch==NULL)
     return TRUE;
   else
     return FALSE;
 }

 int StrCompare(HString S,HString T)
 { /* 若S>T,则返回值>0;若S=T,则返回值=0;若S<T,则返回值<0 */
   int i;
   for(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;
 }

 int StrLength(HString S)
 { /* 返回S的元素个数,称为串的长度 */
   return S.length;
 }

 void ClearString(HString *S)
 { /* 将S清为空串 */
   free((*S).ch);
   (*S).ch=NULL;
   (*S).length=0;
 }

                                                                  

 void Concat(HString *T,HString S1,HString S2)
 { /* 用T返回由S1和S2联接而成的新串 */
   int i;
   if((*T).ch)
     free((*T).ch); /* 释放旧空间 */
   (*T).length=S1.length+S2.length;
   (*T).ch=(char *)malloc((*T).length*sizeof(char));
   if(!(*T).ch)
     exit(OVERFLOW);
   for(i=0;i<S1.length;i++)
     (*T).ch[i]=S1.ch[i];
   for(i=0;i<S2.length;i++)
     (*T).ch[S1.length+i]=S2.ch[i];
 }

 Status SubString(HString *Sub, HString S,int pos,int len)
 { /* 用Sub返回串S的第pos个字符起长度为len的子串。 */
   /* 其中,1≤pos≤StrLength(S)且0≤len≤StrLength(S)-pos+1 */
   int i;
   if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
     return ERROR;
   if((*Sub).ch)
     free((*Sub).ch); /* 释放旧空间 */
   if(!len) /* 空子串 */
   {
     (*Sub).ch=NULL;
     (*Sub).length=0;
   }
   else
   { /* 完整子串 */
     (*Sub).ch=(char*)malloc(len*sizeof(char));
     if(!(*Sub).ch)
       exit(OVERFLOW);
     for(i=0;i<=len-1;i++)
       (*Sub).ch[i]=S.ch[pos-1+i];
     (*Sub).length=len;
   }
   return OK;
 }

 void InitString(HString *T)
 { /* 初始化(产生空串)字符串T。另加 */
   (*T).length=0;
   (*T).ch=NULL;
 }

 int Index(HString S,HString T,int pos) /* 算法4.1 */
 { /* T为非空串。若主串S中第pos个字符之后存在与T相等的子串,*/
   /* 则返回第一个这样的子串在S中的位置,否则返回0 */
   int n,m,i;
   HString sub;
   InitString(&sub);
   if(pos>0)
   {
     n=StrLength(S);
     m=StrLength(T);
     i=pos;
     while(i<=n-m+1)
     {
       SubString(&sub,S,i,m);
       if(StrCompare(sub,T)!=0)
         ++i;
       else
  return i;
     }
   }
   return 0;
  }

 Status StrInsert(HString *S,int pos,HString T) /* 算法4.4 */
 { /* 1≤pos≤StrLength(S)+1。在串S的第pos个字符之前插入串T */
   int i;
   if(pos<1||pos>(*S).length+1) /* pos不合法 */
     return ERROR;
   if(T.length) /* T非空,则重新分配空间,插入T */
   {
     (*S).ch=(char*)realloc((*S).ch,((*S).length+T.length)*sizeof(char));
     if(!(*S).ch)
       exit(OVERFLOW);
     for(i=(*S).length-1;i>=pos-1;--i) /* 为插入T而腾出位置 */
       (*S).ch[i+T.length]=(*S).ch[i];
     for(i=0;i<T.length;i++)
       (*S).ch[pos-1+i]=T.ch[i]; /* 插入T */
     (*S).length+=T.length;
   }
   return OK;
 }

 Status StrDelete(HString *S,int pos,int len)
 { /* 从串S中删除第pos个字符起长度为len的子串 */
   int i;
   if((*S).length<pos+len-1)
     return ERROR;
   for(i=pos-1;i<=(*S).length-len;i++)
     (*S).ch[i]=(*S).ch[i+len];
   (*S).length-=len;
   (*S).ch=(char*)realloc((*S).ch,(*S).length*sizeof(char));
   return OK;
 }

 Status Replace(HString *S,HString T,HString V) /* 此函数与串的存储结构无关 */
 { /* 初始条件:串S,T和V存在,T是非空串 */
   /* 操作结果:用V替换主串S中出现的所有与T相等的不重叠的子串 */
   int i=1; /* 从串S的第一个字符起查找串T */
   if(StrEmpty(T)) /* T是空串 */
     return ERROR;
   do
   {
     i=Index(*S,T,i); /* 结果i为从上一个i之后找到的子串T的位置 */
     if(i) /* 串S中存在串T */
     {
       StrDelete(S,i,StrLength(T)); /* 删除该串T */
       StrInsert(S,i,V); /* 在原串T的位置插入串V */
       i+=StrLength(V); /* 在插入的串V后面继续查找串T */
     }
   }while(i);
   return OK;
 }

 void StrPrint(HString T)
 { /* 输出T字符串。另加 */
   int i;
   for(i=0;i<T.length;i++)
     printf("%c",T.ch[i]);
   printf("\n");
 }

【C++实战篇】串的三种存储结构:定长存储、堆分配存储、块链存储 本文介绍了字符串的三种存储方式及其连接实现:定长顺序存储通过固定长度数组存储字符串,但存在截断风险;堆分配存储动态分配内存空间,可灵活调整;块链存储采用链表结构,通过增加节点存储字符数提高存储密度。文章分别展示了三种存储方式下字符串连接的具体实现代码,其中定长存储通过数组拷贝实现连接,堆存储动态分配内存空间,块链存储则通过链表节点操作完成连接。这三种方法各有优劣,适用于不同场景,为字符串处理提供了多样化的解决方案。 阅读详情

相关推荐

串的堆分配存储结构(C语言详解版)

串的堆分配存储,其具体实现方式是采用动态数组存储字符串。 通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类并存储到对应的区域。拿 C 语言来说,程序会将内存分为 4 个区域,分别为堆区、栈区、数据区和代码区,其中的堆区是本节所关注的。 与其他区域不同,堆区的内存空间需要程序员手动使用 malloc 函数申请,并且在不用后要手动通过 free 函数将其释放。 C 语...

数据结构和算法教程(C语言版) 3478

串的堆分配存储的若干解释

当小伙伴学到串的堆分配时看到串的结构体内容不知道有没有困惑。关于堆分配的特点和其他的课本讲过和其他人写过(引用)对内容就不在讲了。接下来上一下伪代码。 typedef struck{ char *ch;//按串长分配储存区,ch指向串的基地址 int length ;//串的长度 } HString 这里的length和定长存储一样,那有没有小伙伴会问为什么 结构体里会有char *ch 因为堆存储的存储是动态分配的,依赖于具体情况的空间大小,因此要根据情况确定空间之后开辟空间并将地址赋值给ch指针,比如

underearth1的博客 431

40分钟快速入门Dart基础(上)

针对final 和const 理解的有点模糊的可以参考这篇文章: 可以参考这里Flutter 知识梳理(Dart)-Dart中static final const 区别看是不是超级好上手,好操作~其实Dart的整个学习起来还是蛮简单的,对于有基础的老司机更简单一些。分分钟敲起来~这篇文章就简单的介绍到这里如何短时间快速入门Dart,避免入坑。由于是想让大家快速入门Flutter,所以针对上面的这些章节我们讲解的只是一些在开发Flutter 过程中常用的一些方法和函数。

qq_7813180 4572

串结构之堆分配存储详解(C语言版)

串结构之堆分配存储详解(C语言版)

qq_44075108的博客 1万+

语言随机效应模型_线性混合效应模型 VS 方差分析

线性混合效应模型相比方差分析具有很多优点。为了让大家更直观的了解,我们来做一下两者的对比。基于模拟的方法,生成了以下数据dat_sim:这种数据格式是长格式,也就是从实验软件导出来的那种数据格式。这种数据格式可以直接使用线性混合效应模型进行分析。该实验设计是被试内项目间的单因素两水平设计。category是自变量,两个水平分别是outgroup和ingroup,outgroup比ingr...

weixin_31960565的博客 2688

【75】OpenCV C++实战篇——OpenCV 图像拼接、全景拼接(教程合集)

本文整理了OpenCV实现图像拼接的技术教程合集,涵盖C++和Python两种语言实现方案。图像拼接技术旨在将多张重叠图像融合为无缝全景图,既扩大视角又保持高分辨率。内容包含水平矫正等关键步骤(附对比效果图),提供多个实战案例的完整代码和详细讲解,涉及单应性矩阵、图像变换等核心技术。不同案例展示了从两张到多张图像的拼接效果,适合不同层次的学习者参考实践。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 528

【数据结构】堆的详解

基本概念 定义:一个满足某种特定关系的序列{k1,k2,…,kn} 堆实际上是一个序列,因此堆的存储结构一般为数组。 进一步来看,堆本质上是一个完全二叉树的顺序存储,结合堆的数学性质,这个二叉树的每个父亲结点大于等于(小于等于)其孩子结点。 堆的操作 基本操作:pop、push and Init 堆的性质决定,堆顶元素为整个堆的最值,因此对堆顶的元素研究才有意义。从外部看,堆的基本操作为:push( ),pop( )。 pop( )操作说明:将入堆元素插入到最后,然后自该结点向上调整结点的位置( 保证每个

Fulllll的博客 1410

Qt入门教程【基础控件篇】QLineEdit输入框

QLineEdit输入框

小鱼酱的博客 3262

数据结构——堆

堆的本质是一个二叉树。与二叉树的区别在于:对于这颗二叉树而言,任何一个子树。根据这种关系堆又可以分为和。1、大根堆大根堆根节点上的数据左右两个孩子大的。看下面的图就很容易明白了。2、小根堆明白了大根堆后,小根堆大家一想便知道了吧,根节点上的数据左右两个孩子小的。这个时候肯定就要有人问了,如果这颗树的所有数据都一样呢?叫大根堆还是小根堆呢?理论上来说可以叫大根堆也可以叫等根堆。

2301_76227083的博客 6995

Bash Shell 系统巡检脚本

部分安全相关检查需要root权限,建议通过sudo运行完整检查。

老韩的Linux云计算架构师进阶之路 96

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

weixin_42162924的博客 38

串的堆分配存储

/* c4-2.h 串的堆分配存储 */ typedef struct { char *ch; /* 若是非空串,则按串长分配存储区,否则ch为NULL */ int length; /* 串长度 */ }HString;   /* bo4-2.c 串采用堆分配存储结构(由c4-2.h定义)的基本操作(15个) */ /* 包括算法4.1、4.4 *...

C语言、数据结构、算法 445

【EB_Tresos专题】-01-EB Tresos导入工程

<--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> 结尾 ...

「汽车电子助手」的博客 6434

串的堆分配存储表示

串的堆分配存储表示 前言 1、串的定长顺序存储结构的缺点是限定了串的长度,若超出长度则约定截断 2、堆分配存储表示解决上上面的问题,它动态分配串值得存储空间 3、串值共享的存储空间称之为堆,它由C语言的动态分配函数malloc和free管理 一、该结构最小操作子集代码实现如下 在这里插入代码片 ...

Mekeater的博客 7746

RH850系列芯片深度剖析 1.5-链接(ld)文件解析

基础编译过程分为四个阶段:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了编译系统。CONSTANTS接下来的内存空间定义部分会使用这些常量来定义内存空间的范围,理论上来说不定义常量也没有影响,直接用魔鬼数字代替,定义常量的主要目的就是方便理解以及方便修改;从示例中可以看出,常量的值可以为16进制或者10十进制,而且10进制支持数量级单位(k级,M级);

本博客专注于嵌入式软件领域技术分享。 1428

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

串采用堆分配存储结构的实现(第四章 P76 算法4.1,4.4)

串采用堆分配存储结构的实现 这种存储表示的特点是,仍以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配而得。 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */ typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */ #include...

但行好事,莫问前程 1628

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

串的表示和实现(串的堆分配存储、串的定长顺序存储结构)

在C 语言中,字符串存于字符型数组中。无论数组有多大,用数值0 表示串结束。图 41 表示了“but”字符串在C 语言中的存储结构。 其中数组a 的定义为 char a[10]; C 语言还在库函数string.h 中提供了许多串处理 的基本操作,如求串长函数strlen()、串拷贝函数 strcpy()等。 算法语言本身提供的字符串存储结构及其基本操作不一定能满足实际应用的需要,

7urin9'Blog 5110

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

串采用堆分配存储结构的基本操作

/* 串采用堆分配存储结构的基本操作(15个) */ /* 包括算法4.1、4.4 */ Status StrAssign(HString *T,char *chars) { /* 生成一个其值等于串常量chars的串T */ int i,j; if((*T).ch) free((*T).ch); /* 释放T原有空间 */ i=strlen(chars); /*

u011831120的专栏 1696

数据结构笔记(十三)-- 串的堆分配存储表示

串的堆分配存储表示 一、堆分配存储概述 堆分配内存仍是一组地址连续的存储单元来存放串值字符序列,但是存储空间实在程序执行过程中动态分配而得。在C语言中,存在一个称为“堆”的自由存储区,并由C语言的动态分配函数malloc()和free()来管理。利用函数malloc()为每个新产生的串分配一块实际串长所需的存储空间,若分配成功,则返回一个指向起始地址的指针,作为串的基址,同时为了方便以后的处理,约定串长也作为存储结构的一部分。 二、串的堆分配存储结构 三、串的操作 //1、初始化(产生空串)字符串S v

m0_43609475的博客 5566

字符串---串的堆分配存储结构

@Adrian 串的堆分配存储,其具体实现方式是采用动态数组存储字符串。 通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类并存储到对应的区域。拿 C 语言来说,程序会将内存分为 4 个区域,分别为堆区、栈区、数据区和代码区,其中的堆区是本节所关注的。 与其他区域不同,堆区的内存空间需要程序员手动使用 malloc 函数申请,并且在不用后要手动通过 free 函数将...

qq_43228581的博客 1372

串的堆分配存储c语言,串的堆分配存储结构

串的堆分配存储,其具体实现方式是采用动态数组存储字符串。通常,编程语言会将程序占有的内存空间分成多个不同的区域,程序包含的数据会被分门别类并存储到对应的区域。拿 C 语言来说,程序会将内存分为 4 个区域,分别为堆区、栈区、数据区和代码区,其中的堆区是本节所关注的。与其他区域不同,堆区的内存空间需要程序员手动使用 malloc 函数申请,并且在不用后要手动通过 free 函数将其释放。C 语言中使...

weixin_35733586的博客 527

串是什么,串存储结构的3种实现方法

因为 strcpy 函数是将字符串复制到申请的存储空间中,而直接赋值是字符串存储在别的内存空间(本身是一个常量,放在数据区)中,更改了指针 a1 和 a2 的指向,也就是说,之前动态申请的存储空间虽然申请了,结果还没用呢就丢了。例如,串 a = "shujujiegou",串 b = "jiegou",通过观察,可以判断 a 和 b 是主串和子串的关系,同时子串 b 位于主串 a 中第 6 的位置,因为在串 a 中,串 b 首字符 'j' 的位置是 6。,因为字符串中的字符之间也具有"一对一"的逻辑关系。

ZhangJiqun&191cm&85kg 650

【数据结构】串的定义;存储结构;基本操作的实现

串的定义;串的存储结构(顺序存储;链式存储;串的堆分配存储表示);串的基本操作(求子串;比较操作;定位操作);C语言实现串的基本操作

小人物,大梦想! 2155
上一篇: 第四章 串
下一篇: 4.2.3 串的块链存储表示
sjmp
博客等级 码龄15年 56粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值