代码如下:

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. //定义单链表的数据类型
  4. typedef struct book
  5. {
  6. char name[10];
  7. char code[10];
  8. float price;
  9. }book;
  10. typedef book Book;
  11. //定义单链表
  12. typedef struct LNode
  13. {
  14. Book data;
  15. struct LNode *next;
  16. }LNode,*LinkList;
  17. //初始化
  18. void InitLNode(struct LNode*L)
  19. {
  20. L=(LNode*)malloc(sizeof(LNode));
  21. if (!L)
  22. {
  23. printf("分配空间出错,初始化失败!");
  24. exit(1);
  25. }
  26. L->next=NULL;
  27. }
  28. //头插法,创建单链表
  29. LNode* creatList(void)
  30. {
  31. LNode *head;
  32. LNode *s;
  33. LNode *p;
  34. Book c;
  35. head=(LNode*)malloc(sizeof(LNode));
  36. p=head;
  37. p->next=NULL;
  38. printf("请输入新节点的数据,当最后输入的值小于等于0时建表完成,该值不接入链表\n");
  39. scanf("%s%s%f",&c.name,&c.code,&c.price);
  40. while (c.price>0)
  41. {
  42. s=(LNode*)malloc(sizeof(LNode));
  43. s->next=p->next;
  44. p->next=s;
  45. s->data=c;
  46. printf("请输入书名,编码和价格:\n");
  47. scanf("%s%s%f",&c.name,&c.code,&c.price);
  48. }
  49. printf("creatList函数执行,创建链表成功\n");
  50. return head;
  51. }
  52. //单链表的长度
  53. int length(struct LNode *L)
  54. {
  55. int i=0;
  56. LNode *p;
  57. p=L;
  58. while (p->next!=NULL)
  59. {
  60. i++;
  61. p=p->next;
  62. }
  63. return i;
  64. }
  65. //单链表的插入
  66. LNode* insertheadList(struct LNode* L,int i,Book b)
  67. {
  68. LNode *s,*p;
  69. p=L;
  70. int j=0;
  71. if (i<=0)
  72. {
  73. printf("插入越界!\n");
  74. exit(1);
  75. }
  76. while (p->next!=NULL)
  77. {
  78. if (j==i-1)
  79. {
  80. s=(LNode*)malloc(sizeof(LNode));
  81. s->data=b;
  82. s->next=p->next;
  83. p->next=s;
  84. printf("inserheadList函数执行,在第%d个位置插入了元素\n",j+1);
  85. break;
  86. }
  87. p=p->next;
  88. j++;
  89. }
  90. return L;
  91. }
  92. //单链表查询
  93. Book search(struct LNode*L,int i)
  94. {
  95. int j;
  96. Book b;
  97. LNode *p;
  98. p=L;
  99. if (i<0)
  100. {
  101. printf("查询的节点越界了!");
  102. exit(1);
  103. }
  104. j=1;
  105. while (p->next!=NULL)
  106. {
  107. p=p->next;
  108. if (j==i)
  109. {
  110. b=p->data;
  111. break;
  112. }
  113. j++;
  114. }
  115. return b;
  116. }
  117. //单链表的删除
  118. Book DelList(struct LNode*L,int i)
  119. {
  120. Book b;
  121. LNode *s,*p;
  122. p=L;
  123. int j;
  124. if (i<1)
  125. {
  126. printf("删除越界!\n");
  127. exit(1);
  128. }
  129. j=0;
  130. while (p->next!=NULL)
  131. {
  132. if (j==i-1)
  133. {
  134. s=p->next;
  135. b=s->data;
  136. p->next=s->next;
  137. // printf("删除第%d个节点成功,删除的值为:name:%s,code:%s,price:%d\n",b.name,b.code,b.price);
  138. free(s);
  139. }
  140. p=p->next;
  141. j++;
  142. }
  143. return b;
  144. }
  145. //清空单链表
  146. void ClearList(struct LNode*L)
  147. {
  148. LNode *p,*r;
  149. p=L;
  150. while (p)
  151. {
  152. p=p->next;
  153. r=p;
  154. free(p);
  155. p=r;
  156. }
  157. L->next=NULL;
  158. }
  159. //销毁单链表
  160. void DestroyList(struct LNode*L)
  161. {
  162. LNode *p,*head;
  163. head=L;
  164. while (head)
  165. {
  166. p=head->next;
  167. free(head);
  168. head=p;
  169. }
  170. }
  171. void main()
  172. {
  173. LNode L,*Q;
  174. Book b;
  175. int i;
  176. Q=&L;
  177. InitLNode(&L);
  178. L=*creatList();
  179. printf("请输入书本的name,code和price:\n");
  180. scanf("%s%s%f",&b.name,&b.code,&b.price);
  181. insertheadList(&L,1,b);
  182. int y=length(&L);
  183. printf("单链表的length:%d\n",y);
  184. //删除第一个元素
  185. Book bo= DelList(Q,1);
  186. printf("删除了第1个元素,它的name:%s,code:%s,price:%f\n",bo.name,bo.code,bo.price);
  187. ClearList(Q);
  188. printf("清空单链表成功!\n");
  189. //按链表的存储顺序输出
  190. i=1;
  191. while (Q->next!=NULL)
  192. {
  193. Book book=search(&L,i);
  194. Q=Q->next;
  195. printf("name:%s,code:%s,price:%f\n",Q->data.name,Q->data.code,Q->data.price);
  196. i++;
  197. }
  198. }

版权声明:本文为glory-yl原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/glory-yl/p/14618696.html