了解链接列表中的cdr和car差异

use*_*817 1 c++ pointers

我想知道之间的区别setcdr,setcar,cdrcar.我知道car是指节点的值,而cdr函数是指节点中的下一个指针,但我不明白这些差异.

setcdr函数:

void setcdr( Node* p, Node* q ) {

    assert (p != nullptr);
    p->next = q;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

god*_*el9 6

条款carcdr来自LISP(参见维基百科条目).它们在这种情况下的使用可能是指构建链表的一种特殊方式:

  1. 每个节点都有两个部分,carcdr.
  2. car部分指向节点的内容,并且该cdr部分指向列表中的下一个节点.
  3. cdr列表中最后一个节点的片段设置为NULL或等效.

使用这种方法,该函数setcdr修改cdr片的的现有节点(即设置一个节点的指针到列表中的下一个节点),所以没有什么返回.

应该有一种方法来创建一个新的Node,但它不会使用你在帖子中提到的任何功能.