对于在if
声明else
部分这行代码:
head = temp;
你的意图是突变head
,换句话说,改变什么head
指向。但是,指针作为值传入,就像其他变量一样。换句话说,假设我在其他地方调用push
函数。为简单起见,假设我把它在main
功能,像这样:现在
int main()
{
stack *headOfStack = new stack;
// suppose this next push triggers the else portion of the push code
push(headOfStack, 6);
}
,该push(headOfStack, 6);
语句已被执行之后,你的意图是希望headOfStack
指向其中包含一个新的“栈节点”价值6
。现在,headOfStack
是一个指向栈类型变量的指针。它存储一个内存地址。你可以把内存地址想象成一些整数。当我们调用push
,我们复制的内容headOfStack
(的headOfStack
内容是一个内存地址)到局部变量push
功能head
。因此,当:执行
head = temp;
,我们正在分配的temp
的内容head
。什么是temp
?它是指向stack
类型变量的指针。换句话说,temp
的值是一个内存地址。因此head = temp;
只是将temp
中包含的内存地址分配给本地变量head
。函数中的局部变量head
和main
函数中的我们的headOfStack
变量是具有不同存储器地址的两个完全不同的变量变量。如果我的解释到目前为止已清楚,这意味着当我们在push
函数中修改head
时,main
中的headOfStack
变量完全不变。
你想在这种情况下,做的是:
void push(stack **headPtr, int valuee)
{
// this will get the actual pointer we are interested in
stack *head = *headPtr;
if(head->next==NULL && head->value==-1)
{
head->value = valuee;
printf("First element %d inserted\n",valuee);
}
else
{
stack *temp = new stack;
temp->value = valuee;
temp->next = head;
// mutation is done here
*headPtr = temp;
printf("Element %d inserted\n",valuee);
}
}
及其用法,用我们的虚构main
功能:
int main()
{
stack *headOfStack = new stack;
// notice the use of &headOfStack instead of headOfStack
push(&headOfStack, 6);
}
只要记住,指针存储内存地址,而指针只是变量,而且它们也有内存地址。要改变一个指针(改变一个指针指向的内容),只需将它的内存地址传递给该函数即可。
希望有帮助!
编辑新的编辑问题
void push(char c, stack *node)
{
stack *B = (stack *)malloc(sizeof(stack));
if (node->next == NULL)
{
node->next = B;
B->value = c;
B->next =NULL;
}
else
{
B->next = node->next;
node->next = B;
B->value = c;
}
}
对于此版本的push
,它在做什么本质上是:
如果node->next == NULL
,所以node
没有继任者,然后将其具有值的新分配节点的后继者c
否则,node->next != NULL
和node
有一些后继者。然后我们将新分配的节点B
设置为node
的后继者,并将node
的原始后继者设置为B
的后继者。或换句话说,它在node
及其后继者之间拼接新节点B
(值为c
)。
我发现它非常难以解释,但一个简单的解释是,这push
不会改变node
指向。我们没有表现出意图改变node
。我认为涉及B
的内容应该是可以理解的,所以我们将重点放在node->next
分配上。
我假设stack
是一个结构,看起来是这样的:
struct stack {
char value;
struct stack *next;
};
现在,假设我们main
功能,我们有一个stack
:
stack x;
注意x
是不是指针。我想我们都同意做x.value = something
和x.next = something
会改变这些字段。
现在,让我们来看看这个:
stack *y = malloc(sizeof(struct stack));
我们知道y
店地址到实际struct stack
(实际struct stack
在*y
)。所以y->value = something
和y->next = something
会突变这些字段。
所以希望你能明白为什么node->value
任务工作。本质上node
包含一个地址到一个实际的struct stack
,其值是*node
。通过指针语法,node->value
和node->next
赋值将更改node
的内容。
我不是很好的解释。但只需编写更多的代码。当我第一次与C开始时,指针混淆了我的地狱。我认为,现在我仍然可能被2层或3层间接困惑,并且我遇到了一些非常讨厌的指针错误。只是练习更多......有一天你会真的明白。我知道这是他们所说的,但这是事实。
您不能每次都指向新节点。如果你想推你需要更新链接。 new_node-> what_head_is_pointing_to_now,然后head-> new_node,现在你有内存泄漏。如果这真的是应该是malloc的C代码,或者你应该更新你的标签 – Mike
@Mike by - > you mean =,那么'new'是一个C++关键词。对? 但我做了这样做temp-> next = head;和 head = temp; – Mcolorz
@Mike thnx。我更新了新的malloc和它的工作。但是这是怎么发生的?我的意思是我正在编写代码块并将文件另存为.cpp,那么为什么使用新命令给出错误的答案? – Mcolorz