鱼C论坛

 找回密码
 立即注册
查看: 835|回复: 5

[已解决]这个删除结点的函数为什么在删除链表中所没有的数值时会出错?

[复制链接]
发表于 2021-9-16 22:34:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. //链表的相关操作集
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. typedef struct Node *node;
  5. struct Node{
  6.     int data;
  7.     node next;
  8. };
  9. node CreateList()//构建链表
  10. {
  11.     node head=NULL,tail,p;
  12.     int num;
  13.     scanf("%d",&num);
  14.     if(num==-1)
  15.     {
  16.         return head;
  17.     }
  18.     else
  19.     {
  20.         p=(node)malloc(sizeof(struct Node));
  21.         head = p;
  22.     }
  23.     while(num!=-1)
  24.     {
  25.         tail=p;//步骤一:将尾结点指向新节点
  26.         tail->data = num;//步骤二:给新申请的结点传入数据
  27.         p=(node)malloc(sizeof(struct Node));//步骤三:申请新的结点
  28.         tail->next=p;//步骤四:链接
  29.         scanf("%d",&num);//步骤五:继续读入带传入的数据,通过此数据来判断是否要继续申请下一个结点
  30.     }
  31.     tail->next=NULL;//步骤六:比较容易遗忘的一点,就是让尾结点指向NULL
  32.     return head;
  33. }
  34. void Print(node head)//打印链表中的数据
  35. {
  36.     node p=head;
  37.     while(p!=NULL)
  38.     {
  39.         printf("%4d",p->data);
  40.         p=p->next;
  41.     }
  42.     putchar('\n');
  43. }
  44. void Delete_K(node *phead,int k)//删除带有数值K的结点
  45. {
  46.     node p=*phead,temp=NULL;
  47.     while (p->data!=k&&p!=NULL)//为何这里的就是永真
  48.     {
  49.         temp=p;
  50.         p = p->next;
  51.     }
  52.     if(p->data==k)
  53.     {
  54.         if(p==*phead)
  55.         {
  56.             *phead=p->next;
  57.             free(p);
  58.         }
  59.         else
  60.         {
  61.             temp->next=p->next;
  62.             free(p);
  63.         }
  64.     }
  65.     else
  66.     {
  67.         printf("没有此节点!");
  68.     }
  69. }
  70. void Insert_n_th(node head,int n)//插入到第n个结点之后
  71. {
  72.     node p=head,temp=NULL;
  73.     int cnt=1;
  74.     while(cnt!=n&&p!=NULL)//为何这里的不是永真
  75.     {
  76.         p=p->next;
  77.         cnt++;
  78.     }
  79.     if(p==NULL)
  80.         printf("not found!");
  81.     else
  82.     {
  83.         temp=(node)malloc(sizeof(struct Node));//申请新节点的内存
  84.         scanf("%d",&temp->data);//为新节点传入数据
  85.         temp->next=p->next;
  86.         p->next=temp;
  87.     }
  88. }
  89. int main(int argc,char *argv[])
  90. {
  91.     node head=NULL;
  92.     head=CreateList();
  93.     Print(head);
  94.     int n;
  95.     printf("请输入插入到第几个节点后面:\n");
  96.     scanf("%d",&n);
  97.     Insert_n_th(head,n);
  98.     Print(head);
  99.     int k;
  100.     printf("请输入要删除结点的值:\n");
  101.     scanf("%d",&k);
  102.     Delete_K(&head,k);
  103.     Print(head);
  104.     return 0;

  105. }

复制代码
最佳答案
2021-9-17 12:12:16
donjames 发表于 2021-9-17 11:54
那个怎么解决这个问题

把链表的指针重新返回指向链表的head
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-9-16 22:36:19 | 显示全部楼层
在那个删除结点的函数中,我这个编译器为什么会显示while的循环条件p!=NULL是个永真的条件
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-16 22:56:27 | 显示全部楼层
因为删除的数该链表没有的话,在那个删除的函数里面相当于把链表遍历了一边,如果再接着访问链表,那么就会出错,没有访问权限
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 11:54:40 | 显示全部楼层
Debug007 发表于 2021-9-16 22:56
因为删除的数该链表没有的话,在那个删除的函数里面相当于把链表遍历了一边,如果再接着访问链表,那么就会 ...

