| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 943 人关注过本帖
标题:删除第一个节点问题
只看楼主 加入收藏
浅暗花璃
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2016-3-31
结帖率:77.78%
收藏
 问题点数:0 回复次数:3 
删除第一个节点问题
void delate(struct student *head,int n)
  {
      struct student *p,*q,*p1;
      printf("plase input delate student old:");
      scanf("%d",&n);
      p=head;
      while(p->next!=NULL)
      {
           if(head->old==n)
          {
              p1=head;
             head=head->next;
            p=head;
        //    head->next=p->next;
            free(p1);
              break;
          }
          else if(p->next->old==n)
          {
              q=p->next;
              p->next=q->next;
             free(q);
             break;
          }
         
         
       else
           p=p->next;
      
  }
      
}
为什么编译后返回就错了呢,是因为没free吗

[此贴子已经被作者于2016-6-5 16:53编辑过]

搜索更多相关主题的帖子: delate 
2016-06-05 16:51
随风飘荡
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:208
专家分:598
注 册:2011-9-9
收藏
得分:0 
因为在delate?函数里的head实际上是一个按值传递的指针,你在函数里改head不能影响外面的"head"
而且这个逻辑也有点问题,如果只有链表中只有一个人的时候那就什么也不会做了
2016-06-05 17:58
linlulu001
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:20
帖 子:944
专家分:4047
注 册:2016-4-13
收藏
得分:0 
[quote]以下是引用浅暗花璃在2016-6-5 16:51:43的发言:

void delate(struct student *head,int n)//void 改成struct student
  {
      struct student *p,*q,*p1;
      printf("plase input delate student old:");
      scanf("%d",&n);//n是实参传递过来的,是有值,你这里再重新输入是不是有问题。
    /*if(head==NULL)
        {
            printf("空链表\n");
            return head;
            }最好对链表进行判断是否空。*/
      p=q=head;
      while(p->next!=NULL)
      {
        if(head->old==n)
          {
          p1=head;
             head=head->next;
            p=head;
        //    head->next=p->next;

            if(p->old==n)
            {
                if(p==head) head=p->next;
                else q->next=p->next;
              free(p);
              break;
          }
          else if(p->next->old==n)
          {
              q=p->next;
              p->next=q->next;
             free(q);
             break;
          }
         
         
       else
           p=p->next;
      

    q=p;
    p=p->next;
  }
     return head;
}


[此贴子已经被作者于2016-6-5 20:00编辑过]

2016-06-05 19:37
zhulei1978
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:53
帖 子:1351
专家分:1200
注 册:2006-12-17
收藏
得分:0 
void delate(struct student *head,int n)
   {
       struct student *p,*q,*p1;
       printf("plase input delate student old:");
       scanf("%d",&n);//n是输入的话,就不用放在函数形参里了,在函数体里定义就可以了
       p=head;
       while(p->next!=NULL)
       {
            if(head->old==n)
           {
               p1=head;
              head=head->next;
             p=head;
         //    head->next=p->next;
             free(p1);
               break;
           }
           else if(p->next->old==n)
           {
               q=p->next;
               p->next=q->next;
              free(q);
              break;
           }
           
         
        else
            p=p->next;
        
   }
      
 }

其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
2016-06-06 04:33
快速回复:删除第一个节点问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.033464 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved