/**
*毕竟这只是简单的串的链式存储结构,不过不同的对象操作不一样
*在此为了简化操作,很多菜单啊,选择结构之类的都省去了,这些都可以在之前的一些链表的基本的错中
*可以得到的仔细的结果,链表的操作是特别的重要的 ,尤其是链表的存储结构链式存储结构涉及到开辟空间
*地址的传递,指针等操作,所以在此有必要仔细研究这些,这是我系统的重新对数据结构重新编写一遍的结果
*纯属于个人的理解和分析的结果
*/

效果:

代码:
/**
*链式的串存储结构的实现
*
*/
#include <iostream>
#include <malloc.h>
#include <string.h>
using namespace std;
/**
*串的动态数组结构体的定义
*/
typedef struct{
char *str;
int maxLength;
int length;
}DString ;
/**
*初始化操作
*/
DString * Initiate(DString *s,int max,char *string){
int i ;
s = (DString *)malloc(sizeof(DString));
s->str = (char *)malloc(sizeof(char)*max );//申请动态数组空间
s->maxLength = max;//置动态数组 最大个数
s->length= strlen(string);//置串当前的长度
/**
*对串进行赋初值,以免后期操作的麻烦。
*/
for(i = 0; i< s->length;i++){
s->str[i] = string[i];
}
cout<<"初始化完成!"<<endl;
return s;
}
/**
*
*插入子串的操作
*/
int Insert(DString *s,int pos,DString *T){

char *p;
if(pos <0 || pos> s->length){
cout<<"参数pos出错!"<<endl;
return 0;
}else{
if(s->length +T->length>s->maxLength){
/**
*此时我们必须重新申请空间,以致于不会溢出
*/

p = (char *)realloc(s->str,(s->length+ T->length)*sizeof(char));
if(p == NULL){
cout<<"内存空间不足!"<<endl;
return 0;
}
}
for(int i = s->length- 1;i>= pos;i--){
s->str[i + T->length] = s->str[i];
}
for(int i = 0 ;i <T->length ;i++){
s->str[pos + i]= T->str[i];
}
s->length = s->length + T->length;
cout<<"插入成功!"<<endl;
return 1;
}
return 0;
}
/**
*删除子串操作
*
*/
int Delete(DString *s,int pos,int len){
if(s->length<= 0){
cout<<"数组中未放入任何字符!无数据可删!"<<endl;
return 0;
}else if(pos <0 || pos + len >s->length ||len < 0){
cout<<"参数pos或len不合法!"<<endl;
return 0 ;
}else{
for(int i = pos + len ;i< s->length ;i++){
s->str[i -len] =s->str[i];
}
s->length = s->length - len;
return 1;
}
}

/**
*取子串操作
*
*/
int SubString(DString *s,int pos,int len ,DString *T){
if(pos <0 ||len < 0|| pos +len > s->length){
cout<<"参数Len和pos 错误!"<<endl;
return 0;
}else{
for(int i = 0;i < len ;i++){
T->str[i] =s->str[pos + i];
}
T->length =len;
return 1;
}
}
void outPut(DString *s){
cout<<"字符串:"<<endl;
for(int i = 0; i<s->length ;i++){
cout<<s->str[i];
}
cout<<endl;
}

/**
*撤销操作来释放数组空间
*
*/
void Destroy(DString *s){
free(s->str);
s->maxLength = 0;
s->length = 0;
cout<<"撤销成功!"<<endl;
}
/**
*功能模块已经写完了
*现在写主函数来测功能
*/
int main(){
DString *p;
DString *T;
DString *p1;
//初始化操作
//cout<<"p="<<p<<"p1="<<p1<<endl;

cout<<"初始化操作:"<<endl;
p = Initiate(p,100,"Data");
p1 =Initiate(p1,50,"Struture ");
T = Initiate(T,50,"");
outPut(p);
outPut(p1);
cout<<endl;
//插入操作
cout<<"插入操作!"<<endl;

Insert(p,0,p1);
cout<<"输出操作:"<<endl;
outPut(p);

//取子串操作
cout<<"取子串操作:"<<endl;
SubString(p,0,12 ,T);
cout<<"输出所取得串:"<<endl;
outPut(T);
//删除操作
cout<<"删除操作!"<<endl;
Delete(p,0,5);
outPut(p);
//释放内存空间
cout<<"释放内存操作:"<<endl;
Destroy(p);
return 0;
}

