推送堆栈不插入新值 - C.

时间:2013-12-16 14:28:24

标签: c struct linked-list stack

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;
    }
}

3 个答案:

答案 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中包含的内存地址分配给局部变量headhead函数中的局部变量pushheadOfStack函数中的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,它正在做的事情主要是:

  1. 如果node->next == NULL,那么node没有后继者,则将其后继者设置为值为c的新分配节点

  2. 否则,node->next != NULLnode会有一些后继者。然后我们将新分配的节点B设置为node的后继者,并将node的原始后继者设置为B的后继者。或者换句话说,它在B与其后继者之间拼接新节点c(值node)。

  3. 我发现很难解释这一点,但一个简单的解释是,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层间接混淆,我遇到了一些非常讨厌的指针错误。只是练习更多...有一天你会真正得到它。我知道这是他们所说的,但这是真的。