如何识别C ++中的链表功能的含义

时间:2019-01-02 15:59:02

标签: c++ list linked-list

我目前停留在某些函数上,这些函数在用c ++结构构造的单个链表上运行。

我应该找出这些函数的功能而不进行编译,但是我似乎无法完全理解其功能背后的理论,因为我的猜测都是通用的。

是否有办法仅通过查看它们来猜测这些功能存在的原因?他们做什么?

此外,如果la =(2,3,4,4,5,1,6)和lb =(3,4,5)如果我叫q(la,lb)会发生什么?

bool u(List l, int x) {
  if (l=nullptr) return false;
  if (l->info == x) return true;
  return u(l->next, x);
}

void v(List& l, int x) {
  List tmp = new (cell);
  tmp->info = x;
  tmp -> next = l;
  l = tmp;
}

List q(List l1, List l2) {
  List aux = nullptr;
  while (l1!=nullptr) {
    if (!u(l2,l1->info)) v(aux,l1->info);
    l1=l1->next;
  }
  return aux;
}

3 个答案:

答案 0 :(得分:2)

您可以从声明中合理猜测这些函数可以做什么。

bool (List, int)

获取一个列表和一个元素,并返回一个真/假答案。一个直接的猜测是“此列表是否包含此元素”。然后,我们看一下定义(*),看到空列表为false,以x开头的列表为true,否则我们看一下答案的结尾。因此我们的猜测是正确的。

void (List&, int)

获取列表引用和元素,但不返回任何内容。立即猜测是它将元素添加到列表中的某个位置。查看其定义,我们看到分配了一个新节点,并将其初始化为元素,并使其成为已修改列表的头部。同样,我们的猜测有助于准确地确定其作用。

List (List, List)

获取两个列表并返回一个列表。立即猜测是它将两个列表结合在一起。而且我们看到它基本上是这样做的,但是只添加了第二个列表中不存在的值。

(*)并修复了将nullptr分配给u而不是进行比较的不确定行为。

答案 1 :(得分:0)

函数

bool u(List l, int x)

检查列表l在字段x中是否包含值info。函数

void v(List& l, int x)

将值x附加到列表l。功能

List q(List l1, List l2)

检查列表l1中的每个值是否也是列表l2的元素。如果该值是列表l2的元素,则该值将附加到列表aux。返回列表aux

代码中有一些错误。线

if (l=nullptr) return false;

不比较而是分配。 aux是指向列表最后一个元素而不是开头的指针。

答案 2 :(得分:0)

让我们从第一个功能开始

bool u(List l, int x) {
    if (l == nullptr) return false;  // corrected: it should be '==' not '='
    if (l->info == x) return true;
    return u(l->next, x);
}

关键是要了解List的可能类型。从链接列表的经验和代码来看,似乎我们有类似的东西

struct Node
{
    Node*next;
    int  info;
};

typedef Node *List;

因此,u()需要一个List l和一个值x。如果以l为首的列表为空(l==nullptr),则返回false。否则,如果节点信息等于x,则返回true。否则,它将以l代替l->next进行递归调用。

因此,u(l,x)将在且仅当链表中至少有一个节点包含值为x的{​​{1}}时返回true。此功能更合适的名称是info,实现较为简单

contains()

您现在可以使用相同的逻辑来查找其他功能的含义。