那个怎么解决这个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-17 12:12:16 | 显示全部楼层    本楼为最佳答案   
donjames 发表于 2021-9-17 11:54
那个怎么解决这个问题

把链表的指针重新返回指向链表的head
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-17 16:58:32 | 显示全部楼层
多谢大佬,解决了!
  1. //链表的相关操作集
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. typedef struct Node *node;
  5. struct Node{
  6.     int data;
  7.     node next;
  8. };
  9. node CreateList()//构建链表
  10. {
  11.     node head=NULL,tail,p;
  12.     int num;
  13.     scanf("%d",&num);
  14.     if(num==-1)
  15.     {
  16.         return head;
  17.     }
  18.     else
  19.     {
  20.         p=(node)malloc(sizeof(struct Node));
  21.         head = p;
  22.     }
  23.     while(num!=-1)
  24.     {
  25.         tail=p;//步骤一:将尾结点指向新节点
  26.         tail->data = num;//步骤二:给新申请的结点传入数据
  27.         p=(node)malloc(sizeof(struct Node));//步骤三:申请新的结点
  28.         tail->next=p;//步骤四:链接
  29.         scanf("%d",&num);//步骤五:继续读入带传入的数据,通过此数据来判断是否要继续申请下一个结点
  30.     }
  31.     tail->next=NULL;//步骤六:比较容易遗忘的一点,就是让尾结点指向NULL
  32.     return head;
  33. }
  34. void Print(node head)//打印链表中的数据
  35. {
  36.     node p=head;
  37.     while(p!=NULL)
  38.     {
  39.         printf("%4d",p->data);
  40.         p=p->next;
  41.     }
  42.     putchar('\n');
  43. }
  44. node Delete_K(node head,int k)//删除带有数值K的结点,由于要改变传入指针(指向结构体的指针)的值(此情况是特殊情况,当删除的结点是头结点),因此要传入指针的指针来改变指针的值
  45. {
  46.     node p=head,temp=NULL;
  47.     if(p==NULL)
  48.     {
  49.         printf("链表为空\n");
  50.         return NULL;
  51.     }
  52.     while(p!=NULL)
  53.     {
  54.         if(p->data==k)//找到要删除的节点的位置
  55.         {
  56.             if(p==head)//为第一个结点
  57.             {
  58.                 head=p->next;
  59.                 free(p);
  60.                 break;
  61.             }
  62.             else
  63.             {
  64.                 temp->next=p->next;
  65.                 free(p);
  66.                 break;
  67.             }
  68.         }
  69.         temp=p;
  70.         p=p->next;
  71.     }
  72.     if(p!=NULL)
  73.     {
  74.         return head;
  75.     }
  76.     else
  77.     {
  78.         printf("未找到!\n");
  79.         return head;
  80.     }
  81. }
  82. void Insert_n_th(node head,int n)//插入到第n个结点之后
  83. {
  84.     node p=head,temp=NULL;
  85.     int cnt=1;
  86.     while(cnt!=n&&p!=NULL)//为何这里的不是永真
  87.     {
  88.         p=p->next;
  89.         cnt++;
  90.     }
  91.     if(p==NULL)
  92.         printf("not found!");
  93.     else
  94.     {
  95.         temp=(node)malloc(sizeof(struct Node));//申请新节点的内存
  96.         printf("请输入要插入的结点的值:\n");
  97.         scanf("%d",&temp->data);//为新节点传入数据
  98.         temp->next=p->next;
  99.         p->next=temp;
  100.     }
  101. }
  102. int main(int argc,char *argv[])
  103. {
  104.     node head=NULL;
  105.     head=CreateList();
  106.     Print(head);
  107.     int n;
  108.     printf("请输入插入到第几个节点后面:\n");
  109.     scanf("%d",&n);
  110.     Insert_n_th(head,n);
  111.     Print(head);
  112.     int k;
  113.     printf("请输入要删除结点的值:\n");
  114.     scanf("%d",&k);
  115.     head=Delete_K(head,k);
  116.     Print(head);
  117.     return 0;

  118. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 10:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表