当前位置:   article > 正文

数据结构-串_数据结构串的定义

数据结构串的定义

 

目录

一、串的定义

1、串的定义

2、串的一些概念

二、串的存储结构

三、顺序串

1、顺序串定义

2、顺序串的基本运算

(1)代码部分

(2)结果演示


一、串的定义

1、串的定义

串是有零个或或多个字符组成的有限序列,又称为字符串。

一般记为: (n为正整数),str中串名,(1<=i<=n),由字母、数字和其他字符组成,n为串的长度。

2、串的一些概念

(1)空串:长度为零的串,称为空串,不含任意字符。

(2)子串:串中任意个连续的字符组成的子序列称为该串的子串,其中空串是任意串的子串。

注:串、子串和空串等概念与集合的概念有着很多相似之处。

二、串的存储结构

串的存储结构主要分为顺序存储结构和链式存储结构两大类。

三、顺序串

1、顺序串定义

用一组地址连续的存储单元存储串值的字符序列。

2、顺序串的基本运算

(1)代码部分

  1. #include <stdio.h>
  2. #include<string.h>
  3. #include <malloc.h>
  4. #define MaxSize 200
  5. //串声明
  6. typedef struct
  7. {
  8. char data[MaxSize];
  9. int length;
  10. }SqString;
  11. //串赋值
  12. void Assign(SqString &s,char str[])
  13. {
  14. int i=0;
  15. while(str[i]!='\0') //遍历str的所有字符,数组以空字符'\0'标识串结束
  16. {
  17. s.data[i]=str[i];
  18. i++;
  19. }
  20. s.length=i;
  21. }
  22. //销毁串
  23. void DestroyStr(SqString s)
  24. {
  25. }
  26. //串复制
  27. void StrCopy(SqString &s,SqString t)
  28. {
  29. int i;
  30. for(i=0;i<t.length;i++)
  31. s.data[i]=t.data[i];
  32. s.length=t.length;
  33. }
  34. //串长度
  35. int StrLength(SqString s)
  36. {
  37. return (s.length);
  38. }
  39. //判断串相等运算算法
  40. int StrEqual(SqString s,SqString t)
  41. {
  42. int i=0;
  43. if(s.length !=t.length) //串长不同时返回0
  44. return (0);
  45. else
  46. {
  47. for(i=0;i<s.length;i++)
  48. if(s.data[i]!=t.data[i])
  49. return 0;
  50. return 1;
  51. }
  52. }
  53. //串连接运算算法
  54. SqString Concat(SqString s,SqString t)
  55. {
  56. SqString r;
  57. int i,j;
  58. for(i=0;i<s.length;i++)
  59. r.data[i]=s.data[i]; //将s复制到r
  60. for(j=0;j<t.length;j++)
  61. r.data[s.length+j]=t.data[j]; //将t复制到r
  62. r.length=i+j;
  63. return r; //返回r
  64. }
  65. //子串运算
  66. SqString SubStr(SqString s,int i,int j)
  67. {
  68. SqString t;
  69. int k;
  70. if(i<1 || i>s.length || j<1 || i+j>s.length+1)
  71. t.length=0;
  72. else
  73. {
  74. for(k=i-1;k<i+j;k++)
  75. t.data[k-i+1]=s.data[k];
  76. t.length=j;
  77. }
  78. return t;
  79. }
  80. //查找子串位置运算算法
  81. int Index(SqString s,SqString t)
  82. {
  83. int i=0,j=0; //i和j分别扫描主串s和子串t
  84. while(i<s.length && j<t.length) //两个串都没有扫描完
  85. {
  86. if(s.data[i]==t.data[j]) //对应字符相同时,继续比较下一对字符
  87. {
  88. i++; //继续后面两个字符的比较
  89. j++;
  90. }
  91. else //否则,主串指针回溯重新开始下一次匹配
  92. {
  93. i=i-j+1; //i回退到原i的下一个位置
  94. j=0; //j从t的第一个字符开始
  95. }
  96. }
  97. if(j>=t.length)
  98. return i-t.length+1;
  99. else
  100. return 0;
  101. }
  102. //子串插入
  103. int InsStr (SqString &s,int i,SqString t)
  104. {
  105. int j;
  106. if(i<1 || i>s.length+1) //位置参数错误返回0
  107. return 0;
  108. else
  109. {
  110. for(j=s.length-1;j=i-1;j--) //将s.data[i-1..s.length-1]
  111. s.data[j+t.length]=s.data[j]; //后移t.length个位置
  112. for(j=0;j<t.length;j++) //插入子串t
  113. s.data[i+j-1]=t.data[j];
  114. s.length=s.length+t.length; //修改s串长度
  115. return 1; //成功插入返回1
  116. }
  117. }
  118. //子串删除
  119. int DelStr(SqString &s,int i,int j)
  120. {
  121. int k;
  122. if(i<1 || i>s.length || j<1 || i+j>s.length+1)
  123. return 0;
  124. else
  125. {
  126. for(k=i+j-1;k<s.length;k++)
  127. s.data[k-j]=s.data[k];
  128. s.length=s.length-j;
  129. return 1;
  130. }
  131. }
  132. //子串替换
  133. SqString RepStrAll(SqString s,SqString s1,SqString s2)
  134. {
  135. int i;
  136. i=Index(s,s1);
  137. while(i>0)
  138. {
  139. DelStr(s,i,s1.length); //从s中删除子串s1
  140. InsStr(s,i,s2); //在s中插入子串s2
  141. i=Index(s,s1);
  142. }
  143. return s;
  144. }
  145. //输出串
  146. void DispStr(SqString s)
  147. {
  148. int i;
  149. for(i=0;i<s.length;i++)
  150. printf("%c",s.data[i]);
  151. printf("\n");
  152. }
  153. void main()
  154. {
  155. SqString s1,s2,s3,s4,s5,s6,s7;
  156. Assign(s1,"abcd");
  157. printf("s1:");
  158. DispStr(s1);
  159. printf("s1 的长度: %d\n",StrLength(s1));
  160. printf("s1=>s2\n");
  161. StrCopy(s2,s1);
  162. printf("s2 :");
  163. DispStr(s2);
  164. printf("s1和s2 %s\n",(StrEqual(s1,s2)==1 ? "相同" : "不相同"));
  165. Assign(s3,"12345678");
  166. printf("s3 :");
  167. DispStr(s3);
  168. printf("s1和s3连接=>s4\n");
  169. s4=Concat(s1,s3);
  170. printf("s4:");
  171. DispStr(s4);
  172. printf("s3[2..5]=>s5\n");
  173. s5=SubStr(s3,2,4);
  174. printf("s5:");
  175. DispStr(s5);
  176. Assign(s6,"567");
  177. printf("s6:");
  178. DispStr(s6);
  179. printf("s6在s3中位置:%d\n",Index(s3,s6));
  180. printf("从s3中删除s3[3..6]字符\n");
  181. DelStr(s3,3,4);
  182. printf("s3:");
  183. DispStr(s3);
  184. printf("从s4中将s6替换成s1=>s7\n");
  185. s7=RepStrAll(s4,s6,s1);
  186. printf("s7:");
  187. DispStr(s7);
  188. DestroyStr(s1);
  189. DestroyStr(s2);
  190. DestroyStr(s3);
  191. DestroyStr(s4);
  192. DestroyStr(s5);
  193. DestroyStr(s6);
  194. DestroyStr(s7);
  195. }

(2)结果演示

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/169411
推荐阅读
相关标签
  

闽ICP备14008679号