//严蔚敏《数据结构》
//串的 定长顺序存储 个人感觉实际应用中用的很少,缺点太大了,空间定死了,而且在运行期间空间不能扩大
//自学中,加油
#include<iostream>
using namespace std;
const int MaxStrLen=5;
typedef char SString[MaxStrLen+1];//SString类型的在声明变量的时候 变量其实已经初始化了
void Output_Str(SString S)
{
cout<<"串:\n";
for(int i=1;i<=S[0];i++)
cout<<S[i];
cout<<endl<<"----\n";
}
bool Assign_Str(SString& S,char ch[],int m)//复制ch字符数组到串S中,复制成功,返回true,否则返回false
{
if(m>MaxStrLen){
cout<<"长度超过,被截断\n";
for(int i=1;i<=MaxStrLen+1;i++){
S[i]=ch[i-1];
}
S[0]=MaxStrLen;
}
else{
for(int i=1;i<=m;i++){
S[i]=ch[i-1];
}
S[0]=m;
}
return true;
}
bool Copy_Str(SString& T,SString S)//复制串S到串T中,复制成功,返回true,否则返回false
{
//因为T、S都是SString类型的,有相同的最大空间,S的长度不会超过MaxSTrLen
for(int i=0;i<=S[0];i++){
T[i]=S[i];
}
return true;
}
bool IsEmpty_Str(SString S)//若串S为空,返回true,否则返回false
{
if(!S[0])
return true;
return false;
}
int Compare_Str(SString S,SString T)//返回值>0:S>T;返回值==0:S==T;返回值<0:S<T
{
int i=1;
while(i<=S[0]&&i<=T[0]&&S[i]==T[i]){//找到第一个串S、串T的不同后停止循环
i++;
}
if(i<=S[0]&&i>T[0])
return 1;
if(i>S[0]&&i<=T[0])
return -1;
if(i>S[0]&&i>T[0])
return 0;
if(S[i]!=T[i]){
if(S[i]<T[i])
return -1;
else
return 1;
}
}
int Length_Str(SString S)//返回串s的长度
{
return S[0];
}
bool Clear_Str(SString& S)//清空串S,成功清空返回true
{
S[0]=0;
return true;
}
bool Concat_Str(SString& T,SString S1,SString S2)//T=S1+S2;若长度超过T[0],则超过的部分被截断
{
if(S1[0]+S2[0]<=MaxStrLen){
for(int i=1;i<=S1[0];i++){
T[i]=S1[i];
}
for(int i=S1[0]+1;i<=S1[0]+S2[0];i++){
T[i]=S2[i-S1[0]];
}
T[0]=S1[0]+S2[0];
}
else if(S1[0]<=MaxStrLen){
for(int i=1;i<=S1[0];i++){
T[i]=S1[i];
}
for(int j=S1[0]+1;j<=MaxStrLen;j++){
T[j]=S2[j-S1[0]];
}
T[0]=MaxStrLen;
}
else{
for(int i=1;i<=MaxStrLen;i++){
T[i]=S1[i];
}
T[0]=MaxStrLen;
}
return true;
}
bool Sub_Str(SString& Sub,SString S,int pos,int len)//Sub[1...len]=S[pos...pos+len-1]
//1<=pos<=S[0]; 0<=len<=S[0]-pos+1
{
if(pos<1||pos>S[0]){
cout<<"pos值 不合理\n";
return false;
}
if(len<0||len>S[0]-pos+1){
cout<<"len值 不合理\n";
return false;
}
for(int i=1;i<=len;i++){
Sub[i]=S[pos+i-1];
}
Sub[0]=len;
return true;
}
int Index_Str(SString S,SString T,int pos)//检索主串S中从pos位置后是否有串T,若有,返回第一次的位置,若无,返回0
{//1<=pos<=S[0]
if(pos<1||pos>S[0]){
cout<<"pos值不合理\n";
return -1;
}
int lenS=S[0],lenT=T[0];
SString Sub;
for(int i=pos;i<=S[0];i++){
Sub_Str(Sub,S,i,T[0]);
if(Compare_Str(Sub,T)==0){
return i;
}
}
return 0;
}
bool Replace_Str(SString& S,SString T,SString V)//用串V替换主串S中的串T
{
int lenV=V[0],lenS=S[0];
SString Sub;
for(int i=1;i<=lenS-lenV+1;i++){
Sub_Str(Sub,S,i,lenV);
if(Compare_Str(Sub,T)==0){
for(int j=i;j<=lenV+i-1;j++){
S[j]=V[j-i+1];
}
}
}
return true;
}
bool Insert_Str(SString& S,int pos,SString T)//插入串T到主串S的pos位置前
{//1<=pos<=S[0]+1
if(pos<1||pos>S[0]+1)
return false;
if(T[0]+S[0]>MaxStrLen){
cout<<"空间不够,插入失败\n";
return false;
}
else{
for(int i=S[0];i>=pos;i--){
S[i+T[0]]=S[i];
}
for(int j=pos;j<=T[0]+pos-1;j++){
S[j]=T[j-pos+1];
}
S[0]+=T[0];
}
return true;
}
bool Delete_Str(SString& S,int pos,int len)//删除主串从pos位置后的len个元素
{
for(int i=len+pos;i<=S[0];i++){
S[i-len]=S[i];
}
S[0]-=len;
return true;
}
bool Destroy_Str(SString& S)//破坏串S
{
//不存在静态数组的销毁吧?网上查的也是静态数组不能销毁
}
int main()
{
//读者可以根据需要自行测试,我写的测试比较多,而且太乱了
}