免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9028 | 回复: 10
打印 上一主题 下一主题

链表删除重复数据的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-21 01:33 |只看该作者 |倒序浏览
void  Delete_Node_value(LNode *L)
/*  删除以L为头结点的单链表中所有值相同的结点  */
{     LNode *p=L->next, *q, *ptr;
while  ( p!=NULL)   /*  检查链表中所有结点  */ {   *q=p, *ptr=p–>next;
/*  检查结点p的所有后继结点ptr  */
while (ptr!=NULL)
     {  if (ptr–>data==p->data)
            {  q->next=ptr->next;  free(ptr);  
                ptr=q->next;  }
        else  {  q=ptr;  ptr=ptr–>next;   }
     }
以上代码可行

void  Delete_Node_value(LNode *L)
/*  删除以L为头结点的单链表中所有值相同的结点  */
{     LNode *p=L->next, *q, *ptr;
while  ( p->next!=NULL)   /*  检查链表中所有结点  */ {   *q=p, *ptr=p–>next;
/*  检查结点p的所有后继结点ptr  */
while (ptr!=NULL)
     {  if (ptr–>data==p->data)
            {  q->next=ptr->next;  free(ptr);  
                ptr=q->next;  }
        else  {  q=ptr;  ptr=ptr–>next;   }
     }
以上代码为什么不行呢?

论坛徽章:
0
2 [报告]
发表于 2010-11-21 01:36 |只看该作者
1) sort
2) unique

论坛徽章:
0
3 [报告]
发表于 2010-11-21 01:50 |只看该作者
原始代码:
  1. int list_delete_all_duplicate(LNode *head)
  2. {if(head==NULL)
  3. return -1;
  4. LNode *p,*q,*s;
  5. p=head->next;
  6. [color=Red]while(p->next!=NULL))[/color]
  7. {s=p;
  8. q=p->next;
  9. while(q!=NULL)
  10. {if(q->value==p->value)
  11. {s->next=q->next;
  12. free(q);
  13. q=s->next;
  14. }
  15. else
  16. {s=q;
  17. q=q->next;
  18. }
  19. }
  20. p=p->next;
  21. }
  22. return 0;
  23. }
复制代码
GCC编译报错:segmentation fault

论坛徽章:
0
4 [报告]
发表于 2010-11-21 01:52 |只看该作者
回复 2# fallening


   我的逻辑就是省掉最后一个节点的判断,可编译为什么报错呢?

论坛徽章:
0
5 [报告]
发表于 2010-11-22 08:07 |只看该作者
再次请教~

论坛徽章:
0
6 [报告]
发表于 2010-11-22 12:04 |只看该作者
你这个链表有没有可能就是空的,头结点指针就是NULL?

论坛徽章:
0
7 [报告]
发表于 2010-11-22 12:40 |只看该作者
原始代码:GCC编译报错:segmentation fault
Anno_Domini 发表于 2010-11-21 01:50



    这个不叫编译报错,叫运行错误吧。

论坛徽章:
0
8 [报告]
发表于 2010-11-22 12:45 |只看该作者
gdb 调试一下吧,该有的判断还是要有的,p != NULL

论坛徽章:
0
9 [报告]
发表于 2010-11-22 12:58 |只看该作者
回复 3# Anno_Domini


    外循环里面最后一个p=p->next以后当p=Null的时候再来判断p->next就会segmentfault

论坛徽章:
0
10 [报告]
发表于 2010-11-22 13:05 |只看该作者
本帖最后由 redice 于 2010-11-22 13:07 编辑

  1. int list_delete_all_duplicate(LNode *head)
  2. {
  3.     if(head==NULL)
  4.          return -1;
  5.     LNode *p,*q,*s;
  6.     //p=head->next;  //delete this line
  7.     p = head; // Replace with this line
  8.     while(p->next!=NULL))
  9.     {
  10.         p=p->next; //move the bottom line here
  11.         s=p;
  12.         q=p->next;
  13.         while(q!=NULL)
  14.         {
  15.             if(q->value==p->value)
  16.             {
  17.                 s->next=q->next;
  18.                 free(q);
  19.                 q=s->next;
  20.             }
  21.             else
  22.             {
  23.                 s=q;
  24.                 q=q->next;
  25.             }
  26.         }
  27.         //p=p->next; //move this line to the beginner of while
  28.     }
  29.     return 0;
  30. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP