堆分配存储结构串的实现方法是,提供一个足够大的存储空间。作为串的可利用空间,用来存储各串的串值。
每当建立一个新的串时,系统就从这个空间划分出一个大小和新串相同的空间给新串
若分配成功则返回一个指向起始地址的指针
为操作方便每个串的长度也作为一个存储结构的一部分
用动态分配函数库中的malloc和free来管理存储空间
C++中有new 和delete可以管理空间
#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include<string>
#include <cstdlib>
using namespace std;
#define STRMAXSIZE 256
#define OK 1;
#define ERROR 0;
typedef struct{
char *ch;
int length;
}SString;
typedef int Status;
//模拟一编从新开始
//用maloc和free 动态分配空间
Status IinitStr(SString &T)//初始化
{
T.ch = NULL;
T.length = 0;
return 0;
}
Status Assign(SString &T, char *chars)//将chars的内容赋予T
{
int len = strlen(chars);//
if (T.ch)
{
free(T.ch);
}
if (!len)
{
T.ch = NULL;
T.length = 0;
return 1;
}
else
{
T.ch = (char *)malloc(len * sizeof(char));//因为是动态分配所以要分配空间
for (int j = 0; j < len; j++)
{
T.ch[j] = chars[j];
}
T.length = len;
return 0;
}
return 0;
}
Status CopyStr(SString T, SString &S)//将S的内容赋予T 找出使用和不使用&的区别
{
S.ch = (char *)malloc(T.length * sizeof(char));//使得二者长度一致
for (int i = 0; i < T.length; i++)
{
S.ch[i] = T.ch[i];
}
S.length = T.length;
return 0;
}
Status Strprint(SString T)//打印出串
{
int i;
for (i = 0; i < T.length; i++)
cout << T.ch[i];
printf("\n");
return OK;
}
Status ComparStr(SString T, SString S)//判断二者是否相等,首先判断长度,再判断内容
{
int i,j;
j = 0;
if(T.length==S.length)
for (i = 0; i < T.length; i++)
{
if (T.ch[i] == S.ch[i])
j++;
else
break;
}
if (j == T.length)
cout << "相等" << endl;
else
cout << "不相等" << endl;
return 0;
}
//将二者按顺序串联成一个新串 在定义变量时,如果不对其初始化,则此变量包含一个垃圾值,即上次使用这块内存空间时遗留在此的值。
Status ConcatStr(SString &T, SString S, SString S1)//
{
int i;
//分配的空间为其总和
if (T.ch)
{
free(T.ch);
//return 0;
}
//分配空间
T.ch = ((char*)malloc((S.length+S1.length)*sizeof(char)));
if (!T.ch)
{
return 0;
//return 0;
}
for (i = 0; i < S.length; i++)
T.ch[i] = S.ch[i];
for (int j = 0; j < S1.length; j++)
T.ch[S.length + j] = S1.ch[j];
T.length = S.length + S1.length;
return 0;
}
//删除字符串中pos位置固定长度len的子串
Status DetelStr(SString T,int pos, int len)
{
int i;
int changdu=T.length;
if (changdu < len&&!T.ch[pos+len-1])//因为包括原本位置
{
return 0;
}
else
{
/*for (i = pos-1; i <= pos + len - 1; i++)
{
T.ch[i] = '\0';//这样只是替换成空格 我要的是前移
}*/
for (int j = 0; j <= changdu; j++)
{
T.ch[pos - 1 + j] = T.ch[pos + len + j];
}
for (int k = changdu - len + 1; k < changdu; k++)
{
T.ch[k] = '\0';
}
}
return 0;
}
//在某位置插入一个元素 原元素后移或前移 类似
//将某串中的子串换成另外一个子串,若不存在某子串则返回找不到该元素类似
Status main()
{
int i, k;
char C[STRMAXSIZE];
char C1[STRMAXSIZE];
SString S,S1;
IinitStr(S);//初始化
IinitStr(S1);
cout << "请输入字符串" << endl;
cin >> C >> C1;
cout << "将字符串赋予新串!" << endl;
Assign(S, C);//char 赋予值
Assign(S1, C1);
printf("新串生成成功!输出:\n");
Strprint(S);//打印
Strprint(S1);//打印
cout << "两个串比较" << endl;
ComparStr(S, S1);//相比较
cout << "将二者串联成一个新串" << endl;
SString SS;
IinitStr(SS);//定义了一个变量一定要给他赋值或初始化
ConcatStr(SS,S,S1);
Strprint(SS);
cout << "删去一段位置" << endl;
DetelStr(S, 2, 4);
Strprint(S);
return 0;
}
在编码的时候,在串连接那,定义了一个新串,但是没有对其初始化,所以运行不成功
所以切记初始化的重要性!!!
初始化.