当前位置:   article > 正文

数据结构之链串的基本操作——C语言_链串的基本操作c语言

链串的基本操作c语言
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. typedef struct snode
  5. {
  6. char data;
  7. struct snode * next;
  8. }LiString;
  9. void StrAssign(LiString *&s,char t[])
  10. {
  11. int i;
  12. LiString *r,*p; /*r始终指向尾结点*/
  13. s=(LiString *)malloc(sizeof(LiString));
  14. r=s;
  15. for (i=0;t[i]!='\0';i++)
  16. {
  17. p=(LiString *)malloc(sizeof(LiString));
  18. p->data=t[i];
  19. r->next=p;
  20. r=p;
  21. }
  22. r->next=NULL;
  23. }
  24. void StrCopy(LiString *&s,LiString *t)
  25. {
  26. LiString *p=t->next,*q,*r;
  27. s=(LiString *)malloc(sizeof(LiString));
  28. r=s; /*r始终指向尾结点*/
  29. while (p!=NULL) /*将t的所有结点复制到s*/
  30. {
  31. q=(LiString *)malloc(sizeof(LiString));
  32. q->data=p->data;
  33. r->next=q;
  34. r=q;
  35. p=p->next;
  36. }
  37. r->next=NULL;
  38. }
  39. int StrEqual(LiString *s,LiString *t)
  40. {
  41. LiString *p=s->next,*q=t->next;
  42. while (p!=NULL && q!=NULL && p->data==q->data)
  43. {
  44. p=p->next;
  45. q=q->next;
  46. }
  47. if (p==NULL && q==NULL)
  48. return 1;
  49. else
  50. return 0;
  51. }
  52. int StrLength(LiString *s)
  53. {
  54. int i=0;
  55. LiString *p=s->next;
  56. while (p!=NULL)
  57. {
  58. i++;
  59. p=p->next;
  60. }
  61. return i;
  62. }
  63. LiString *Concat(LiString *s,LiString *t)
  64. {
  65. LiString *str,*p=s->next,*q,*r;
  66. str=(LiString *)malloc(sizeof(LiString));
  67. r=str;
  68. while (p!=NULL) /*将s的所有结点复制到str*/
  69. {
  70. q=(LiString *)malloc(sizeof(LiString));
  71. q->data=p->data;
  72. r->next=q;
  73. r=q;
  74. p=p->next;
  75. }
  76. p=t->next;
  77. while (p!=NULL) /*将t的所有结点复制到str*/
  78. {
  79. q=(LiString *)malloc(sizeof(LiString));
  80. q->data=p->data;
  81. r->next=q;
  82. r=q;
  83. p=p->next;
  84. }
  85. r->next=NULL;
  86. return str;
  87. }
  88. LiString *SubStr(LiString *s,int i,int j)
  89. {
  90. int k;
  91. LiString *str,*p=s->next,*q,*r;
  92. str=(LiString *)malloc(sizeof(LiString));
  93. r=str;
  94. if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
  95. {
  96. printf("参数不正确\n");
  97. return str; /*参数不正确时返回空串*/
  98. }
  99. for (k=0;k<i-1;k++) /*找第i-1个结点,由p指向它*/
  100. p=p->next;
  101. for (k=1;k<=j;k++) /*s[i]开始的j个结点=>str*/
  102. {
  103. q=(LiString *)malloc(sizeof(LiString));
  104. q->data=p->data;q->next=NULL;
  105. r->next=q;r=q;
  106. p=p->next;
  107. }
  108. r->next=NULL;
  109. return str;
  110. }
  111. LiString *InsStr(LiString *s,int i,LiString *t)
  112. {
  113. int k;
  114. LiString *str,*p=s->next,*p1=t->next,*q,*r;
  115. str=(LiString *)malloc(sizeof(LiString));
  116. r=str;
  117. if (i<=0 || i>StrLength(s)+1)
  118. {
  119. printf("参数不正确\n");
  120. return str; /*参数不正确时返回空串*/
  121. }
  122. for (k=1;k<i;k++) /*将s的前i个结点复制到str*/
  123. {
  124. q=(LiString *)malloc(sizeof(LiString));
  125. q->data=p->data;q->next=NULL;
  126. r->next=q;
  127. r=q;
  128. p=p->next;
  129. }
  130. while (p1!=NULL) /*将t的所有结点复制到str*/
  131. {
  132. q=(LiString *)malloc(sizeof(LiString));
  133. q->data=p1->data;q->next=NULL;
  134. r->next=q;r=q; p1=p1->next;
  135. }
  136. while (p!=NULL) /*将*p及其后的结点复制到str*/
  137. {
  138. q=(LiString *)malloc(sizeof(LiString));
  139. q->data=p->data;q->next=NULL;
  140. r->next=q;r=q; p=p->next;
  141. }
  142. r->next=NULL; //q用来申请结点,p遍历s1,q遍历s2
  143. return str;
  144. }
  145. LiString *DelStr(LiString *s,int i,int j)
  146. {
  147. int k;
  148. LiString *str,*p=s->next,*q,*r;
  149. str=(LiString *)malloc(sizeof(LiString));
  150. r=str;
  151. if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
  152. {
  153. printf("参数不正确\n");
  154. return str; /*参数不正确时返回空串*/
  155. }
  156. for (k=0;k<i-1;k++) /*将s的前i-1个结点复制到str*/
  157. {
  158. q=(LiString *)malloc(sizeof(LiString));
  159. q->data=p->data;q->next=NULL;
  160. r->next=q;
  161. r=q;
  162. p=p->next;
  163. }
  164. for (k=0;k<j;k++) /*让p沿next跳j个结点*/
  165. p=p->next;
  166. while (p!=NULL) /*将*p及其后的结点复制到str*/
  167. {
  168. q=(LiString *)malloc(sizeof(LiString));
  169. q->data=p->data;q->next=NULL;
  170. r->next=q;
  171. r=q;
  172. p=p->next;
  173. }
  174. r->next=NULL;
  175. return str;
  176. }
  177. LiString *RepStr(LiString *s,int i,int j,LiString *t)
  178. {
  179. int k;
  180. LiString *str,*p=s->next,*p1=t->next,*q,*r;
  181. str=(LiString *)malloc(sizeof(LiString));
  182. r=str;
  183. if (i<=0 || i>StrLength(s) || j<0 || i+j-1>StrLength(s))
  184. {
  185. printf("参数不正确\n");
  186. return str; /*参数不正确时返回空串*/
  187. }
  188. for (k=0;k<i-1;k++) /*将s的前i-1个结点复制到str*/
  189. {
  190. q=(LiString *)malloc(sizeof(LiString));
  191. q->data=p->data;
  192. q->next=NULL;
  193. r->next=q;
  194. r=q;
  195. p=p->next;
  196. }
  197. for (k=0;k<j;k++) /*让p沿next跳j个结点*/
  198. p=p->next;
  199. while (p1!=NULL) /*将t的所有结点复制到str*/
  200. {
  201. q=(LiString *)malloc(sizeof(LiString));
  202. q->data=p1->data;q->next=NULL;
  203. r->next=q;r=q;p1=p1->next;
  204. }
  205. while (p!=NULL) /*将*p及其后的结点复制到str*/
  206. {
  207. q=(LiString *)malloc(sizeof(LiString));
  208. q->data=p->data;
  209. q->next=NULL;
  210. r->next=q;
  211. r=q;
  212. p=p->next;
  213. }
  214. r->next=NULL;
  215. return str;
  216. }
  217. void DispStr(LiString *s)
  218. {
  219. LiString *p=s->next;
  220. while (p!=NULL)
  221. {
  222. printf("%c",p->data);
  223. p=p->next;
  224. }
  225. printf("\n");
  226. }
  227. int main()
  228. {
  229. LiString *s,*s1,*s2,*s3,*s4;
  230. printf("建立串S和S1...\n");
  231. StrAssign(s,"abcdefghijklmn");
  232. StrAssign(s1,"xyz");
  233. Sleep(2000);
  234. printf("输出串S:");
  235. DispStr(s);
  236. Sleep(2000);
  237. int length = StrLength(s);
  238. printf("输出串S的长度:%d",length);
  239. printf("\n");
  240. Sleep(2000);
  241. s2 = InsStr(s,9,s1);
  242. printf("在串S的第9个字符位置插入串S1而生成串S2...\n");
  243. Sleep(2000);
  244. printf("输出串S2:");
  245. DispStr(s2);
  246. Sleep(2000);
  247. s2 = DelStr(s,2,5);
  248. printf("删除串S的第2个字符开始的5个字符而生成串S2...\n");
  249. Sleep(2000);
  250. printf("输出串S2:");
  251. DispStr(s2);
  252. Sleep(2000);
  253. s2 = RepStr(s,2,5,s1);
  254. printf("将串S的第2个字符开始的5个字符替换成串S1而生成串S2...\n");
  255. Sleep(2000);
  256. printf("输出串S2:");
  257. DispStr(s2);
  258. Sleep(2000);
  259. s3 = SubStr(s,2,10);
  260. printf("提取串S的第2个字符开始的10个字符而生成串S3...\n");
  261. Sleep(2000);
  262. printf("输出串S3:");
  263. DispStr(s3);
  264. Sleep(2000);
  265. s4 = Concat(s1,s2);
  266. printf("将串S1和S2连接起来生成串S4...\n");
  267. Sleep(2000);
  268. printf("输出串S4:");
  269. DispStr(s4);
  270. Sleep(2000);
  271. return 0;
  272. }

 

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

闽ICP备14008679号