【数据结构】串的堆分配实现

#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);
    //其他函数自行测试
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值