【问题标题】:push operation on stack using linked list fails使用链表对堆栈进行推送操作失败
【发布时间】:2016-10-25 06:00:19
【问题描述】:

我正在尝试使用单链表创建堆栈,我的推送操作没有将数据插入到链表中

这是我迄今为止尝试过的,

typedef struct element {
    int data;
    struct element *next;
}node;

推送方式

void push(node *root, int data) {
    if(root == NULL) {
        root = (node *) malloc (sizeof(struct element));
        root->data = data;
        root->next = NULL;
    }
    else {
        node *temp = (node *) malloc (sizeof(struct element));
        temp->data = data;
        temp->next = root;
        root = temp;
    }
}

在我的主要方法中,我没有malloced 头指针, 这就是我如何调用 push 方法,

push(head, data);

如何使推送操作生效?

【问题讨论】:

    标签: c linked-list stack


    【解决方案1】:

    root 指针在push 函数中被修改。此值不会传播到main。一种方法是返回 root 指针。

    node* push(node *root, int data) {
      if(root == NULL) {
        root = (node *) malloc (sizeof(struct element));
        root->data = data;
        root->next = NULL;
      }
      else {
        node *temp = (node *) malloc (sizeof(struct element));
        temp->data = data;
        temp->next = root;
        root = temp;
      }
      return root;
    }
    

    在 main 中,你需要这样称呼它,

    head = push(head, data);
    

    【讨论】:

      【解决方案2】:

      你的root的值是一个指针,但是地址是按值传递的,也就是说如果你修改了地址,它在外面没有没有副作用功能范围。

      用途:

      void push(node **root, int data )
      

      为了能够修改root的值

      和:

      push( &head, data )
      

      【讨论】:

        【解决方案3】:

        我认为这是有问题的代码行:

        root = temp;
        

        您将一个名为 root 的本地 node* 分配给另一个名为 temp 的本地 node*,但此分配不会“粘”在 push() 函数之外。为了让它坚持下去,你可以按如下方式取消引用:

        *root = *temp;
        

        完整代码:

        void push(node *root, int data) {
            if (root == NULL) {
                root = (node *) malloc (sizeof(struct element));
                root->data = data;
                root->next = NULL;
            }
            else {
                node *temp = (node *) malloc (sizeof(struct element));
                temp->data = data;
                temp->next = root;
                *root = *temp;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-02-01
          • 1970-01-01
          • 2015-08-03
          • 2011-06-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-14
          相关资源
          最近更新 更多