日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

串的堆分配实现

發(fā)布時(shí)間:2023/12/13 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 串的堆分配实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

今天,線性結(jié)構(gòu)基本就這樣了,以后(至少是最近)就很少寫線性基礎(chǔ)結(jié)構(gòu)的實(shí)現(xiàn)了。

串的類型定義

typedef struct {char *str;int length; }HeapString;


初始化串

InitString(HeapString *S) {S->length=0;S->str='\0'; }

長度

int StrEmpty(HeapString S) /*判斷串是否為空,串為空返回1,否則返回0*/ {if(S.length==0) ? ? ? ? /*判斷串的長度是否等于0*/return 1; ? ? ? ? ? /*當(dāng)串為空時(shí),返回1;否則返回0*/elsereturn 0; } int StrLength(HeapString S) /*求串的長度操作*/ {return S.length; }


串的賦值

void StrAssign(HeapString *S,char cstr[]) /*串的賦值操作*/ {int i=0,len;if(S->str)free(S->str);for(i=0;cstr[i]!='\0';i++); /*求cstr字符串的長度*/len=i;if(!i){S->str=NULL;S->length=0;}else{S->str=(char*)malloc((len+1)*sizeof(char));if(!S->str)exit(-1);for(i=0;i<len;i++)S->str[i]=cstr[i];S->length=len;} }


串的復(fù)制

void StrAssign(HeapString *S,char cstr[]) /*串的賦值操作*/ {int i=0,len;if(S->str)free(S->str);for(i=0;cstr[i]!='\0';i++); /*求cstr字符串的長度*/len=i;if(!i){S->str=NULL;S->length=0;}else{S->str=(char*)malloc((len+1)*sizeof(char));if(!S->str)exit(-1);for(i=0;i<len;i++)S->str[i]=cstr[i];S->length=len;} }


串的插入

int StrInsert(HeapString *S,int pos,HeapString T) /*串的插入操作。在S中第pos個(gè)位置插入T分為三種情況*/ {int i;if(pos<0||pos-1>S->length) ? ? ?/*插入位置不正確,返回0*/{printf("插入位置不正確");return 0;}S->str=(char*)realloc(S->str,(S->length+T.length)*sizeof(char));if(!S->str){printf("內(nèi)存分配失敗");exit(-1);}for(i=S->length-1;i>=pos-1;i--)S->str[i+T.length]=S->str[i];for(i=0;i<T.length;i++)S->str[pos+i-1]=T.str[i];S->length=S->length+T.length;return 1; }


串的刪除

int StrDelete(HeapString *S,int pos,int len) /*在串S中刪除pos開始的len個(gè)字符*/ {int i;char *p;if(pos<0||len<0||pos+len-1>S->length){printf("刪除位置不正確,參數(shù)len不合法");return 0;}p=(char*)malloc(S->length-len); ? ? ? ? ? ? /*p指向動(dòng)態(tài)分配的內(nèi)存單元*/if(!p)exit(-1);for(i=0;i<pos-1;i++) ? ? ? ? ? ? ? ? ? ? ? ?/*將串第pos位置之前的字符復(fù)制到p中*/p[i]=S->str[i];for(i=pos-1;i<S->length-len;i++) ? ? ? ? ? ? ? ?/*將串第pos+len位置以后的字符復(fù)制到p中*/p[i]=S->str[i+len];S->length=S->length-len; ? ? ? ? ? ? ? ? ? ?/*修改串的長度*/free(S->str); ? ? ? ? ? ? ? ? ? ? ? ? ? /*釋放原來的串S的內(nèi)存空間*/S->str=p; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? /*將串的str指向p字符串*/return 1; }



串的比較

int StrCompare(HeapString S,HeapString T) /*串的比較操作*/ { int i; for(i=0;i<S.length&&i<T.length;i++) /*比較兩個(gè)串中的字符*/if(S.str[i]!=T.str[i]) ? ? ? ? ?/*如果出現(xiàn)字符不同,則返回兩個(gè)字符的差值*/return (S.str[i]-T.str[i]); return (S.length-T.length); ? ? ? ? ? ? /*如果比較完畢,返回兩個(gè)串的長度的差值*/ }


串的連接

int StrCat(HeapString *T,HeapString S) /*將串S連接在串T的后面*/ {int i;T->str=(char*)realloc(T->str,(T->length+S.length)*sizeof(char));if(!T->str){printf("分配空間失敗");exit(-1);}else{for(i=T->length;i<T->length+S.length;i++) ? /*串S直接連接在T的末尾*/T->str[i]=S.str[i-T->length];T->length=T->length+S.length; ? ? ? ? ? /*修改串T的長度*/}return 1; }


清空串

void StrClear(HeapString *S) /*清空串,只需要將串的長度置為0即可*/ {S->str='\0';S->length=0; }


銷毀串

void StrDestroy(HeapString *S) {if(S->str)free(S->str); }

打印

void StrPrint(HeapString S) {int i;for(i=0;i<S.length;i++){printf("%c",S.str[i]);}printf("\n"); }


?

總結(jié)

以上是生活随笔為你收集整理的串的堆分配实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。