#include<stdio.h>
#include<stdlib.h>
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct{
char* ch;
int length;
}HString;
Status StrAssign(HString &T,char *chars){
//生成一个其值等于串常量chars的串T
if(T.ch) free(T.ch);
int i;
char* p;
for(i=0,p=chars;*p!='\0';i++,p++);//求串常量的长度
if(i==0){//串常量长度为0
T.ch = NULL;
T.length=i;
}
else{
T.ch=(char*)malloc(i*sizeof(char));
int j;
for(j=0;j<i;j++){
T.ch[j]=chars[j];
}
T.ch[j]='\0';
T.length=i;
}
return OK;
}
int StrLength(HString S){
//返回串S的长度
return S.length;
}
int StrCompare(HString S,HString T){
//如果S>T 返回>0 如果S=T 返回0 如果<T 返回<0
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;
}
Status ClearString(HString &S){
//清空串S为空串
if(S.ch){
free(S.ch);S.ch=NULL;
}
S.length=0;
return OK;
}
Status Concat(HString &T,HString S1,HString S2){
//用串T返回S1和S2拼接后的字符串
if(T.ch) free(T.ch);
T.ch =(char*)malloc((S1.length+S2.length)*sizeof(char));
int i=0;
for(int j=0;j<S1.length;i++,j++)
T.ch[i]=S1.ch[j];
for(int j=0;j<S2.length;i++,j++)
T.ch[i]=S2.ch[j];
return OK;
}
Status SubString(HString &sub,HString S,int i,int len){
//用串sub返回串S从第i个字符起,长度为len的子字符串;
// 1<=i<=S.length
if(i<1||i>S.length||len<0||len>S.length-i+1) return ERROR;
// if(sub.ch) free(sub.ch);
if(len==0){
sub.ch=NULL;
sub.length=0;
return OK;
}
sub.ch = (char*)malloc(len*sizeof(char));
for(int j=0;j<len;i++,j++)
sub.ch[j]=S.ch[i-1];
sub.length=len;
return OK;
}
int Index(HString S,HString T,int pos){
//从串S中的第pos个字符起,找到第一个与串T相同的子串,并返回子串的位置
//如果没找到,返回0
if(pos<1||pos>S.length||T.length==0) return 0;
else{
HString sub;
while(SubString(sub,S,pos,T.length)){
if(StrCompare(sub,T)==0) return pos;
else pos++;
}
return 0;
}
}
Status StrInsert(HString &S,int pos,HString T){
// 在串S中的第pos个字符之前插入串T
// 1<pos<=S.length
if(pos<1||pos>S.length+1) return ERROR;
if(T.length){ //如果T不是空字符串
S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char));//重新为S分配空间
for(int i=S.length-1;i>=pos-1;i--){//为插入T而腾出位置
S.ch[i+T.length]=S.ch[i];
}
for(int i=pos-1,j=0;i<pos+T.length-1;i++,j++){ //插入T
S.ch[i]=T.ch[j];
}
S.length+=T.length;
}
return OK;
}
void printString(HString S){
//打印字符串
printf("\n");
for(int i=0;i<S.length;i++){
printf("%c",S.ch[i]);
}
printf("\n");
}
int main(){
//测试
HString s;
char sayHi[100];
scanf("%s",sayHi);
StrAssign(s,sayHi);
printf("s:");
printString(s);
HString s1,s2;
SubString(s1,s,1,4);
SubString(s2,s,3,2);
printf("s1:");
printString(s1);
printf("s2:");
printString(s2);
//其他函数自行测试
}
【数据结构】串的堆分配实现
最新推荐文章于 2023-04-29 16:31:54 发布