我目前停留在某些函数上,这些函数在用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;
}
答案 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()
您现在可以使用相同的逻辑来查找其他功能的含义。