由于堆分配滿足順序存儲結構的特點,存儲方便,操作中對串長沒有任何限制,故常被采用。
串的堆分配存儲表示
typedef struct HString{
char *ch;
int length;
//結構體構造函數
HString(){
ch = new char;
length = 0;
}
}HString;
初始串賦值
Status StrAssign(HString* T,char *chars){
//生成一個值等于串常量chars的串T
/*
if(T->ch)
free(T->ch);//釋放T原有空間
*/
//cout<<"釋放空間"<<endl;
int l;
char* c;
for(l=0,c=chars;*c;++l,++c); //求chars的長度l
//cout<<"獲得串長:"<<l<<endl;
if(l==0){
T->ch=NULL;
T->length=0;
}
else{
for(int i=0;i<=l;i++){
T->ch[i]=chars[i];
}
T->length = l;
}
return OK;
}
獲得串長及串值
int StrLength(HString* T){
return T->length;
}
char* PrintStr(HString* T){
return T->ch;
}
基礎功能操作
#include "comdef.h"
#include "hstring_def.h"
using namespace std;
int main() {
char* str = "This is a HString";
HString* HStr = new HString();
StrAssign(HStr,str);
cout<<StrLength(HStr)<<endl;
cout<<PrintStr(HStr);
return 0;
}
求字串位置 -基礎
//求子串位置
int Index(HString* S,HString *T,int pos) {
//返回子串T在主串S第pos個字符之后的位置
//T非空,1<=pos<=Strlength(S)
int i= pos;
int j=1;
int Slen = StrLength(S);
int Tlen = StrLength(T);
while(i<=Slen&&j<=Tlen) {
if(S->ch[i]==T->ch[j]) {
i++;
j++; //繼而比較后續字符
} else {
i = i-j+2;
j=1;
}
if(j>Tlen) return i-Tlen;
else return 0;
}
}