很难理解这个节点是如何创建的,你能否逐步写出这组代码实际在做什么,以及它们代表什么动作?
void list::create_node(int value)
{
struct node *temp;// Please write in words the meaning of this statement
temp = new(struct node);// is this a dynamic node? )
temp->info = value;// is this value being assigned to this node?
if (last == NULL)// what is this set of code testing??
{
last = temp;// who is this last; the node which has been created?
temp->next = last; // is the node pointing to itself being only one node?
}
else
{
temp->next = last->next;((( // What is this statement saying?
last->next = temp;// What is this statement saying?
last = temp;// What is this statement saying?
}
}
答案 0 :(得分:2)
void list::create_node(int value)
{
上面的行声明了一个函数,该函数创建具有给定值的节点并将该节点插入列表中。必须检查代码以查看新节点的插入位置。
struct node *temp;
声明指向节点的指针。尚未分配内存,只有稍后将使用的指针。
temp = new(struct node);
从动态(运行时)内存区域(a.k.a. heap)为节点分配内存。如果存在构造函数,则调用node
结构的构造函数来初始化内存。
指针temp
现在指向node
对象。
temp->info = value;
这会将value
分配给数据字段info
。需要声明struct node
以确认此猜测。
if (last == NULL)
{
假设last
是指针并指向最后一个节点,则此检查将查找空列表。常见的实现是将指针值设置为null以标记列表的结尾。
last = temp;
temp->next = last;
}
上面的代码将新node
作为最后一个节点插入。 last
指针允许快速访问列表的末尾。这允许反向迭代,而不必遍历所有链接以找到最后一个节点。
某些实现将next
字段设置为null以指示列表的结尾,其他类似于此字段,使其指向最后一个节点。
else
{
temp->next = last->next;
此时,列表不为空 使新节点指向最后一个节点指向的同一节点 通过绘制指向节点的节点框和箭头可以最好地理解这一点。
last->next = temp;
更新最后一个节点以指向自身。见上一节。
last = temp;
更新指向最后一个(列表结尾)节点的指针以指向新节点。 } }
我建议您绘制链接列表并多次浏览此算法以查看其工作原理。另请查看单链表数据类型。
最后一个节点的循环引用可能会让您感到困惑。这可能不是大多数书籍描述的标准实现,但它是有效的。