当前位置:   article > 正文

单链表的操作(二)链表的插入与删除_删除非空单链表的表尾元素

删除非空单链表的表尾元素

一、单链表的结点插入

(1)插入的结点位于空链表

(2)插入的结点位于非空链表

  1.     插入的链表位于非空链表的头部
  2.     插入的链表为与非空链表的尾部
  3.     插入的链表位于非空链表的中间部分

创建一个单链表结点的插入函数,将输入的学生的序号作为排序,按照从小到大的学号顺序插入学生信息

  1. struct student *insert(struct student *head,struct student *new) /*定义插入节点函数 */
  2. {
  3. struct student *p1,*p2,*pnew;
  4. p1 = p2 = head;
  5. pnew = new;
  6. if(head == NULL){
  7. head = pnew ;
  8. pnew->next = NULL;
  9. }
  10. else{
  11. while((pnew->number > p1->number) && (p1->next !=NULL)){
  12. p2 = p1; /* 不断移动指针 */
  13. p1 = p1->next;
  14. }
  15. if(pnew->number <= p1->number){ /*按照从小到大的学号排序 */
  16. if(p1 == head) /*判断插入位置是否是非空离链表的表头 */
  17. { pnew->next = p1; head = pnew; }
  18. else /*插入位置位于链表中间*/
  19. {p2->next = pnew; pnew->next = p1;}
  20. }else{ /*插入位置位于链表的尾部 */
  21. p1->next = pnew;
  22. pnew = NULL ;
  23. }
  24. }
  25. return (head);
  26. }

 

二、单链表的结点删除

(1)判断要删除的链表是否为空链表

(2)判断要删除的结点是位于链表的表头、中间还是表尾。

创建一个函数用于删除学生的信息,判断学号位于链表中的哪个位置,然后进行删除

  1. (struct student *)delete(struct student *head,int number) /* 删除链表结点的函数 */
  2. {
  3. struct student *p1,*p2;
  4. p1 = p2 = head;
  5. if(p1 == NULL){
  6. printf("the list is empty\n"); /*输入的链表为空链表 */
  7. }else
  8. {
  9. while((number != p1->number) && (p1->next != NULL)){
  10. p2 = p1;
  11. p1 = p1->next; /*不断移动指针,判断指向的结点是否为想要的结点 */
  12. }
  13. if((number == p1->number)) {
  14. if(p1 == head ){
  15. head = p1->next; /* 要删除的结点位于表头 */
  16. }else{
  17. p2->next = p1->next; /* 要删除的结点位于中间或者表尾 */
  18. }
  19. }else{
  20. printf("Don't have find the number\n"); /*没有找到要删除的结点 */
  21. }
  22. }
  23. return (head);
  24. }

综合实例:完成学生信息的写入,删除,排序,显示

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. /*定义链表结构内容*/
  5. struct student
  6. {
  7. char name[10];
  8. long int number;
  9. struct student *next;
  10. };
  11. void putout(struct student *head);/*輸出链表中的内容*/
  12. struct student *delete(struct student *head); /* 删除链表结点的函数 */
  13. struct student *insert(struct student *head); /*定义插入节点函数 */
  14. int get_line(char *cmd);
  15. int main()
  16. {
  17. struct student *head;
  18. char buf[20];
  19. head = NULL;
  20. system("clear");
  21. while(1){
  22. // system("clear");
  23. printf("\n========================================\n\t\t学生信息功能表\n");
  24. printf(" [1]查看学生信息\n");
  25. printf(" [2]输入学生信息\n");
  26. printf(" [3]删除学生信息\n");
  27. printf("========================================\n\n");
  28. printf("请输入命令:");
  29. fflush(stdout);
  30. scanf("%s",buf) ;
  31. // get_line(buf);
  32. switch(buf[0]){
  33. case '1' :
  34. putout(head);break;
  35. case '2' :
  36. head = insert(head);break;
  37. case '3' :
  38. head = delete(head);break;
  39. default :
  40. printf("输入错误\n");break;
  41. }
  42. }
  43. return 0;
  44. }
  45. int get_line(char *cmd)
  46. {
  47. int i=0;
  48. char temp;
  49. memset(cmd,0,sizeof(cmd));
  50. while (1) {
  51. temp = getchar();
  52. cmd[i]=temp;
  53. if(cmd[i]==13 || cmd[i] == 10){
  54. cmd[i]=0;
  55. break;
  56. }
  57. fflush(stdout);
  58. i++;
  59. }
  60. return 0;
  61. }
  62. struct student *insert(struct student *head) /*定义插入节点函数 */
  63. {
  64. struct student *p1,*p2,*pnew;
  65. p1 = p2 = head;
  66. pnew = (struct student *)malloc(sizeof(struct student ));
  67. printf("请输入学生打姓名、学号,输入学号0则结束\n");
  68. scanf("%s%ld",pnew->name,&pnew->number);
  69. while(pnew->number >0){
  70. if(head == NULL){
  71. head = pnew ;
  72. pnew->next = NULL;
  73. }
  74. else{
  75. while((pnew->number > p1->number) && (p1->next !=NULL)){
  76. p2 = p1; /* 不断移动指针 */
  77. p1 = p1->next;
  78. }
  79. if(pnew->number <= p1->number){ /*按照从小到大的学号排序 */
  80. if(p1 == head) /*判断插入位置是否是非空离链表的表头 */
  81. { pnew->next = p1; head = pnew; }
  82. else /*插入位置位于链表中间*/
  83. { p2->next = pnew; pnew->next = p1;}
  84. }else{ /*插入位置位于链表的尾部 */
  85. p1->next = pnew;
  86. pnew = NULL ;
  87. }
  88. }
  89. pnew = (struct student *)malloc(sizeof(struct student ));
  90. printf("请输入学生打姓名、学号,输入学号0则结束\n");
  91. scanf("%s%ld",pnew->name,&pnew->number);
  92. p2 = p1 = head;
  93. }
  94. free(pnew);
  95. return (head);
  96. }
  97. struct student *delete(struct student *head) /* 删除链表结点的函数 */
  98. {
  99. struct student *p1,*p2;
  100. int number;
  101. p1 = p2 = head;
  102. printf("please input the student nember\n");
  103. scanf("%d",&number);
  104. if(p1 == NULL){
  105. printf("the list is empty\n"); /*输入的链表为空链表 */
  106. }else
  107. {
  108. while((number != p1->number) && (p1->next != NULL)){
  109. p2 = p1;
  110. p1 = p1->next; /*不断移动指针,判断指向的结点是否为想要的结点 */
  111. }
  112. if((number == p1->number)) {
  113. if(p1 == head ){
  114. head = p1->next; /* 要删除的结点位于表头 */
  115. }else{
  116. p2->next = p1->next; /* 要删除的结点位于中间或者表尾 */
  117. }
  118. }else{
  119. printf("Don't have find the number\n"); /*没有找到要删除的结点 */
  120. }
  121. }
  122. return (head);
  123. }
  124. /*輸出链表中的内容*/
  125. void putout(struct student *head)
  126. {
  127. if(head == NULL) printf("暂无学生信息\n");
  128. while(head!=NULL)
  129. {
  130. printf("name:%s\t number:%ld\n",head->name,head->number);
  131. head = head->next;
  132. }
  133. }

 

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

闽ICP备14008679号