void push(stack *head, int valuee)
{
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;
head = temp;
printf("Element %d inserted\n",valuee);
}
}
第一个元素被正确插入但是当我继续插入元素时,在第一个元素之后没有插入任何元素。 读取我必须将指针传递给堆栈指针的地方,但我在后缀中缀问题中做了同样的事情并且它在那里工作。 这里帮我解决这个问题。 非常感谢您提前提供任何帮助
上一个中缀postfix的例子,正在工作
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;
}
}
答案 0 :(得分:3)
您可以更改此功能
stack* push(stack *head, int valuee)
//return void to stack *
return head;
//In the end return the new head
它会起作用。 像这样呼叫推送
head = push(head,value);
答案 1 :(得分:1)
为什么你需要指针指针?
你想要修改指针的内容,所以如果只传递一个指向函数的指针,它就会通过副本传递,所以你不能实际修改它。
在infix-prefix场景的情况下,你必须没有修改你只读它的字符串,所以不需要指向指针的指针。
答案 2 :(得分:1)
对于else
语句的if
部分中的这行代码:
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
的内容是内存地址)复制到本地变量head
函数的强> push
。因此,时间:
head = temp;
已执行,我们正在将temp
的内容分配给head
。什么是temp
?它是指向stack
类型变量的指针。换句话说,temp
的值是内存地址。因此head = temp;
只是将temp
中包含的内存地址分配给局部变量head
。 head
函数中的局部变量push
和headOfStack
函数中的main
变量是两个具有不同内存地址的完全不同的变量。如果到目前为止我的解释已经明确,这意味着当我们修改head
函数中的push
时,headOfStack
中的main
变量完全没有变化。
在这种情况下你想要做的是:
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
的后继者。或者换句话说,它在B
与其后继者之间拼接新节点c
(值node
)。
我发现很难解释这一点,但一个简单的解释是,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层间接混淆,我遇到了一些非常讨厌的指针错误。只是练习更多...有一天你会真正得到它。我知道这是他们所说的,但这是真的。