21.png

    1. /*
    2. 设计一个递归算法,删除一个不带头结点的单链表中所有值为x的节点
    3. 分析:
    4. 首先我们要创建单链表,并赋值,然后递归去判断值,进行删除
    5. */
    6. #define _CRT_SECURE_NO_WARNINGS
    7. #include <stdio.h>
    8. #include <stdlib.h>
    9. struct Link
    10. {
    11. int value;
    12. struct Link *next;
    13. };
    14. void deleteX(Link *&p, int delNum) {//这里的第一个函数参数必须是引用值,不然会导致断链
    15. struct Link *pre;//定义一个指针,进行删除
    16. if (p == NULL) return;
    17. if (p->value == delNum) {
    18. pre = p;
    19. p = p->next;
    20. free(pre);
    21. deleteX(p, delNum);
    22. }
    23. else
    24. deleteX(p->next, delNum);
    25. }
    26. Link *create() {
    27. struct Link *p, *rear, *head;
    28. head = (struct Link *)malloc(sizeof(struct Link));
    29. rear = (struct Link *)malloc(sizeof(struct Link));
    30. head = NULL;
    31. rear = NULL;
    32. int value;
    33. printf("请输入链表各节点的值,以9999结束:");
    34. scanf("%d", &value);
    35. while (value != 9999) {//依次创建节点
    36. p = (struct Link *)malloc(sizeof(struct Link));//创建一个新的节点
    37. p->value = value;
    38. p->next = NULL;
    39. if (head == NULL) {
    40. rear = p;
    41. head = p;
    42. }
    43. else {
    44. rear->next = p;
    45. rear = p;
    46. }
    47. scanf("%d", &value);
    48. }
    49. rear->next = NULL;
    50. return head;
    51. }
    52. Link *create2() {
    53. struct Link *p, *rear, *head;
    54. head = (struct Link *)malloc(sizeof(struct Link));
    55. head = NULL;
    56. int value;
    57. printf("请输入链表各节点的值,以9999结束:");
    58. scanf("%d", &value);
    59. while (value != 9999) {//依次创建节点
    60. p = (struct Link *)malloc(sizeof(struct Link));
    61. p->value = value;
    62. p->next = NULL;
    63. if (head == NULL) {
    64. head = p;
    65. }
    66. else {
    67. p->next = head->next;
    68. head->next = p;
    69. }
    70. scanf("%d", &value);
    71. }
    72. return head;
    73. }
    74. int main() {
    75. int delNum;
    76. struct Link *head, *q;
    77. head = create();
    78. q = head;
    79. printf("打印链表:");
    80. while (q != NULL) {
    81. printf("%d ", q->value);
    82. q = q->next;
    83. }
    84. q = head;
    85. printf("请输入想要删除的节点的值:");
    86. scanf("%d", &delNum);
    87. deleteX(q, delNum);
    88. printf("删除后链表:");
    89. while (q != NULL) {
    90. printf("%d ", q->value);
    91. q = q->next;
    92. }
    93. return 0;
    94. }