张大同AA 2016-07-21 11:04 采纳率: 60%
浏览 2992
已采纳

我不是很懂这个合并两个单向链表,大家能不能给我每行注释下,

void merge_link(link_list A,link_list B)
{
link_list h,p,q;
p = A->next;
q = B->next;
free(B);
h = A;
while( p && q )
{
if(p->data <= q->data )
{
h->next = p;h = p;p = p->next;
}
else { h->next = q ; h = q ; q = q->next;}
}
if(p == NULL)p = q;
h->next = p;

}

  • 写回答

2条回答 默认 最新

  • threenewbee 2016-07-21 11:32
    关注
     这段代码的目的是,合并两个有序的链表,保持合并后的链表还是有序,所以才写了这么多代码,如果仅仅是合并,只要把第二个链表头添加到第一个链表尾就可以了。
    
    void merge_link(link_list A,link_list B)
    {
    link_list h,p,q;
    p = A->next; //p表示第一个链表的当前节点
    q = B->next; //q表示第二个链表的当前节点
    free(B);
    h = A; // h表示新链表的当前节点
    while( p && q ) //循环,直到两个链表都遍历结束
    {
    if(p->data <= q->data ) //如果q的当前节点大
    {
    h->next = p;h = p;p = p->next; //把p插入到h的后面;h指向p,也就是新链表当前的最后一个节点;p往后移动一个
    }
    else { h->next = q ; h = q ; q = q->next;} //把q插入到h的后面;h指向q,也就是新链表当前的最后一个节点;q往后移动一个
    }
    if(p == NULL)p = q; //如果p已经遍历结束了
    h->next = p; //直接把q插入,不需要再判断了
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 蓝牙耳机怎么查看日志
  • ¥15 Fluent齿轮搅油
  • ¥15 八爪鱼爬数据为什么自己停了
  • ¥15 交替优化波束形成和ris反射角使保密速率最大化
  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