【问题标题】:Error in printing common elements of two linked lists打印两个链表的公共元素时出错
【发布时间】:2015-03-26 11:13:35
【问题描述】:

我正在尝试打印两个链表中的共同元素,但我的函数只打印第一个元素(如果它是共同的)

  void common()
    {

//head和head1分别是第一个和第二个列表的头指针

      node1 *ptr=head;
      node2 *ptr2=head1;
      while(ptr!=NULL||ptr2!=NULL)
      {
          while(ptr!=NULL&&ptr2!=NULL)
          {
         if(ptr->info==ptr2->info)
            {
             printf("Common Elements are-%d\n",ptr2->info);
             ptr2=ptr2->next;
            }
          }
      ptr=ptr->next;
      ptr2=head1;


     }
  }

【问题讨论】:

    标签: c data-structures linked-list


    【解决方案1】:

    您需要将ptr2 节点的增量移出if 条件。

    ptr2->info的值是否与ptr->info的值匹配不是ptr2移动到下一个节点的决定条件。所以,你必须无条件地移动到下一个节点。

    类似

    while(ptr!=NULL&&ptr2!=NULL)
          {
         if(ptr->info==ptr2->info)
            {
             printf("Common Elements are-%d\n",ptr2->info);
            }
          ptr2=ptr2->next;   //move to next node unconditionally.
          }
    

    应该做的工作。

    此外,正如 @Gopi 所建议的,您可以摆脱代码中的冗余检查。 外层 while 可以检查ptr 的非空值,而内层 while 可以检查非空值ptr2

    【讨论】:

    • 现在它可以工作了,但是在给出正确的输出后崩溃了,你能告诉我你是如何得出这个结论的吗
    • @Gopi 这应该不会引起任何问题,但是是的,这是一个很好的建议。我已经更新了我的答案。 :-)
    • @SouravGhosh 此外,由于您没有移动指针ptr,因此逻辑永远不会检查链表中的所有元素,不是吗?好的,我认为您的意思是其余代码保持原样应该没问题
    • @LEONARDO 这可能来自代码的其他部分。你能用gdb找出确切的攻击指令吗?
    • @SouravGhosh- 代码正在工作,现在在更改冗余检查后甚至不会崩溃,尽管我不怎么使用调试器..)
    【解决方案2】:

    删除ptr2=head1 行,使用此行,您每次都将ptr2 重新分配给head1 的第一个值。

    所以每次都比较同一个链表节点。

    【讨论】:

      【解决方案3】:

      检查以下代码:

        while(ptr!=NULL)
        {
            ptr2 = head1;
            while(ptr2!=NULL)
            {
              if(ptr->info==ptr2->info)
              {
               printf("Common Elements are-%d\n",ptr2->info);
              }
              ptr2=ptr2->next;
            }
           ptr=ptr->next;
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-05
        • 2019-01-19
        • 2012-12-07
        • 1970-01-01
        • 2023-01-17
        • 1970-01-01
        • 2021-06-28
        • 1970-01-01
        相关资源
        最近更新 更多