动态字符串的存储结构的实现

/**
*毕竟这只是简单的串的链式存储结构,不过不同的对象操作不一样

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

*纯属于个人的理解和分析的结果
*/

效果:

代码:
/**
*链式的串存储结构的实现
*
*/
#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;
}

动态字符串的存储结构的实现,布布扣,bubuko.com

时间: 2024-10-13 08:17:11

动态字符串的存储结构的实现的相关文章

静态串的存储结构以及增删改查

/** *数据结构串的操作,有增删改查 *串的初始化以及串的赋值等操作必须注意,在新学的时候必须注意值得传递,指针的指向以及初始化的结果 */ //操作效果图: 代码: //串的静态存储结构/**静态数组存储结构typedef struct{ char str[MaxSize]; int length;}String;*/ /**动态的数组存储结构typedef struct{ char *str; //表示动态数组的名 int MaxLength;//表示动态数组元素的最大个数int leng

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

?注:未经博主同意,不得转载. 两者特点: 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 它的优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开销. (3)顺序表具有按元素序号随机访问的特点. 缺点: (1)在顺序表中做插入.删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低. (2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢

线性表的顺序存储结构和链式存储结构

前言 上一篇<栈>中提到了栈的顺序存储结构和链式存储结构,现在就对此做个简单的比较.因为栈是线性表的一种,顺序存储结构和链式存储结构实际是线性表的两种存储方式.而栈和队列都是两种重要的线性表结构.所以本文标题直接为线性表的顺序存储结构和链式存储结构. 开始比较两种不同的存储方式 一.顺序存储结构(也可称为顺序表) 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑

线性表的顺序存储结构和链式存储结构的比较

一:顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 它的优点是: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开销. (3)顺序表具有按元素序号随机访问的特点. 缺点: (1)在顺序表中做插入.删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低. (2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢出. 二.在链表中逻辑上相邻的数据元素

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

一:顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 它的优点是: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开销. (3)顺序表具有按元素序号随机访问的特点. 缺点: (1)在顺序表中做插入.删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低. (2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢出. 二.在链表中逻辑上相邻的数据元素

字符串和字符串的常见存储结构

继续接去年的常见数据结构和算法总结 系列随笔记录 一.计算机里进行非数值处理的对象基本上是字符串数据,比处理浮点和整数都要复杂 string串定义:由 0 个或多个 字符 组成的 有限的 序列,通常记为:s =“a1 a2 a3 … ai …an”  ( n≥0 ,且n是有限的).其中的引号不属于串,只是一个标记作用! n就是串的长度,且字符串里的字符 ai 的值由 字母.数字或其他字符 组成的. 二.字符串为什么要用双引号标记 作用:避免字符串与变量名或数的常量混淆. char *str =

Redis 数据类型分析 字符串 哈希 列表 集合 有序集合 优缺点 分析 注意事项 存储结构

一.提高Redis使用性能秘诀 KEY尽量少的原则,能放在1个KEY的就放入1个KEY,KEY开销很大尽量减少与Redis发生的交互次数,能批量的就批量,能事务.管道的就事务.管道从业务架构分析确定使用哪种数据类型,从全局出发,如果类型选错了再改变就很不容易使用每一个Redis命令注意是O(1),还是O(N),切记滥用,认准每个命令的特性再使用也不迟使用PHP Redis的C语言扩展,性能远远高于PHP脚本编写的文件时刻清醒你往Redis里存储了什么,频繁交互.相对静态的小数据存储至Redis是

SQL SERVER大话存储结构(5)

阅读目录(Content) 1 基本介绍 2 对数据库启动的影响 3 日志文件添加方式 4 物理结构 5 延迟日志截断原因 6 管理事务日志 本系列上一篇博文链接:SQL SERVER大话存储结构(4)_复合索引与包含索引 回到顶部(go to top) 1 基本介绍 每个数据库都具有事务日志,用于记录所有事物以及每个事物对数据库所作的操作. 日志的记录形式需要根据数据库的恢复模式来确定,数据库恢复模式有三种: 完整模式,完全记录事物日志,需要定期进行日志备份. 大容量日志模式,适用于批量操作的

SQL SERVER大话存储结构(3)

阅读目录(Content) 1 引入 2 数据行 2.1 数据行结构 2.2 特殊情况(大对象.行溢出及forword) 2.2.1 大对象 2.2.2 行溢出 2.2.3 forword 3 测试存储情况 3.1 堆表分析 3.2 添加主键 3.3 增加一列:可空变长列 3.4 增加一列:非空变长列+默认值 3.4.1 非大对象列 3.5 删除无数据的列 3.6 删除有数据的列 3.7 行溢出 3.8 Forword 4 行结构与DDL 一行数据是如何来存储的呢? 变长列与定长列,NULL与N