串的堆分配實現

今天,線性結構基本就這樣了,以后(至少是最近)就很少寫線性基礎結構的實現了。

串的類型定義

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; ? ? ? ? ? /*當串為空時,返回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;}
}


串的復制

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個位置插入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("內存分配失敗");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個字符*/
{int i;char *p;if(pos<0||len<0||pos+len-1>S->length){printf("刪除位置不正確,參數len不合法");return 0;}p=(char*)malloc(S->length-len); ? ? ? ? ? ? /*p指向動態分配的內存單元*/if(!p)exit(-1);for(i=0;i<pos-1;i++) ? ? ? ? ? ? ? ? ? ? ? ?/*將串第pos位置之前的字符復制到p中*/p[i]=S->str[i];for(i=pos-1;i<S->length-len;i++) ? ? ? ? ? ? ? ?/*將串第pos+len位置以后的字符復制到p中*/p[i]=S->str[i+len];S->length=S->length-len; ? ? ? ? ? ? ? ? ? ?/*修改串的長度*/free(S->str); ? ? ? ? ? ? ? ? ? ? ? ? ? /*釋放原來的串S的內存空間*/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++) /*比較兩個串中的字符*/if(S.str[i]!=T.str[i]) ? ? ? ? ?/*如果出現字符不同,則返回兩個字符的差值*/return (S.str[i]-T.str[i]);
return (S.length-T.length); ? ? ? ? ? ? /*如果比較完畢,返回兩個串的長度的差值*/
}


串的連接

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");
}


?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/445503.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/445503.shtml
英文地址,請注明出處:http://en.pswp.cn/news/445503.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Numpy 入門

Numpy 入門 Numpy簡介 官網鏈接&#xff1a;http://www.numpy.org/NumPy是Python語言的一個擴充程序庫。支持高級大量的維度數組與矩陣運算&#xff0c;此外也針對數組運算提供大量的數學函數庫 Numpy的基本功能 快速高效的多維數組對象ndarray用于對數組執行元素級計算以…

數據結構課上筆記10

樹 樹的定義&#xff1a;樹(Tree)是 n(n≥0)個結點的有限集。若 n0&#xff0c;稱為空樹&#xff1b;若 n > 0&#xff0c;則它滿足如下兩個條件&#xff1a; (1) 有且僅有一個特定的稱為根 (Root) 的結點&#xff1b; (2) 其余結點可分為 m (m≥0) 個互不相交的有限…

pandasStudyNoteBook

pandas 入門培訓 pandas簡介 - 官網鏈接&#xff1a;http://pandas.pydata.org/ - pandas pannel data data analysis - Pandas是python的一個數據分析包 , Pandas最初被作為金融數據分析工具而開發出來&#xff0c;因此&#xff0c;pandas為時間序列分析提供了很好的支持 …

最大搜索子樹

給定一個二叉樹的頭結點&#xff0c;返回最大搜索子樹的大小。 我們先定義結點&#xff1a; public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value data;}} 分析&#xff1a; 直接判斷每個節點左邊小右邊大是…

二叉樹最長路徑

分析&#xff1a; 暴力求每一段距離也可。 對于以本節點為根的二叉樹&#xff0c;最遠距離有三種可能&#xff1a; 1&#xff09;最遠路徑來自左子樹 2 &#xff09;最遠路徑來自右子樹&#xff08;圖示與左子樹同理&#xff09; 3&#xff09;最遠路徑為左右子樹距離根最遠…

判斷完全二叉樹

完全二叉樹的定義: 一棵二叉樹&#xff0c;除了最后一層之外都是完全填充的&#xff0c;并且最后一層的葉子結點都在左邊。 https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91/7773232?fraladdin 百度定義 思路&#xff1a;層序遍歷二叉樹 如果…

判斷二叉搜索樹

二叉查找樹&#xff08;Binary Search Tree&#xff09;&#xff0c;&#xff08;又&#xff1a;二叉搜索樹&#xff0c;二叉排序樹&#xff09;它或者是一棵空樹&#xff0c;或者是具有下列性質的二叉樹&#xff1a; 若它的左子樹不空&#xff0c;則左子樹上所有結點的值均小于…

劍指offer_01

文章目錄[toc]第一章 面試流程1.1 面試官談面試1.2 面試3種形式1.3 面試的3個環節第一章 面試流程 1.1 面試官談面試 初級的程序員談算法和數據結構&#xff0c;高級的程序員談項目經驗要對公司近況和項目情況了解不要緊張&#xff0c;不要馬上上手寫代碼 1.2 面試3種形式 …

判斷平衡二叉樹

