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

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

效果:

 

代码:
/**
*链式的串存储结构的实现 
*
*/

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

 


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值