存储过程 while is null_4.2 串的存储实现(2)
生活随笔
收集整理的這篇文章主要介紹了
存储过程 while is null_4.2 串的存储实现(2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
返回目錄:
Chilan Yu:《數據結構》目錄鏈接?zhuanlan.zhihu.com4.2.2 堆串
字符串包括串名與串值兩部分,而串值采用堆串存儲方式存儲,串名用符號表存儲。
堆串存儲方式:這種存儲方法以一組地址連續的存儲單元存放串的字符序列,但它們的存儲空間是在程序執行過程中動態分配的。系統將一個地址連續、容量很大的存儲空間作為字符串的可用空間,每當建立一個新串時,系統就從這個空間中分配一個大小和字符串長度相同的空間存儲新串的串值。
串名符號表:所有串名的存儲映像構成一個符號表。借助此結構可以在串名和串值之間建立一個對應關系,稱為串名的存儲映像。
堆串的存儲映象示例: a='a program',b='string ',c='process',free=23(注意:b中string后有一個空格)
堆串定義:
/*堆串的定義*/ typedef struct{char * ch;//位置指針(指示串的起始地址)int len;//串的長度 }HString;1. 堆串賦值函數
/*堆串賦值函數*/ void StrAssign(HString * s,char * tval){//將字符串常量tval的值賦給堆串sint len,i=0;if(s->ch!=NULL) free(s->ch);//如果堆串的起始位置指針有所指,則釋放空間while(tval[i]!='0') ++i;//遍歷一遍字符串常量tval得到其長度len = i;if(len){//如果字符串常量tval長度不為0s->ch = (char *)malloc(len);//開辟空間for(i=0;i<len;++i) s->ch[i] = tval[i];//每個字符一一賦值}else s->ch = NULL;//否則把堆串的起始位置指針指向NULLs->len = len;//修改堆串長度 }2. 堆串插入函數
/*堆串插入函數*/ void StrInsert(HString * s,int pos,HString * t){//在串s中下標為pos的字符之前插入串tint i;char * temp;if(pos<0 || pos>s->len || s->len==0) return ;//插入位置不合法temp = (char *)malloc(s->len+t->len);for(i=0;i<pos;++i) temp[i] = s->ch[i];//先把s中在pos之前的字符復制到temp中for(i=0;i<t->len;++i) temp[i+pos] = t->ch[i];//再把t插入for(i=pos;i<s->len;++i) temp[i+t->len] = s->ch[i];//最后把s中在pos之后的字符復制到temp中s->len += t->len;//更新長度free(s->ch);//釋放原來所指位置s->ch = temp;//把起始位置指針指向新的位置 }3. 堆串刪除函數
/*堆串刪除函數*/ void StrDelete(HString * s,int pos,int len){//在串s中刪除從序號pos起len個字符int i;char * temp;if(pos<0 || pos>(s->len-len)) return ;temp = (char *)malloc(s->len-len);for(i=0;i<pos;++i) temp[i] = s->ch[i];for(i=pos;i<s->len-len;i++) temp[i] = s->ch[i+len];s->len = s->len-len;free(s->ch);s->ch = temp; }4. 堆串復制函數
/*堆串復制函數*/ void StrCopy(HString * s,HString t){//將串t的值復制到串s中int i;s->ch = (char *)malloc(t.len);for(i=0;i<t.len;++i)s->ch[i] = t.ch[i];s->len = t.len; }5. 判空函數
/*判空函數*/ int StrEmpty(HString s){//若串s為空(即串長為0),則返回1,否則返回0if(s.len==0) return 1;else return 0; }6. 堆串比較函數
/*堆串比較函數*/ int StrCompare(HString s,HString t){//若串s和t相等,則返回0,若s>t返回1,若s<t返回-1int i;for(i=0;i<s.len && i<t.len;++i)if(s.ch[i]!=t.ch[i])return(s.ch[i]-t.ch[i]);return(s.len-t.len); }7. 求串長函數
/*求串長函數*/ int StrLength(HString s){//返回串s的長度return s.len; }8. 清空函數
/*清空函數*/ void StrClear(HString * s){//將串s置為空串if(s->ch!=NULL) free(s->ch);s->ch = NULL;s->len = 0; }9. 連接函數
/*連接函數*/ void StrCat(HString * s,HString t){//將串t聯接在串s的后面int i;char * temp;temp = (char *)malloc(s->len+t.len);for(i=0;i<s->len;++i)temp[i] = s->ch[i];for(i=s->len;i<s->len+t.len;++i)temp[i] = t.ch[i-s->len];s->len += t.len;free(s->ch);s->ch = temp; }10. 求子串函數
/*求子串函數*/ void SubString(HString * sub,HString s,int pos,int len){//將串s中序號pos起len個字符復制到sub中int i;if(sub->ch!=NULL) free(sub->ch);if(pos<0 || pos>s.len || len<1 || len>s.len-pos){sub->ch = NULL;sub->len = 0;return;}else{sub->ch = (char *)malloc(len);for(i=0;i<len;++i)sub->ch[i] = s.ch[i+pos];sub->len = len;} }11. 定位函數
/*定位函數*/ int StrIndex(HString s,int pos,HString t){//求串t在串s中的位置int i,j;if(s.len==0 || t.len==0) return 0;i = pos;j = 0;while(i<s.len && j<t.len)if(s.ch[i]==t.ch[j]){i++;j++;}else{i = i-j+1;j = 0;}if(j>=t.len) return i-j;else return 0; }返回目錄:
Chilan Yu:《數據結構》目錄鏈接?zhuanlan.zhihu.com總結
以上是生活随笔為你收集整理的存储过程 while is null_4.2 串的存储实现(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lfw分类 python_LFW精确度验
- 下一篇: JAVA面试八股文