平衡二叉樹&#xff08;Balanced Binary Tree&#xff09;具有以下性質&#xff1a;它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1。并且左右兩個子樹都是一棵平衡二叉樹 &#xff08;不是我們平時意義上的必須為搜索樹&#xff09; 判斷一棵樹是否為平衡二叉樹&am…

劍指offer_02

文章目錄第二章 面試需要的基礎知識1.1 面試官談基礎知識1.2 編程語言1.3 數據結構1.4 算法和數據操作第二章 面試需要的基礎知識 1.1 面試官談基礎知識 數據結構和算法&#xff0c;編程能力&#xff0c;部分數學能力&#xff0c;問題分析和推理能力編程基礎&#xff0c;計算…

求完全二叉樹的結點個數

第一次見這個題&#xff0c;看時間小于O(N)。。。。。 只能是二分啊。 但是怎么二分&#xff0c;條件是什么&#xff0c;真的想不到。 后來知道了&#xff0c;我們要找最深一層最右邊那個結點。借此確定結點個數。 我們知道&#xff0c;滿二叉樹的結點個數和深度是有公式的&a…

劍指offer_03

文章目錄第三章 高質量代碼1.1 面試官談高質量代碼1.2 代碼的規范性1.3 代碼的完整性1.4 代碼的魯棒性第三章 高質量代碼 1.1 面試官談高質量代碼 代碼應該考慮異常狀況和垃圾回收問題&#xff0c;不能忽視邊界情況變量&#xff0c;函數命名應該要統一&#xff0c;備注要恰到…

劍指offer_04

文章目錄第四章 解決面試題的思路1.1 面試官談面試思路1.2 畫圖讓問題抽象化1.3 舉例讓抽象問題具體化1.4 分解讓復雜問題具體化第四章 解決面試題的思路 1.1 面試官談面試思路 編程前講自己的思路是一項考核指標&#xff0c;不能一開始就變成&#xff0c;面試的時候應該和面…

先序中序后序兩兩結合重建二叉樹

遍歷是對樹的一種最基本的運算&#xff0c;所謂遍歷二叉樹&#xff0c;就是按一定的規則和順序走遍二叉樹的所有結點&#xff0c;使每一個結點都被訪問一次&#xff0c;而且只被訪問一次。由于二叉樹是非線性結構&#xff0c;因此&#xff0c;樹的遍歷實質上是將二叉樹的各個結…

劍指offer_05

文章目錄第五章 優化時間和空間效率1.1 面試官談效率1.2 時間效率1.3 時間效率和空間效率的平衡第五章 優化時間和空間效率 1.1 面試官談效率 1.時間和空間復雜度是寫程序的時候&#xff0c;我們需要分析的&#xff0c;最好每次寫完代碼后自己都可以將程序的時間和空間復雜度…

先序中序數組推后序數組

二叉樹遍歷 所謂遍歷(Traversal)是指沿著某條搜索路線&#xff0c;依次對樹中每個結點均做一次且僅做一次訪問。訪問結點所做的操作依賴于具體的應用問 題。 遍歷是二叉樹上最重要的運算之一&#xff0c;是二叉樹上進行其它運算之基礎。 從二叉樹的遞歸定義可知&#xff0c;一…

劍指offer_06

文章目錄第六章 面試中的各項能力1.1 面試官談能力1.2 溝通能力和學習能力1.3 知識遷移能力1.4 抽象建模能力1.5 發散思維能力第六章 面試中的各項能力 1.1 面試官談能力 1.禮貌平和&#xff0c;不卑不亢的和面試官溝通&#xff1b;邏輯清楚&#xff0c;詳略得到的介紹項目經…

數據結構課上筆記11

滿二叉樹 (Full binary tree) 除最后一層無任何子節點外&#xff0c;每一層上的所有結點都有兩個子結點二叉樹。 國內教程定義&#xff1a;一個二叉樹&#xff0c;如果每一個層的結點數都達到最大值&#xff0c;則這個二叉樹就是滿二叉樹。也就是說&#xff0c;如果一個二叉樹…

數據結構和算法(01)--- 算法復雜度

文章目錄算法時間復雜度算法時間復雜度 要判斷算法的好壞&#xff0c;可以從時間方面進行分析。算法運行的越快&#xff0c;所用的時間越短則算法越好。但是同一個算法在不同的平臺上的運行時間不同。那么又該如何進行評判呢&#xff1f;我們采用時間復雜度進行衡量。 1.算法時…

數據結構課上筆記12

二叉樹的存儲結構 順序存儲結構 完全二叉樹&#xff1a;用一組地址連續的 存儲單元依次自上而下、自左至右存 儲結點元素&#xff0c;即將編號為 i 的結點元 素存儲在一維數組中下標為 i –1 的分量中。 一般二叉樹&#xff1a;將其每個結點與完 全二叉樹上的結點相對照&…