数据结构(严蔚敏)4.2堆分配串
作者:互联网
学习记录,仅供参考,希望可以指出错误
#include<stdio.h> #include<stdlib.h> #include<string> typedef struct{ char *ch; int length; }HString; //下表是从0开始的,不是像定长一样从1 //typedef char Status; //StrAssign(&T,chars)创建串T //StrCopy(&T,S)拷贝 //StrEmpty(S)判空 //StrCompare(S,T) S>T返回值>0 //Strlen(S) //ClearString(&S) //Concat(&T,S1,S2)T由S1和S2连接 //SubString(&Sub,S,pos,len)用Sub返回串S的第pos个字符起长度为len的字串 //Index(S,T,pos)若S中存在和T值相同的字串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则函数值为0 //Replace(&S,T,V)用V替换主串S中出现的所有与T相等的不重叠的子串 //StrInsert(&S,pos,T)在串S的第pos个字符后插入T //StrDelete(&S,pos,len)删除第pos个字符起长度为len的子串 //DestoryString(&S) int print(HString t){ if(t.length==0) printf("长度为0\n"); else for(int i=0;i<t.length;i++) printf("%c",t.ch[i]); return 0; } int Strlen(HString s){ return s.length; } int StrAssign(HString &t,char *chars){ if(Strlen(t)>0) free(t.ch); if(Strlen(t)==0) t.ch=NULL; else{ t.length=strlen(chars); if(!(t.ch=(char*)malloc(t.length*sizeof(char))))return 1; for(int i=0;i<Strlen(t);i++){ for(int i=0;i<Strlen(t);i++) t.ch[i]=chars[i]; } } return 0; } int StrCopy(HString &t,HString s){ if(Strlen(t)>0) free(t.ch); t.length=Strlen(s); t.ch=(char*)malloc(Strlen(t)*sizeof(char)); if(!t.ch)return 1; for(int i=0;i<Strlen(t);i++){ t.ch[i]=s.ch[i]; } return 0; } int StrEmpty(HString t){ if(t.length==0)return 1; else return 0; } int StrCompare(HString s,HString t){ if(Strlen(s)>Strlen(t))return 1; else if(Strlen(s)<Strlen(t))return -1; for(int i=0;i<Strlen(s);i++){ if(s.ch[i]>t.ch[i]) return 1; else if(s.ch[i]<t.ch[i])return -1; } return 0; } int ClearString(HString &t){ if(t.length==0)return 1; if(t.length>0){ free(t.ch); t.length=0; t.ch=NULL; return 1; } return 0; } int StrInsert(HString &s,int pos,HString t){ //----------省略对参数判断--判断pos是否合理 int slen=Strlen(s),tlen=Strlen(t); if(!(s.ch=(char *)realloc(s.ch,(slen+tlen) * sizeof(char)))) return 1; for(int i=tlen+slen,j=slen;i>pos;j--,i--){//后撤步777 s.ch[i]=s.ch[j]; } for(int j=0;j<tlen;j++){ s.ch[pos+j]=t.ch[j]; } s.length=slen+tlen; return 1; } int StrDelete(HString &t,int pos,int len){ //----------省略对参数判断 int tlen=Strlen(t); for(int i=0;i<tlen-len-pos;i++){//slen-pos-len是要移动的次数 t.ch[pos+i]=t.ch[pos+len+i]; } if(!(t.ch=(char *)realloc(t.ch,(tlen-len) * sizeof(char)))) return 1; t.length=t.length-len; return 1; } int DestoryString(HString &t){//不会写 free(t.ch); t.length=0; return 1; } void Concat(HString &T,HString S1,HString S2){ //----------省略对参数判断--判断S1和S2是否合理 StrCopy(T,S1); StrInsert(T,Strlen(T),S2); } int SubString(HString &Sub,HString S,int pos,int len){ //----------省略对参数判断--判断pos是否合理,<pos+len是否超过长度等 if(!(Sub.ch=(char*)malloc(len*sizeof(char))))return 0; for(int i=0;i<len;i++) Sub.ch[i]=S.ch[pos+i]; Sub.length=len; return 1; } int Index(HString S,HString T,int pos){//若S中存在和T值相同的字串,则返回它在主串S中第pos个字符之后第一次出现的位置,否则函数值为0 //----------省略对参数判断--pos是否合理 for(;pos<=Strlen(S)-Strlen(T);pos++){ int j=0; for(int k=pos;j<Strlen(T);j++,k++){ if(S.ch[k]!=T.ch[j]){ break; } } if(j==Strlen(T)) return pos; } return -1; } void Replace(HString &S,HString T,HString V){//用V替换主串S中出现的所有与T相等的不重叠的子串 //----------省略对参数判断--比较STV的长度 int pos=0; while(true){ pos=Index(S,T,pos); if(pos!=-1){ StrDelete(S,pos,Strlen(T)); StrInsert(S,pos,V); pos=pos+1; }else break; } } void main(){ HString t1; char *chars="abcde"; printf("\n\n测试 StrAssign----------------------------------------\n\n"); StrAssign(t1,chars); print(t1); printf("\n\n测试 StrCopy----------------------------------------\n\n"); HString t2; StrCopy(t2,t1); print(t1);printf("\n"); print(t2);printf("\n"); printf("\n\n测试 ClearString StrEmpty----------------------------------------\n\n"); ClearString(t2); if(StrEmpty(t2)) printf("t2空了\n");; printf("\n"); printf("\n\n测试 StrCompare StrInsert_1----------------------------------------\n\n"); print(t1);printf("\n"); StrCopy(t2,t1); print(t2);printf("\n"); HString t3; char *chars2="123"; StrAssign(t3,chars2); StrInsert(t3,1,t2); print(t3); printf("\ncompare:%d\n\n",StrCompare(t1,t3)); printf("\n\n测试 StrDelete_3_3----------------------------------------\n\n"); StrDelete(t3,3,3); print(t3); printf("\n\n测试 StrInsert t1 t3---------------------------------------\n\n"); printf("t1:");print(t1);printf("\n"); printf("t3:");print(t3);printf("\n"); HString t4; Concat(t4,t1,t3); printf("t1+t3---len:%d t4:",Strlen(t4));print(t4);printf("\n"); printf("\n\n测试 SubString---------------------------------------\n\n"); HString t5; SubString(t5,t4,2,4); printf("t5:");print(t5);printf("\n"); printf("\n\n测试 Index--------------------------------------\n\n"); HString t6;char *chars3="ab"; StrAssign(t6,chars3); printf("Index(t4,t6,1): %d",Index(t4,t6,1)); printf("\n\n测试 Replace--------------------------------------\n\n"); printf("t4:");print(t4);printf("\n"); printf("t6:");print(t6);printf("\n"); printf("t2:");print(t2);printf("\n"); Replace(t4,t6,t2); printf("Replace 把t4中的t6换成t2 t4: ");print(t4);printf("\n"); printf("\n"); }
标签:ch,return,4.2,int,pos,char,严蔚敏,数据结构,Strlen 来源: https://www.cnblogs.com/liuyueshu/p/15132224.html