【数据结构】串的堆分配表示与实现

前端之家收集整理的这篇文章主要介绍了【数据结构】串的堆分配表示与实现前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

采用堆分配存储表示的串被称为堆串,与顺序串相比,地址空间仍是连续,但空间是在程序执行时动态分配的。

程序中会使用到的realloc函数


//realloc : (void *)reelloc (void *ptr,unsigned newsize);
//使用 : char *str;
// str = (char *)realloc(str,20);





代码实现如下:


  1. <span style="font-size:18px;">#pragma once
  2.  
  3. #include<iostream>
  4.  
  5. using namespace std;
  6.  
  7. #define MAX_SZIE 30
  8.  
  9. typedef struct
  10. {
  11. char *str;
  12. int length;
  13. }HeapString;
  14.  
  15. /*判断空*/
  16. bool IsEmpty(HeapString *s);
  17.  
  18. /*初始化*/
  19. void InintString(HeapString *s);
  20.  
  21. /*求长度*/
  22. int Length(HeapString *s);
  23.  
  24. /*用字符串给串赋值*/
  25. bool StrAssign(HeapString *s,char cstr[]);
  26.  
  27. /*打印*/
  28. void StrPrint(HeapString *s);
  29.  
  30. /*在S的pos位置插入串T*/
  31. bool StrInsert(HeapString *S,int pos,HeapString *T);
  32.  
  33. /*在S的pos位置删除长度为len的子串*/
  34. bool StrDelete(HeapString *S,int len);
  35.  
  36. /*清空串*/
  37. void ClearString(HeapString *s);
  38.  
  39. /*摧毁*/
  40. void Destroy(HeapString *s);
  41.  
  42. /*从S的pos位置截取长为len的子串sub*/
  43. bool SubString(HeapString *sub,HeapString *s,int len);
  44.  
  45. /*拼接*/
  46. bool StringConcat(HeapString *T,HeapString *S,HeapString *S2);
  47.  
  48. /*拷贝*/
  49. bool StrCopy(HeapString *T,HeapString *S);
  50.  
  51. /*比较*/
  52. int StrCompare(HeapString *T,HeapString *S);
  53.  
  54. /*从S的pos位置开始定位子串T的初始位置*/
  55. int StrIndex(HeapString *S,HeapString *T);
  56.  
  57. /*将S中的子串T全部用V替换*/
  58. bool StrReplace(HeapString *S,HeapString *T,HeapString *V);</span>


  1. <span style="font-size:18px;">#include "string.h"
  2.  
  3. /*堆串*/
  4.  
  5. void InintString(HeapString *s)
  6. {
  7. s->length = 0;
  8. s->str = '\0';
  9. }
  10.  
  11.  
  12. bool IsEmpty(HeapString *s)
  13. {
  14. return s->length == 0;
  15. }
  16.  
  17.  
  18. int Length(HeapString *s)
  19. {
  20. return s->length;
  21. }
  22.  
  23.  
  24. void PrintString(char T[])
  25. {
  26. cout << T << endl;
  27. }
  28.  
  29. bool StrAssign(HeapString *s,char cstr[])
  30. {
  31. int i = 0;
  32. int len = 0;
  33.  
  34. if (s->str)
  35. free(s->str);
  36.  
  37. for (i = 0; cstr[i] != '\0'; i++);
  38. len = i;
  39.  
  40. if (!i)
  41. {
  42. s->str = '\0';
  43. s->length = 0;
  44. }
  45. else
  46. {
  47. s->str = (char *)malloc(sizeof(char)*len);
  48. if (s->str == NULL)
  49. return false;
  50. for (i = 0; i < len; i++)
  51. {
  52. s->str[i] = cstr[i];
  53. }
  54. s->length = len;
  55. }
  56.  
  57. s->str[i] = cstr[i];
  58. s->length = i;
  59. }
  60.  
  61.  
  62. void StrPrint(HeapString *S)
  63. {
  64. int i = 0;
  65. for (i = 0; i < S->length; i++)
  66. {
  67. cout <<S->str[i];
  68. }
  69. cout << endl;
  70. }
  71.  
  72.  
  73. void ClearString(HeapString *s)
  74. {
  75. if (s->str)
  76. free(s->str);
  77. s->str = '\0';
  78. s->length = 0;
  79. }
  80.  
  81.  
  82. void Destroy(HeapString *s)
  83. {
  84. if (s->str)
  85. free(s->str);
  86. s->str == NULL;
  87. }
  88.  
  89.  
  90. bool SubString(HeapString *sub,int len)
  91. {
  92. if (sub->str)
  93. free(sub->str);
  94.  
  95. if (pos < 0 || pos > s->length || len <= 0 || len > s->length - pos + 1)
  96. return false;
  97.  
  98. sub->str = (char *)malloc(sizeof(char)*len);
  99. if (sub->str == NULL)
  100. return false;
  101. int i = 0;
  102. for (; i < len; i++)
  103. {
  104. sub->str[i] = s->str[i + pos - 1];
  105. }
  106. sub->str[len] = '\0';
  107. sub->length = len;
  108. }
  109.  
  110.  
  111. bool StringConcat(HeapString *T,HeapString *S1,HeapString *S2)
  112. {
  113. T->str = (char *)realloc(T->str,sizeof(char)*(S1->length + S2->length));
  114. if (T->str == NULL)
  115. return false;
  116.  
  117. int i = 0;
  118. for (; i < S1->length; i++)
  119. {
  120. T->str[i] = S1->str[i];
  121. }
  122.  
  123. for (i = 0; i < S2->length; i++)
  124. {
  125. T->str[S1->length + i] = S2->str[i];
  126. }
  127. T->str[S1->length + S2->length] == '\0';
  128. T->length = S1->length + S2->length;
  129.  
  130. return true;
  131. }
  132.  
  133.  
  134. bool StrCopy(HeapString *T,HeapString *S)
  135. {
  136. if (S->str == '\0')
  137. return false;
  138.  
  139. T->str = (char *)realloc(T->str,sizeof(char)*(S->length));
  140. if (T->str == NULL)
  141. return false;
  142.  
  143. for (int i = 0; i < S->length; i++)
  144. T->str[i] = S->str[i];
  145. T->length = S->length;
  146.  
  147. return true;
  148. }
  149.  
  150.  
  151. int StrCompare(HeapString *T,HeapString *S)
  152. {
  153. int i = 0;
  154. for (; i < T->length && i < T->length; i++)
  155. {
  156. if (T->str[i] != S->str[i])
  157. {
  158. if (T->str[i] > S->str[i])
  159. return 1;
  160. return -1;
  161. }
  162. }
  163.  
  164. if (T->length > T->length)
  165. return 1;
  166. else if (T->length < T->length)
  167. return -1;
  168. return 0;
  169. }
  170.  
  171.  
  172. bool StrDelete(HeapString *S,int len)
  173. {
  174. int i = 0;
  175. char *p;
  176. if (pos<0 || pos > S->length || len < 0 || len > S->length - pos + 1)
  177. return false;
  178.  
  179. p = (char*)malloc(S->length - len);
  180. if (p == NULL)
  181. return false;
  182.  
  183. for (i = 0; i <pos - 1; i++)
  184. {
  185. p[i] = S->str[i];
  186. }
  187.  
  188. for (i = pos - 1; i < S->length - len; i++)
  189. {
  190. p[i] = S->str[i+len];
  191. }
  192. S->length = S->length - len;
  193.  
  194. S->str = p;
  195.  
  196. return true;
  197. }
  198.  
  199.  
  200. int StrIndex(HeapString *S,HeapString *T)
  201. {
  202. if (pos < 0 || pos > S->length || IsEmpty(T))
  203. return 0;
  204.  
  205. int i = pos - 1;
  206. int j = 0;
  207.  
  208. while (i < S->length && j < T->length )
  209. {
  210. if (S->str[i] == T->str[j])
  211. {
  212. i++;
  213. j++;
  214. }
  215. else
  216. {
  217. i = i - j + 1;
  218. j = 0;
  219. }
  220. }
  221. if (j >= T->length)
  222. return i - j + 1;
  223. else
  224. return -1;
  225. }
  226.  
  227.  
  228. bool StrInsert(HeapString *S,HeapString *T)
  229. {
  230. int i = 0;
  231. int s_len = S->length;
  232. int t_len = T->length;
  233.  
  234. if (pos < 0 || pos - 1 >= S->length)
  235. return false;
  236.  
  237. S->str = (char *)realloc(S->str,(S->length + T->length)*sizeof(char));
  238. if (S->str == NULL)
  239. {
  240. cout << "内存分配失败" << endl;
  241. return false;
  242. }
  243. for (i = S->length - 1; i >= pos - 1; i--)
  244. {
  245. S->str[i + T->length ] = S->str[i];
  246. }
  247.  
  248. for (i = 0; i<T->length; i++)
  249. {
  250. S->str[pos - 1 + i] = T->str[i];
  251. }
  252. S->length += T->length;
  253. //S[i] = '\0';
  254. return true;
  255. }
  256.  
  257.  
  258. bool StrReplace(HeapString *S,HeapString *V)
  259. {
  260. int i = 1;
  261. int flag;
  262. if (IsEmpty(T))
  263. return false;
  264. do
  265. {
  266. i = StrIndex(S,i,T);
  267. if (i)
  268. {
  269. StrDelete(S,Length(T));
  270. int flag = StrInsert(S,V);
  271. if (!flag)
  272. return false;
  273.  
  274. i += Length(V);
  275. }
  276. } while (i);
  277. return true;
  278. }</span>


  1. <span style="font-size:18px;">#include "string.h"
  2.  
  3.  
  4. void main()
  5. {
  6. HeapString s1,s2,sub,T;
  7. char ch[MAX_SZIE+1];
  8. char a[] = "abcdefdeg";
  9. char b[] = "de";
  10. char c[] = "XY";
  11.  
  12. InintString(&s1);
  13. //cout <<"请输入第1个串:"<< endl;
  14. //gets_s(ch);
  15. //StrAssign(&s1,ch);
  16. StrAssign(&s1,a);
  17. cout << "输出串s1: " << endl;
  18. StrPrint(&s1);
  19.  
  20. //SubString(&sub,s1,2,3);
  21. //StrPrint(&sub);
  22.  
  23. InintString(&s2);
  24. //cout << "请输入第2个串:" << endl;
  25. //gets_s(ch);
  26. StrAssign(&s2,b);
  27. cout << "输出串s2: " << endl;
  28. StrPrint(&s2);
  29.  
  30. cout << endl;
  31. //InintString(&T);
  32. //StringConcat(&T,&s1,&s2);
  33. //StrPrint(&T);
  34. //StrCopy(&s1,&s2);
  35. //StrPrint(&s1);
  36.  
  37. //cout << StrCompare(&s1,&s2) <<endl;
  38. //StrDelete(&s1,3);
  39. cout<<StrIndex(&s1,&s2)<<endl;
  40.  
  41.  
  42. InintString(&sub);
  43. StrAssign(&sub,c);
  44. StrPrint(&sub);
  45.  
  46. StrReplace(&s1,&s2,&sub);
  47. //StrInsert(&s1,&sub);
  48. StrPrint(&s1);
  49.  
  50. getchar();
  51. }</span>



运行结果如下:


猜你在找的数据结构相关文章