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

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

效果:

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