串的删除和插入运行结果有问题,求解释!!!
难道就没有人会了么?程序我改了,代码如下://-----串的堆分配存储表示------#include<stdio.h>
#include<stdlib.h>
#include <malloc.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define INFEASIBLE -1
typedef struct
{
char *ch; //若是非空串,则桉串长分配存储区,否则ch为NULL
int length; //串长度
}HString;
//--------基本操作--------
//-----初始化-------
void InitString(HString *S)
{
S->ch=NULL;
S->length=0;
}
//----生成一个其值等于串常量chars的串T--------
void StrAssign(HString *T,char *chars)
{
if(T->ch)
free(T->ch);
int len=0;
while(chars[len])
{
++len;
}
if(0==len)
{
T->ch=NULL;
T->length=0;
}
else
{
T->ch=(char *)malloc(sizeof(char)*len);
if(NULL==T->ch)
{
printf("Out of space!\n");
exit(OVERFLOW);
}
else
{
for(int i=0;i!=len;++i)
{
T->ch[i]=chars[i];
}
T->length=len;
}
}
}
//---返回S的元素个数,即为串的长度------
int StrLength(HString S)
{
return S.length;
}
//----两个串的比较------
int StrCompare(HString S,HString T)
{
for(int i=0;(i!=S.length)&&(i!=T.length);++i)
{
if(S.ch[i]!=T.ch[i])
return (S.ch[i]-T.ch[i]);
}
return (S.length-T.length);
}
//-----将S清为空串------
void ClearString(HString *S)
{
if(S->ch)
{
free(S->ch);
S->ch=NULL;
S->length=0;
}
}
//-------将两个串联接成一个新串---------
void Concat(HString *T,HString S1,HString S2)
{
ClearString(T); //释放旧空间
T->ch=(char *)malloc((S1.length+S2.length)*sizeof(char));
if(NULL==T->ch)
{
printf("Out of space!!!\n");
exit(OVERFLOW);
}
else
{
for(int i=0;i!=S1.length;++i)
{
T->ch[i]=S1.ch[i];
}
T->length=S1.length+S2.length;
for(int j=S1.length,k=0;j!=T->length,k!=S2.length;++j,++k)
{
T->ch[j]=S2.ch[k];
}
}
}
//------用sub返回串S的第pos个字符长度为len的子串-------
void SubString(HString *Sub,HString S,int pos,int len)
{
if(pos<1||pos>S.length||len<0||len>S.length-pos+1)
{
printf("子串的起始位置或串长错误!\n");
}
ClearString(Sub);
if(0==len)
{
Sub->ch=NULL;
Sub->length=0;
}
else
{
Sub->ch=(char *)malloc(len*sizeof(char));
if(NULL==Sub->ch)
{
printf("Out of space!!\n");
exit(0);
}
int i=0;
int k=0;
for(i=0,k=pos-1;i!=len,k!=pos+len-1;++i,++k)
{
Sub->ch[i]=S.ch[k];
Sub->length=len;
}
}
}
// 在串st1的第pos个字符之前插入串st2
int StrInsert(HString *st1,int pos,HString st2)
{
int i;
if(pos<1||pos>(*st1).length+1) // pos不合法
return ERROR;
if(st2.length) // st2非空,则重新分配空间,插入st2
{
(*st1).ch = (char*)realloc((*st1).ch,
((*st1).length+st2.length)*sizeof(char));
if(!(*st1).ch)
exit(OVERFLOW);
for(i=(*st1).length-1;i>=pos-1;--i) // 为插入st2而腾出位置
(*st1).ch[i+st2.length]=(*st1).ch[i];
for(i=0;i<st2.length;i++)
(*st1).ch[pos-1+i]=st2.ch[i]; // 插入st2
(*st1).length+=st2.length;
}
return OK;
}
// 从串st1中删除第pos个字符起长度为len的子串
int StrDelete(HString *st1,int pos,int len)
{
int i;
if((*st1).length<pos+len-1)
exit(OVERFLOW);
for(i=pos-1;i<=(*st1).length-len;i++)
(*st1).ch[i]=(*st1).ch[i+len];
(*st1).length-=len;
(*st1).ch=(char*)realloc((*st1).ch,(*st1).length*sizeof(char));
return OK;
}
//-----输出串中的字符-----
void PrintString(HString S)
{
if(S.length)
{
for(int i=0;i!=S.length;++i)
printf("%-4c",S.ch[i]);
printf("\n");
}
else
{
printf("empty!\n");
}
}
int main()
{
HString st1;
HString st2;
HString sub;
HString T;
char ch1[20];
printf("输入st1:");
gets(ch1);
InitString(&st1);
StrAssign(&st1,ch1);
PrintString(st1);
printf("串长:%d\n",StrLength(st1));
printf("输入st2:");
gets(ch1);
InitString(&st2);
StrAssign(&st2,ch1);
int state=StrCompare(st1,st2);
if(0==state)
{
printf("st1和st2比较:st1=st2\n");
}
else if(state>0)
{
printf("st1和st2比较:st1>st2\n");
}
else
{
printf("st1和st2比较:st1<st2\n");
}
InitString(&T);
printf("st1连接st2:");
Concat(&T,st1,st2);
PrintString(T);
InitString(&sub);
printf("st1中起始位置为7,长度为1的子串:");
SubString(&sub,st1,7,1);
PrintString(sub);
InitString(&st1);
printf("插入st2后的串st1=");
StrInsert(&st1,3,st2);
PrintString(st1);
InitString(&st1);
printf("删除起始位置为4,长度为3的子串后st1=");
StrDelete(&st1,4,3);
PrintString(st1);
ClearString(&st1);
ClearString(&st2);
ClearString(&sub);
ClearString(&T);
return ERROR;
}
大侠救急啊!!!