永发信息网

C语言链表的问题

答案:2  悬赏:0  手机版
解决时间 2021-08-11 07:47
  • 提问者网友:人生佛魔见
  • 2021-08-10 17:38

struct pp *insert(struct pp *b,struct pp *c,int m)
    {
       struct pp *s1,*s2,*s3,*s4;
       int i;
 if(m<=0||m>n) return NULL;
 else
  {
     s1=s4=b;
     s3=c;
        if(b==NULL)
   {
     b=s3;s3->next=NULL;}
      for(i=1;i<m;i++)
        s4=s4->next;
      while((s4->num!=s1->num)&&s1->next!=NULL)
       {
  s2=s1;
  s1=s1->next;
       }
       if(s4->num==s1->num)
        {
   if(s1==b)
    {   b=s3;
      s3->next=s1;
     }
   else
     {
        s2->next=s3;
        s3->next=s1;

     }
     n=n+1;
   }

 free( s1);free(s4);s1=s4=NULL;   return b;
     } 运行的时候通过没问题 就是结果不对 但不释放s1跟s4就没问题;

插入的程序为什么不能释放s1跟s4 都是工具指针 而删除的程序运行没问题

 

删除的程序

 

    struct pp *delete(struct pp *k,int m)
 {
   struct pp *s1,*s2,*s3;
       int i;
    if(k==NULL)
     return NULL;
    s1=s3=k;
     for(i=0;i<m-1;i++)
      s3=s3->next;
     while(s3->num!=s1->num&&s1->next!=NULL)
      {
       s2=s1;
       s1=s1->next;
      }
       if(s3->num==s1->num)
        {
  if(s1==k)
  {

   s1=s1->next;
   k=s1;
     }
  else
   {
    s2->next=s1->next;
      if(s1->next==NULL)
       s2->next=NULL;
     }
    n=n-1;
      printf("delete the number %d data:\n",m);
  }

       else
  printf("no found\n");

       free(s1);free(s3);s1=NULL;s3=NULL;
     return k;
   }    我不是根据内容来插入删除的, 根据节点的号码来

 

求高手赐教

 

最佳答案
  • 五星知识达人网友:执傲
  • 2021-08-10 18:40

显然错误在于释放s1\s4上,你确定s1、s4仅仅只是工具指针吗?s1、s4中是否和s3指向同一个内存呢?这种问题调试一下就很快可以看出来了。还有不太明白s1、s4是动态生成的变量吗,是存储在堆中吗?需要你主动去释放吗?能主动释放吗?相信同志肯定不是很清楚。可以设置断点后单步运行,看看s1、s4具体变化;要学会自己思考,提示完毕!!

全部回答
  • 1楼网友:忘川信使
  • 2021-08-10 18:48

如果把新插入的节点free了,那链表不是就断了吗?

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