的存储结构 第四章串 用堆结构存储串值 特点:每个串的串值各存储在一组地址连续 的存储单元中,但它们的存储地址是在程序执 行过程中动态分配而得 typedef struct i char *ch int length i FAsting i 一使用时必须分配( malloc)和回收fee内 存 第16页
第四章 串 第16页 特点:每个串的串值各存储在一组地址连续 的存储单元中,但它们的存储地址是在程序执 行过程中动态分配而得。 typedef struct{ char *ch; int length; }HString; 使用时必须分配(malloc)和回收(free)内 存。 ⚫ 串的堆存储结构 用堆结构存储串值
O的存储结构 第四章串 一定义 length ch HString s1 s121 HString s2 起 s215 起始地址 地址 Heap .A STRING OF LENGTH 21F free DATA STRUCTURES Free是指尚 未分配内存 地址 串的动态分配存储结构示意图 第17页
第四章 串 第17页 21 15 ··· A STRING OF LENGTH 21F ··· DATA STRUCTURES ··· Heap s1 串的动态分配存储结构示意图 起 始 地 址 起 始 地 址 free length ch Free是指尚 未分配内存 地址 ⚫ 串的堆存储结构 s2 定义 HString s1 HString s2
的存储结构 第四章串 1、赋值操作 Assign(s,t) Status Assign( HString &t char *s) //将s串的值赋给t串 if(s ch ) free(t ch for(i=0,c=s;c;立++,c++);//求s的长度 if(!i )t ch NULLit length =0; J else i if(!( t ch=(char*) malloc(i*sizeof(char)))) return OVERFLOW t.ch[0..i-1]=s[0..i-1]; t length = i return OK 算法4.9 第18页
第四章 串 第18页 1、赋值操作Assign(s,t) Status Assign( HString &t; char *s ) { //将s串的值赋给t串 if( s.ch ) free( t.ch ); for( i=0, c=s; c; i++, c++ ); //求s的长度 if( !i ){ t.ch = NULL; t.length = 0;} else{ if(!(t.ch=(char*)malloc(i*sizeof(char)))) return OVERFLOW; t.ch[0..i-1] = s[0..i-1]; t.length = i; } return OK; } 算 法 4.9 ⚫ 串的堆存储结构
的存储结构 第四章串 2、联接运算 Concat Status Concat( HString &t, HString sl, HString s2 /连接s1,s2到t中 f(t.ch)free(t,ch);//释放原空间 if(!(t ch=(char*) malloc(sl length+s2. length)*sizeof(char)))) return OVERFLOW;//分配空间 t ch[0. s1 length-1]= s1. ch[0. s1 length-1];//csl t,1 ength=s1.1 ength+s2,1 ength;//长度 -t ch[s1 length. t length-1]= s2. ch [0.. s2 length-11;//s2 第19页
第四章 串 第19页 2、联接运算Concat Status Concat( HString &t, HString s1, HString s2 ) { //连接s1, s2到t中 if( t.ch ) free( t.ch ); //释放原空间 if(!(t.ch=(char*)malloc(s1.length+s2.length)*sizeof(char)))) return OVERFLOW; //分配空间 t.ch[0..s1.length-1] = s1.ch[0..s1.length-1]; //处理s1 t.length = s1.length + s2.length; //长度 t.ch[s1.length..t.length-1] = s2.ch[0..s2.length-1]; //s2 } ⚫ 串的堆存储结构
0生的存储结构 第四章串 3、求子串函数 Substr Status SubStr( HString &sub HString s, int pos, int len //从s的pos位置取1en长的子串,由sub返回一 f(pos<lllpos>s length I llen<o l len>s. length-pos+1) return ERROR;//非法 if(sub.ch)free(sub.ch);//释放原有空间 豆f(!1en)tub.ch=NUL;sub.1 ength=0}//空串 else i sub.ch=(char*)ma11oc(1en* sizeof(chax));//分配空间 sub.ch[o..Len-1]=s[pos-1.pos+len-2];//取子串 sub. length len; return OK; 第20页
第四章 串 第20页 3、求子串函数Substr Status SubStr( HString &sub, HString s, int pos, int len ) { //从s的pos位置取len长的子串,由sub返回 if(pos<1||pos>s.length||len<0||len>s.length-pos+1) return ERROR; //非法 if( sub.ch ) free( sub.ch ); //释放原有空间 if( !len ){ sub.ch = NULL; sub.length = 0 } //空串 else{ sub.ch = (char*)malloc(len*sizeof(char)); //分配空间 sub.ch[0..len-1] = s[pos-1..pos+len-2]; //取子串 sub.length = len; } return OK; } ⚫ 串的堆存储结构