22.png

    1. /*
    2. 在带头结点的单链表L中,删除所有值为X的节点,并释放其空间,假设值为X的节点不唯一
    3. 分析:
    4. 和上题相似,只是多了一个头结点。
    5. */
    6. struct Link {
    7. int data;
    8. struct Link *next;
    9. };
    10. #define _CRT_SECURE_NO_WARNINGS
    11. #include <stdio.h>
    12. #include <stdlib.h>
    13. void deleteX(Link *p,int delNum) {
    14. /*struct Link* q;//这是递归方法
    15. if (p == NULL) return;
    16. if (p->data==delNum) {
    17. q = p;
    18. p = p->next;
    19. free(q);
    20. deleteX(p,delNum);
    21. }
    22. else {
    23. deleteX(p->next, delNum);
    24. }*/
    25. //不采取递归,直接遍历
    26. struct Link *pre = p, *q = p->next,*r;
    27. while (q) {
    28. if (q->data==delNum) {
    29. r = q;//r指向待删除节点
    30. q = q->next;//
    31. pre->next = q;//删除节点
    32. free(r);//释放节点
    33. }
    34. else {
    35. pre = q;
    36. q = q->next;
    37. }
    38. }
    39. }
    40. int main() {
    41. //创建节点
    42. struct Link *head = (struct Link*)malloc(sizeof(struct Link));
    43. struct Link *q = (struct Link*)malloc(sizeof(struct Link));
    44. q = head;
    45. head->next = NULL;
    46. int n,data,delNum;
    47. printf("请输入节点个数:");
    48. scanf("%d",&n);
    49. for (int i = 0; i < n;i++) {
    50. printf("请输入第%d个节点值:",i+1);
    51. struct Link *p = (struct Link*)malloc(sizeof(struct Link));
    52. scanf("%d",&data);
    53. p->data = data;
    54. head->next = p;
    55. head = p;
    56. }
    57. head->next = NULL;//这里要将指针的next指向NULL,不然后面的判断会出问题,而且这也是应该养成的好习惯
    58. head = q;//head回到头结点
    59. printf("当前链表值为:");
    60. while (head->next) {
    61. printf("%d ",head->next->data);
    62. head = head->next;
    63. }
    64. printf("\n");
    65. printf("请输入要删除的值:");
    66. scanf("%d",&delNum);
    67. head = q;//head回到头结点
    68. deleteX(head,delNum);
    69. printf("删除后链表值为:");
    70. while (head->next) {
    71. printf("%d ", head->next->data);
    72. head = head->next;
    73. }
    74. return 0;
    75. }