百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

C语言中数据结构(堆串)、字符串处理函数

yuyutoo 2024-10-23 16:43 10 浏览 0 评论

在上一篇我们介绍了,定长顺序串,它缺点很明显,就是一开始必须分配一个足够长度的内存空间,要是用不完,那么就会浪费内存空间,要是初始分配的内存空间不够(如我们需要插入、置换、连接等操作),那么会发生截断,导致数据丢失,这有点不好,今天我们继续介绍数据结构串中的堆串,完美的解决了,定长顺序串存在的问题,它的特点呢,就是仍然以一组连续的内存空间存储字符序列,但是它是根据需要动态的分配内存空间,这就不需要考虑空间够不够用的问题了,下面我们就来介绍堆串的知识。

一、堆串:

既然要动态分配内存空间,那我们就需要用到动态内存管理函数了,前面已经说过,malloc函数、realloc函数、free函数就是动态内存管理函数,我们堆串就需要用到这些函数,首先,我们既然要动态分配内存空间,那么我们就需要一个字符指针,用于指向动态分配内存的首地址,然后,我们需要记录元素长度,整型表示,在这里我们的长度一般等于分配的内存空间长度,因为我们每次分配都会根据需要分配正好的内存空间,不会多也不会少,由上面我们得到堆串结构体,如下:

结构体

成员包含一个字符指针,一个整型变量,很简洁。

下面一个函数我们直接给串赋初值,如下:

串赋值函数

首先初始长度设为0,然后判断hs成员指针变量是否已经被分配内存空间,如果已分配,那么我们需要释放掉这片内存空间,然后在根据需要赋值字符串(ch)的长度,在分配相应的内存空间,while循环来得到需要赋值字符串的长度,然后判断得到的长度是否为0,如果不为0,那么我们就分配length长度的内存空间,然后通过for循环我们为串赋值,注意的是到最后我们需要手动添加空字符,如果为0,我们把串内成员指针初始化NULL。

1、串插入函数:

串插入函数顾名思义,就是将一个串插入另一个串中,因为是动态分配相应的内存空间,所以不需要考虑定长顺序串是否超出初始分配的最大长度的问题,我们先直接看下有关函数:

串插入函数

在函数中我们首先判断插入位置pos合法与否,判断被插入的串hs是否为空,空那就返回1,然后根据realloc重新分配两个串长度之和的内存空间,在这里我不建议使用realloc函数,因为上面的程序一旦分配失败,那么将会丢失掉原来的数据,因此我们可以使用局部字符指针变量,但是在这里为了方便,但是基本思路都是一样的,如果分配成功那么我们就可以使用循环来插入数据,首先我们通过第一个循环让插入位置pos后面的字符向后移动T->length的长度,然后在插入T串的数据,最后我们改变hs->length的数值,在末尾手动添加空字符。

2、删除指定位置的子串:

先看一下有关函数:

删除子串函数

在上面函数中,我们首先声明一个局部字符指针,用以指向后面分配内存的首地址,然后在判断删除的起始位置是否合法,注意pos+len不能大于主串的长度,然后分配删除后内存空间长为主串长-len,在判断是否分配成功,不成功返回1,然后往新的内存空间中赋值,先把pos前的字符赋给mid,然后再把pos+len位置到后面的字符赋给mid,最后我们改变length的值,注意在mid尾部手动添加空字符,然后现将原来的内存空间是否,再把新内存空间赋给hs->base。

3、定位函数:

该函数的作用是判断一个串,是否是主串的子串,如果是那么返回子串在主串中第一次出现的位置,下面我们看一下代码:

定位函数

上面我们首先判断串是否为空、还有pos序号是否正确,pos序号指代在主串位置pos后面查找是否有匹配的子串,后面我们先声明几个局部整型变量,i、j指代主串与子串的索引,count用作计数器,然后通过while判断是否已经到串最后,然后在通过if-else语句判断是否相等,相等各索引加1,如果计数器count=子串长度说明已找到,那么退出循环返回位置,如果不等,那么i继续增加,j、count置0。

上面就是堆串的一些常用基本操作,当然还有求子串函数、串比较函数等一些基本操作,暂时在这里暂不作讨论,因为这些基本操作很简单,因此暂时介绍到这里。

