2013-12-16 66 views
0
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中缀问题期间做了同样的事情,并且在那里工作。 帮我解决这个问题。 非常感谢提前任何帮助缀后缀的不插入新值的堆栈推 - C

先前的例子正在工作fiine

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

您不能每次都指向新节点。如果你想推你需要更新链接。 new_node-> what_head_is_pointing_to_now,然后head-> new_node,现在你有内存泄漏。如果这真的是应该是malloc的C代码,或者你应该更新你的标签 – Mike

+0

@Mike by - > you mean =,那么'new'是一个C++关键词。对? 但我做了这样做temp-> next = head;和 head = temp; – Mcolorz

+0

@Mike thnx。我更新了新的malloc和它的工作。但是这是怎么发生的?我的意思是我正在编写代码块并将文件另存为.cpp,那么为什么使用新命令给出错误的答案? – Mcolorz

回答

1

为什么u需要指针的指针?

你想修改一个指针的内容,所以如果你只传递一个指向函数的指针,它就是通过复制传递的,所以你不能修改它。

对于中缀前缀的情况,您必须没有修改您只会读取的字符串,因此不需要指向指针的指针。

+0

o我当时在做同样的事情,也就是插入char而不是int。 我已经编辑了我以前的中缀版本的问题也 – Mcolorz

1

对于在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。函数中的局部变量headmain函数中的我们的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,它在做什么本质上是:

  1. 如果node->next == NULL,所以node没有继任者,然后将其具有值的新分配节点的后继者c

  2. 否则,node->next != NULLnode有一些后继者。然后我们将新分配的节点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 = somethingx.next = something会改变这些字段。

现在,让我们来看看这个:

stack *y = malloc(sizeof(struct stack)); 

我们知道y店地址到实际struct stack(实际struct stack*y)。所以y->value = somethingy->next = something会突变这些字段。

所以希望你能明白为什么node->value任务工作。本质上node包含一个地址到一个实际的struct stack,其值是*node。通过指针语法,node->valuenode->next赋值将更改node的内容。

我不是很好的解释。但只需编写更多的代码。当我第一次与C开始时,指针混淆了我的地狱。我认为,现在我仍然可能被2层或3层间接困惑,并且我遇到了一些非常讨厌的指针错误。只是练习更多......有一天你会真的明白。我知道这是他们所说的,但这是事实。

+0

虽然库尔给出了一个更简单的答案,但这一个清除了我的概念。非常感谢您详细回答。 但我仍然怀疑,这件事情以前是如何为我工作的。还有我在做我一样的,使用malloc而不是新的,但它在那里工作 – Mcolorz

+0

我已经编辑了与我以前版本的中缀后缀的问题也。 – Mcolorz

+0

我会在我的答案下面添加一段,向你解释你新添加的代码 – yanhan

3

您可以更改功能这样

stack* push(stack *head, int valuee) 
    //return void to stack * 
    return head; 
    //In the end return the new head 

,它会工作。 这样的电话推送

head = push(head,value); 
+0

不错,这是比我的答案更简单...哈哈 – yanhan

+0

thanx kunal,但这件事情是如何工作以前对我来说。还有我在做同样的事情,使用malloc而不是新的,但它在那里工作 – Mcolorz

+0

我已经编辑了我以前版本的中缀后缀的问题。 – Mcolorz