2016年7月26日09:32:33
字符串的插入:将T所指向的字符串插入到S所指向的字符串中,插入成功返回1,插入失败返回0;
首先明确:pos的合法位置是子串中间的一个位置,不包含在字符串的末尾插入,因此pos的合法范围
是1<=pos<=length;
分三种情形:(1)S->length+T->length<=MAXSIZE:此时T所指向的字符串可以完全插入S锁指向的字符串中,
(2)S->length+T->length>MAXSIZE:此时T所指向的字符串可以完全插入到S所指向的字符串中,
但是,由于保存字符串的空间不够用,会使得所指向的字符串有一部分被舍弃;
(3)S->length+T->length>MAXSIZE:此时T所指向的字符串不可以完全插入到S所指向的字符串中,
这时会使得S所指向的和T所指向的字符串都会有部分的舍弃;
字符串的删除:将S所指向的字符串中第i个位置起,长度为len的字符全部删除
//串的顺序存贮结构类型表示
typedef struct String
{
char str[MAXSIZE];
int length;
}SeqString;
//函数前置声明
void strCopy(SeqString * S,SeqString * T);//字符串的复制
void setStr(SeqString * S);//给字符串赋值
void traverseString(SeqString * S);//将字符串遍历输出
int isEmpty(SeqString * S);//判断字符串是否为空
int strCompare(SeqString * S,SeqString * T);//比较两个字符串的大小
int getLength(SeqString * S);//获取字符串的长度
int strInsert(SeqString * S,int pos,SeqString * T);//字符串的插入
int strDelete(SeqString * S,int pos,int len);//字符串的删除
int srtAppend(SeqString * S,SeqString * T);//字符串的连接
//字符串的复制;将一个字符串的所有字符复制到另一个字符串中
void strCopy(SeqString * S,SeqString * T)
{
int i;
for( i = 0;i<T->length;i++)
{
S->str[i] = T->str[i];
}
S->length = T->length;
return ;
}
//将字符串遍历输出
void traverseString(SeqString * S)
{
int i;
for ( i = 0;i<S->length;i++)
{
printf("%c",S->str[i]);
}
printf("\n");
}
//获取字符串的长度
int getLength(SeqString * S)
{
return S->length;
}
//给字符串赋值
void setStr(SeqString * S)
{
char ch;
int i = 0;
printf("请输入一个字符串:");
while('\n' != (ch = getchar()) )
{
S->str[i] = ch;
i++;
}
S->length = i;
return ;
}
//判断字符串是否为空
int isEmpty(SeqString * S)
{
if(0 == S->length)
return 1;
else
return 0;
}
//比较两个字符串的大小,如果S所指向的字符串大,返回正数,相等返回0,否则返回负数
int strCompare(SeqString * S,SeqString * T)
{
int i;
for( i = 0;i<S->length&&i<T->length;i++)
{
if(S->str[i] != T->str[i])
return S->str[i]-T->str[i];
}
return S->length-T->length;
}
//字符串的插入,插入成功返回1,插入失败返回零
int strInsert(SeqString * S,int pos,SeqString * T)
{
int i;
if(pos<1||pos>S->length)
{
printf("插入位置不合适!\n");
return 0;
}
else if(S->length+T->length<=MAXSIZE)
{
//将pos以及以后的所有元素向后移动T->length个位置
for(i = S->length-1;i>=pos-1;i--)
{
S->str[i+T->length] = S->str[i];
}
//将T所指向的字符串插入到S所指向字符串所"空"出来的位置
for(i = 0;i<T->length;i++)
{
/*
S->str[pos-1+0] = T->str[0];
S->str[pos-1+1] = T->str[1];
S->str[pos-1+2] = T->str[2];
*/
S->str[pos-1+i] = T->str[i];
}
S->length = S->length + T->length;
return 1;
}
else if(pos-1+T->length<=MAXSIZE)
{
//将pos以及以后的所有元素向后移动T->length个位置
for(i = MAXSIZE-1;i>=pos-1+T->length;i--)
{
S->str[i] = S->str[i-T->length];
}
//将T所指向的字符串插入到S所指向字符串所"空"出来的位置
for(i = 0;i<T->length;i++)
{
/*
S->str[pos-1+0] = T->str[0];
S->str[pos-1+1] = T->str[1];
S->str[pos-1+2] = T->str[2];
*/
S->str[pos-1+i] = T->str[i];
}
S->length = MAXSIZE;
return 1;
}
else
{
//出现这种情况是:凡是插入点以后的所有元素全部舍弃
for( i = 0;i<MAXSIZE-pos;i++)
{
S->str[pos-1+i] = T->str[i];
}
S->length = MAXSIZE;
return 1;
}
}
//字符串的删除,删除成功返回1,删除失败返回0
int strDelete(SeqString * S,int pos,int len)
{
int i;
//判断删除的参数是否合法
if(pos<1||len<0||pos>S->length-len+1)
{
printf("参数不合法!\n");
return 0;
}
//将后面的元素向前移动
for(i = pos-1;i<pos-1+len;i++)
{
/*
S->str[pos-1] = S->str[pos-1+len]
S->str[pos] = S->str[pos-1+len+1]
*/
S->str[i] = S->str[i+len];
}
S->length = S->length-len;
/*
S->str[pos-1] = S->str[pos-1+len];
S->str[pos] = S->str[pos+len];
for(i = pos-1+len;i<S->length-1;i++)
{
S->str[i-len] = S->str[i];
}
*/
return 1;
}
//字符串的连接
int srtAppend(SeqString * S,SeqString * T)
{
int i;
if(S->length == MAXSIZE)
{
printf("空间不足不能进行连接!\n");
return -1;
}
if(S->length+T->length<= MAXSIZE)
{
for(i = S->length;i<S->length+T->length;i++)
{
/*
S->str[S->length] = T->str[0];
S->str[S->length+1] = T->str[1];
*/
S->str[i] = T->str[i-S->length];
}
S->length = S->length+T->length;
return 1;
}
else if(S->length+T->length>MAXSIZE)
{
for(i = S->length;i<MAXSIZE;i++)
{
/*
S->str[S->length] = T->str[0];
S->str[S->length+1] = T->str[1];
*/
S->str[i] = T->str[i-S->length];
}
S->length = MAXSIZE;
return 0;
}
}
//主函数
int main(void)
{
//字符串的赋值操作
SeqString str1;
SeqString str2;
setStr(&str1);
printf("字符串str1的值为:");
traverseString(&str1);
setStr(&str2);
printf("字符串str2的值为:");
traverseString(&str2);
//字符串的比较操作
//printf("str1与str2比较的结果是:%d\n",strCompare(&str1,&str2));
//字符串的复制操作
/*printf("将str2复制到str1后结果为:\n");
strCopy(&str1,&str2);
traverseString(&str1);
traverseString(&str2);
*/
//字符串的插入操作
/*if( strInsert(&str1,5,&str2) )
{
printf("插入成功!\n");
printf("插入后str1的内容为:");
traverseString(&str1);
}
else
{
printf("插入失败!\n");
}*/
//字符串的删除
if( strDelete(&str1,5,2) )
{
printf("删除成功!\n");
printf("删除后str1的内容为:");
traverseString(&str1);
}
else
{
printf("删除失败!\n");
}
return 0;
}