链表中的指针
Pointers in linked lists
我目前正在研究列表(试图重新创建它们),遇到了一个奇怪的问题。这是我的结构:
struct listNode{
listNode(int n, listNode* ne = NULL){
value = n;
next = ne;
}
int value;
listNode* next;
};
listNode* head = NULL;
现在我做了一个函数,在底部添加一个元素:
void add(int n){
if(head == NULL){
head = new listNode(n);
return;
}
listNode* n1 = head;
while(n1 != NULL){ //Should be: while(n1->next != NULL){
n1 = n1->next;
}
n1 = new listNode(n); //Should be: n1->next = new listNode(n);
}
但这并没有增加任何元素。现在,我已经找到了解决方案(见上面的评论),我的问题是我不明白为什么我的第一个函数不起作用
我将用一个方案来解释我所理解的内容:
开始
HEAD=空;
我加1
HEAD=[1,空];
我添加了2
while循环到达最后一个元素(其中"next"为NULL),并在其中创建新元素
HEAD=[1,new listNode(2)]
结果
HEAD=[1,POINTER][2,NULL];
现在,为什么while循环后的n1
不是我希望的样子?
你可以这样想:无论你过去在while
循环中做什么,while循环的条件是,只有当n1
变成null
时,循环才会终止。因此,保证循环后n1
的值为null
。
但是,while循环之后的n1
值是不相关的,因为在while循环后没有使用它。
另一方面,您的最后一条指令是n1 = new listNode(n);
,所以您创建了一个新的listNode,并将其分配给n1
,然后您离开函数,就永远忘记了它。(所以,新节点被泄露了。)
函数不起作用,因为n1
是函数的局部变量。变量的任何更改都不会影响列表的其他节点。
您应该更改列表的原始节点。该功能可以通过以下方式编写
void add( int value )
{
listNode **node = &head;
while ( *node ) node = &( *node )->next;
*node = new listNode( value );
}
在这种情况下,因为变量node
指向列表的实际字段,所以它确实会更改它们。
Is很简单,
while(n1 != NULL){
n1 = n1->next;
}
// n1 here is null
// head here is [1, NULL]
n1 = new listNode(n);
// n1 here is something
// head here is [1, NULL]
因此,除非您将前一个元素的下一个指针指向新元素,否则它将无法在
相关文章:
- C++,指针数组,指向双链表中的条目
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 链表指针问题
- 将链表转换为指针数组时出错
- 如何实现容纳整数和无效指针的双向链表?
- 创建一个棋盘格或"Interweave"两个链接列表。IE 更改两个链表的指针
- 为什么我在空指针错误(链表)中获取成员访问权限
- 链表删除功能的单指针 // 是可能的
- 如何深度复制链表对象指针
- 链表 - 使用后面的指针在末尾插入
- 链表和指针在C++中的点
- 未分配被释放的指针(将堆栈实现为链表时)
- 使用双指针和递归反转链表
- 使用函数引用指向节点的指针删除链表中的节点?
- 使用 XOR 操作仅使用 2 个指针反转链表
- 如果我们不创建一个新节点并使用指针插入数据并建立链接(在链表中)怎么办?
- 指针永远不会在链表深层复制构造函数中达到 null
- 链表指针赋值为什么我们不能直接将尾巴分配给 temp 而不是尾巴>尾巴下一个
- 如何从文件读取到动态分配的指向结构的指针链表中?
- C++指针链表