二、字符串处理函数:

1、strdup函数:

该函数的功能是将字符串复制到新建立的内存空间。

其一般形式是:

char *strdup(const char *s);

参数s是需要复制的字符串。

返回值:返回字符串指针,该指针指向复制后的新字符串地址。

注意:返回的指针指向的新内存地址空间,里面存放的只不过是s的一份拷贝,它们是没有关系的。

范例:

范例

2、strchr函数:

其一般形式为:

char *strchr(const char *s,char ch);

参数:s为要查找的目标字符串,

ch为要查找的字符,当然第二个参数也可以是整型变量。

作用:查找字符ch第一次在字符串s出现的指定位置。

返回值:如果找到则返回指向字符串s中第一次出现指定字符位置的指针。否则返回NULL。

范例:

范例

运行结果:

结果

好了,今天暂时只介绍到这里,下次继续介绍。

相关推荐

自卑的人容易患抑郁症吗?(自卑会导致抑郁吗)

Filephoto[Photo/IC]Lowself-esteemmakesusfeelbadaboutourselves.Butdidyouknowthatovert...

中考典型同(近)义词组(同义词考题)

中考典型同(近)义词组...

WPF 消息传递简明教程(wpf messagebox.show)

...

BroadcastReceiver的原理和使用(broadcast-suppression)

一、使用中注意的几点1.动态注册、静态注册的优先级在AndroidManifest.xml中静态注册的receiver比在代码中用registerReceiver动态注册的优先级要低。发送方在send...

Arduino通过串口透传ESP 13板与java程序交互

ESP13---是一个无线板子,配置通过热点通信Arduino通过串口透传ESP13板与java程序交互...

zookeeper的Leader选举源码解析(zookeeper角色选举角色包括)

作者:京东物流梁吉超zookeeper是一个分布式服务框架,主要解决分布式应用中常见的多种数据问题,例如集群管理,状态同步等。为解决这些问题zookeeper需要Leader选举进行保障数据的强一致...

接待外国人英文口语(接待外国友人的英语口语对话)

接待外国人英文口语询问访客身份:  MayIhaveyourname,please?  请问您贵姓?  Whatcompanyareyoufrom?  您是哪个公司的?  Could...

一文深入理解AP架构Nacos注册原理

Nacos简介Nacos是一款阿里巴巴开源用于管理分布式微服务的中间件,能够帮助开发人员快速实现动态服务发现、服务配置、服务元数据及流量管理等。这篇文章主要剖析一下Nacos作为注册中心时其服务注册与...

Android面试宝典之终极大招(android面试及答案)

以下内容来自兆隆IT云学院就业部,根据多年成功就业服务经验,以及职业素养课程部分内容,归纳总结:18.请描述一下Intent和IntentFilter。Android中通过Intent...

除了Crontab,Swoole Timer也可以实现定时任务的

一般的定时器是怎么实现的呢?我总结如下:1.使用Crontab工具,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本;2.ignore_user_abort()和set_time_li...

Spark源码阅读:DataFrame.collect 作业提交流程思维导图

本文分为两个部分:作业提交流程思维导图关键函数列表作业提交流程思维导图...

使用Xamarin和Visual Studio开发Android可穿戴设备应用

搭建开发环境我们需要做的第一件事情是安装必要的工具。因此,你需要首先安装VisualStudio。如果您使用的是VisualStudio2010,2012或2013,那么请确保它是一个专业版本或...

Android开发者必知的5个开源库(android 开发相关源码精编解析)

过去的时间里,Android开发逐步走向成熟,一个个与Android相关的开发工具也层出不穷。不过,在面对各种新鲜事物时,不要忘了那些我们每天使用的大量开源库。在这里,向大家介绍的就是,在这个任劳任怨...

Android事件总线还能怎么玩?(android实现事件处理的步骤)

顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码...

Android 开发中文引导-应用小部件

应用小部件是可以嵌入其它应用(例如主屏幕)并收到定期更新的微型应用视图。这些视图在用户界面中被叫做小部件,并可以用应用小部件提供者发布。可以容纳其他应用部件的应用组件叫做应用部件的宿主(1)。下面的截...

取消回复欢迎 发表评论: