【问题标题】:Check if list2 contains list1检查 list2 是否包含 list1
【发布时间】:2020-01-09 13:40:27
【问题描述】:

这个函数应该检查 list1 是否包含在列表 2 中,并且在这种情况下返回 1。我不确定为什么我总是得到输出 0。 欢迎所有反馈。

typedef struct node {
  int data;
  struct node *next;
} *list;


int contains (list l1, list l2)
{
  int check;
  while(l1 != NULL){
    check = 0;

    while(l2 != NULL){
      if(l1->data == l2->data)
        check = 1;

      l2 = l2->next;
    }

    if(check == 0)
      return 0;

    l1 = l1->next;
  }
  return 1;
}

【问题讨论】:

  • 您是否使用调试器进行过检查?在检查 l1 的第一个元素之后,您没有将 l2 指针重置为列表的开头。
  • @johnelemans 就是这样!谢谢!

标签: c function struct linked-list singly-linked-list


【解决方案1】:

当找到第一个列表中的节点的值时,您不会中断内部循环。

同样在内部循环中,您不会将第二个列表重新定位到它的开头。

函数可以通过以下方式定义

int contains( list l1, list l2 )
{
    int check = 1;

    for ( ; check && l1 != NULL; l1 = l1->next )
    {
        check = 0;

       for ( link current = l2; !check && current != NULL; current = current->next )
       {
           if ( l1->data == current->data ) check = 1;
       }
    }

    return check;
}

该函数不检查重复值是否存储在第一个列表中。

注意将这样的 typedef 定义为

typedef struct node {
  int data;
  struct node *next;
} *list;

是个坏主意。如果你需要一个指向常量节点的指针,你不能写

const link node;

因为它意味着

struct node * const node;

不是

const struct node *node;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多