转载于:https://www.cnblogs.com/qpxv/p/3765529.html

动态字符串的存储结构的实现相关推荐

  1. 字符串:1.存储结构

    数据结构中提到的串,即字符串,由 n 个字符组成的一个整体( n >= 0 ).这 n 个字符可以由字母.数字或者其他字符组成. 例如,S = "BEIJING" ,S 代表 ...

  2. 【Redis学习】Redis数据类型及存储结构

    最近再进行redis相关的学习,在网上查阅资料,总结如下: Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及zset(sortedset:有序集 ...

  3. Redis之简单动态字符串sds

    转载:https://segmentfault.com/a/1190000012262739 redis在处理字符串的时候没有直接使用以'\0'结尾的C语言字符串,而是封装了一下C语言字符串并命名为s ...

  4. 唯快不破:redis源码剖析04-sds动态字符串

    阅读完redis动态字符串封装最大的一个感悟就是封装的优美,在原有char *字符串基础上添加了字符串头部元信息,这样既方便了字符串的管理,又不失原有的使用方便性.并且充分调用了c底层api高效进行字 ...

  5. 数据结构第六篇——顺序存储结构与链式存储结构的特点

    ♥注:未经博主同意,不得转载. 两者特点: 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 它的优点: (1)方法简单,各种高级语言中都有数组,容易实现. ...

  6. 顺序存储结构与链式存储结构的比较

    2019独角兽企业重金招聘Python工程师标准>>> 一:顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 它的优点是: (1)方法简单 ...

  7. 线性表对于什么时候选用顺序表?什么时候选用链表作为线性表的存储结构为宜?

    在实际应用中,应根据具体问题的要求和性质来选择顺序表或链表作为线性表的存储结构,通常有一下几方面的考虑: 基于空间的考虑.当要求存储的线性表长度变化不大,易于实现确定其大小时,为了节约存储空间,宜采用 ...

  8. Redis-数据结构02-简单动态字符串(sds)

    上一章:Redis-数据结构01-压缩列表(ziplist) 下一章:Redis-数据结构03-跳跃表(skiplist) 一:sds的结构体 简单动态字符串(Simple Dynamic Strin ...

  9. 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。

    请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代 ...

  10. 请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代

    请实现一个算法,确定一个字符串的所有字符是否全都不同.这里我们要求不允许使用额外的存储结构. 给定一个string iniString,请返回一个bool值,True代表所有字符全都不同,False代 ...

最新文章

  1. java杂记-static
  2. DXperience 8.2.4 简繁体汉化,本地化,Skins包含webform,winform
  3. 跟我学 Java 8 新特性之 Stream 流(七)流与迭代器,流系列大结局
  4. ginkgo spi 错误_开发SPI时不要犯这个错误
  5. Python加盐加密方法hashlib(md5,sha224,sha1,sha256)
  6. 局域网聊天软件 设计文档怎么写?
  7. spring 优越性实践
  8. python入门教程pdf-Python入门教程详解.pdf
  9. Full RangeLimited Range
  10. Python3自然语言处理(2)——获得文本语料库和词汇资源
  11. prometheus 阿里云短信告警
  12. ChatGPT专业应用:自动生成长尾关键词
  13. Android课程设计:基于离线地图服务器的Android地图应用
  14. 论文评审最大流_关于硕士学位论文评审中出现的问题及其处理
  15. Rtools 环境变量设置-windows
  16. 大数据有哪些培训机构?
  17. 《程序员》约稿:多任务下的时间管理,目标计划与任务分解
  18. 我的世界服务器圈地系统,我的世界领地指令大全 圈地方法分享
  19. Android实现 制作隐藏图片效果 (幻影坦克)
  20. LT1381CS#TRPBF RS232双驱动器/接收器 低功耗5V

热门文章

  1. PsExec:一个非常实用的【远程运行】工具
  2. 使用SCCM Toolkit2中的Trace32来查看MDT日志
  3. Windows移动开发(五)——初始XAML
  4. ( 4 )MySQL中的数据类型(字符串类型)
  5. python--递归、二分查找算法
  6. Red Hat Enterprise Linux上配置SQL Server Always On Availability Group
  7. ASP.NET MVC 对于视图引擎的优化
  8. 关于jquery mobile 页面闪烁与抖动问题
  9. ARPG游戏打击感相关的技术简单总结
  10. debian软raid