我想知道setcdr
,setcar
,cdr
和car
之间的差异。我知道car
指的是节点的值,而cdr
函数指的是节点中的下一个指针,但我不明白这些差异。
setcdr
功能:
void setcdr( Node* p, Node* q ) {
assert (p != nullptr);
p->next = q;
}
是void
,那么如何设置链表呢?它不应该返回Node
吗?
//returns the data field of the Node
// if p is the nullptr, we cannot get its data ...exit abruptly
int car( Node* p ) {
assert (p != nullptr);
return( p->value );
}
// returns the next field of the Node
// if p is the nullptr, we cannot get its next.... exit abruptly
Node* cdr( Node* p ) {
assert (p != nullptr);
return( p->next );
}
void setcar( Node* p, int x ) {
assert (p != nullptr);
p->value = x;
}
答案 0 :(得分:5)
条款car
和cdr
来自LISP(请参阅Wikipedia entry)。它们在这种情况下的使用可能是指构建链表的一种特殊方式:
car
和cdr
。car
部分指向节点的内容,cdr
部分指向列表中的下一个节点。cdr
部分设置为NULL
或其等价物。使用这种方法,函数setcdr
将修改 现有节点的cdr
块(即设置节点指向下一个节点的指针)列表中的节点),所以没有什么可以返回的。
应该有办法创建新的Node
,但它不会使用您在帖子中提到的任何功能。