当前位置:   article > 正文

双向链表-C语言版_双向链表的程序

双向链表的程序
  1. 源文件部分:
  2. #include<stdio.h>
  3. #include<malloc.h>
  4. #include<string.h>
  5. typedef int Elemtype;
  6. #include"DList.h"
  7. int main()
  8. {
  9. Dlnode head=NULL;
  10. instruction(head);
  11. return 0;
  12. }
  13. 头文件部分:
  14. typedef struct DLnode
  15. {
  16. Elemtype data;
  17. struct DLnode *prior; ///节点的声明定义
  18. struct DLnode *next;
  19. }DLnode,*Dlnode;
  20. void Init_Dlist(Dlnode &arrow) ///双向初始化
  21. {
  22. arrow=(Dlnode)malloc(sizeof(DLnode));
  23. if(!arrow)
  24. {
  25. printf("对不起,已无更多的内存单元,初始化失败!\n");
  26. return ;
  27. }
  28. arrow->prior=NULL;
  29. arrow->next=NULL;
  30. }
  31. int Empty_Dlist(DLnode head) ///双向判空
  32. {
  33. if(head.next==NULL)
  34. return 1;
  35. return 0;
  36. }
  37. void Insert_Dlist(DLnode *head,Elemtype e) ///尾插法-双向(新增)
  38. {
  39. Dlnode p=NULL,q=head;
  40. p=(DLnode *)malloc(sizeof(DLnode));
  41. if(!p)
  42. {
  43. printf("对不起,已无更多的内存单元,申请内存失败!\n");
  44. return ;
  45. }
  46. while(q->next)
  47. {
  48. q=q->next;
  49. }
  50. p->data=e;
  51. p->next=NULL;
  52. p->prior=q;
  53. q->next=p;
  54. }
  55. int Length_Dlist(DLnode head) ///双向的链长
  56. {
  57. DLnode *p=NULL;
  58. int len=0;
  59. p=head.next;
  60. if(Empty_Dlist(head))
  61. return 0;
  62. while(p)
  63. {
  64. len++;
  65. p=p->next;
  66. }
  67. return len;
  68. }
  69. void Delete_Dlist(DLnode *head,Elemtype where) ///双向按位置删除
  70. {
  71. DLnode *p=NULL;
  72. int i=1;
  73. p=head->next;
  74. if(Empty_Dlist(*head))
  75. {
  76. printf("对不起,链表是空的,无法完成删除操作!!!\n");
  77. return ;
  78. }
  79. if(where>Length_Dlist(*head)||where<0)
  80. {
  81. printf("对不起,你删除的位置是不合法的,请重新输入!!!\n");
  82. return ;
  83. }
  84. while(i<where)
  85. {
  86. p=p->next;
  87. i++;
  88. } //保证双向链表的完整性
  89. p->prior->next=p->next;
  90. if(where!=Length_Dlist(*head)+1)
  91. p->next->prior=p->prior;
  92. printf("删除成功!!!\n");
  93. return ;
  94. }
  95. void Insearch_Dlist(DLnode head,Elemtype e) ///双向按元素查找
  96. {
  97. DLnode *p=NULL;
  98. int len=1;
  99. if(Empty_Dlist(head))
  100. {
  101. printf("对不起,链表是空的,无法完成查找操作!!!\n");
  102. return ;
  103. }
  104. p=head.next;
  105. while(p)
  106. {
  107. if(p->data==e)
  108. {
  109. printf("你要查找的元素位于链表的第%d位置上.\n",len);
  110. return ;
  111. }
  112. len++;
  113. p=p->next;
  114. }
  115. printf("对不起,你要查找的元素不存在,请重新输入!!!\n");
  116. return ;
  117. }
  118. void Modify_Dlist(DLnode *head,Elemtype where,Elemtype e) //双向按位置修改
  119. {
  120. DLnode *p=NULL;
  121. int len=1;
  122. if(Empty_Dlist(*head))
  123. {
  124. printf("对不起,链表是空的,无法完成修改操作!!!\n");
  125. return ;
  126. }
  127. p=head->next;
  128. if(where>Length_Dlist(*head)||where<0)
  129. {
  130. printf("对不起,你修改的位置是不合法的,请重新输入!!!\n");
  131. return ;
  132. }
  133. while(len<where)
  134. {
  135. p=p->next;
  136. len++;
  137. }
  138. p->data=e;
  139. printf("修改成功!\n");
  140. return ;
  141. }
  142. void Print_Dlist(Dlnode head) //双向的打印
  143. {
  144. Dlnode p=head->next;
  145. if(p==NULL)
  146. {
  147. printf("对不起,当前链表已空,无法完成打印操作!!!\n");
  148. return ;
  149. }
  150. while(p)
  151. {
  152. printf("%d ",p->data);
  153. p=p->next;
  154. }
  155. printf("\n");
  156. return ;
  157. }
  158. void Destory_Dlist(Dlnode head) //双向的销毁-不包括头节点
  159. {
  160. Dlnode p=head,q=NULL;
  161. while(p->next)
  162. {
  163. p=p->next;
  164. }
  165. while(p!=head)
  166. {
  167. p->prior->next=NULL;
  168. q=p;
  169. p=p->prior;
  170. free(q);
  171. }
  172. printf("销毁成功!!!\n");
  173. }
  174. void instruction(Dlnode head)
  175. {
  176. int n,m,t,a,b,len1,index;
  177. printf("\t\t1、初始操作\n");
  178. printf("\t\t2、新增操作\n"); //为什么不能在这里定义head指针---因为每次调用功能函数后,head指针又被重新初始化了
  179. printf("\t\t3、删除操作\n");
  180. printf("\t\t4、查找操作\n");
  181. printf("\t\t5、修改操作\n");
  182. printf("\t\t6、销毁操作\n");
  183. printf("\t\t7、求长操作\n");
  184. printf("\t\t8、打印操作\n");
  185. printf("\t\t9、退出程序\n");
  186. printf("请输入你所需要完成的指令:\n");
  187. do{
  188. scanf("%d",&n);
  189. if(n<1||n>9)
  190. printf("对不起,你输入的指令编号是无效的,请重新输入!!!\n");
  191. }while(n<1||n>9);
  192. switch(n)
  193. {
  194. case 1:
  195. Init_Dlist(head); //初始化操作
  196. printf("已完成双向链表初始化,请输入你要添加的元素个数!\n");
  197. scanf("%d",&n);
  198. while(n--)
  199. {
  200. int x;
  201. scanf("%d",&x);
  202. Insert_Dlist(head,x);
  203. }
  204. printf("完成建表操作!\n");
  205. break;
  206. case 2: //新增操作
  207. if(!head)
  208. {
  209. printf("对不起,请先完成初始化操作再做该选择!!!\n");
  210. break;
  211. }
  212. printf("请输入你要添加的元素个数!\n");
  213. scanf("%d",&n);
  214. while(n--)
  215. {
  216. int x;
  217. scanf("%d",&x);
  218. Insert_Dlist(head,x);
  219. }
  220. printf("增添成功!\n");
  221. break;
  222. case 3:
  223. printf("请输入你所要删除的节点的位置:\n");
  224. scanf("%d",&n);
  225. Delete_Dlist(head,n); //删除操作
  226. break;
  227. case 4:
  228. printf("请输入你所要查找的元素:\n");
  229. scanf("%d",&m);
  230. Insearch_Dlist(*head,m); //查找操作
  231. break;
  232. case 5:
  233. printf("请输入你更改的元素队列位置:\n"); //修改操作
  234. do{
  235. scanf("%d",&a);
  236. if(a<1||a>Length_Dlist(*head))
  237. printf("对不起,你所输入的元素位置不在区域内,请重新输入!!!\n");
  238. }while(a<1||a>Length_Dlist(*head));
  239. printf("请输入修改后的值:\n");
  240. scanf("%d",&b);
  241. Modify_Dlist(head,a,b);
  242. break;
  243. case 6:
  244. Destory_Dlist(head); //销毁操作
  245. break;
  246. case 7:
  247. len1=Length_Dlist(*head); //返回链长操作
  248. printf("当前链队列的长度为:%d\n",len1);
  249. break;
  250. case 8:
  251. Print_Dlist(head); //打印操作
  252. break;
  253. case 9: //退出操作
  254. return;
  255. default:
  256. instruction(head);
  257. break;
  258. }
  259. instruction(head);
  260. }

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

闽ICP备14008679号