在链表中实现推送/弹出(c++)



我试图将push/pop合并到链接列表中,我似乎无法让它工作。当我运行测试函数时,我将链表设置为零,并尝试推值,但列表不断返回,其中没有值。谁能告诉我我哪里做错了?

if (top == NULL){
      current = top;
      current->next = NULL; //NULL->next : will cause segfault
  }

如果top为NULL,则设置current = top[为NULL],然后访问current->next,这将导致段错误,您正在尝试访问NULL.

EDIT:跟进注释:
你的if语句看起来多余,你可能只需要设置:current->next = head;head = current;[除了当前的分配]

代替

 if (top == NULL){
      current = top;
      current->next = NULL;
 }
你想要的

 if (top == NULL){
      top = current;
      current->next = NULL;
 }

当然,在此之后,您必须确保将head再次设置为top

现在您已经做了这个更改,应该很清楚,这两种情况都做同样的事情——所以实际上不需要区分情况。因此函数可以简化为

void push(Data * newPushData){
    LinkNode * current = new LinkNode(newPushData);
    current->next = head;
    head = current;
}

toppush(...)函数的局部变量。您可以使用head代替,我宁愿修改if语句。

我认为函数应该是这样的:

void push(Data * newPushData){
    LinkNode * current = new LinkNode(newPushData);
    if (head != NULL){
        current->next = head;
        head = current;
    }
    else{
        head = current;
        current->next = NULL; // if you haven't done it in LinkNode constructor
    }
}

能否指定链表类的属性?[有没有可能你做错了什么]

如果不是你,我会这样做:

void push(Data * newPushData){
if (head   == NULL) 
    head->data = newPushData
    tail = head ; 
else // regular situation 
     { 
     Node  * node  = new Node() ; 
     tail->next = node; 
     node->data  = newPushData; 
     node->next  = NULL ;
     tail  = node ; 
   } 

}

在链表中,你必须保持表首指针在表首的位置,保持尾指针在表尾的位置,你必须注意扩大清单的两种情况。最好的学习方法是在一个空白链表上演示一个插入。

照顾S

void push(Data * newPushData)
{
    if( head != NULL )
    {
        LinkNode current = new LinkNode(newPushData);
        current->next = head;
        head = current;
    }
    else
    {
        head = new LinkNode(newPushData);
    }
}

试试下面的代码…

void push(data * newpushdata){
    if(head !=null){
        linkednode current = new linkednode(newpushdata);
        current->next = head;
        head = current;
    }
    else {
       head = new linkednode(newpushdata);
    }
}

这是我对包含int元素的堆栈的工作解决方案,但也许最好使用Stack **S而不是Stack *S创建一个void pushStack

在pop(Stack **S)中我创建了一个哨兵,所以如果堆栈为空则返回-1。

typedef struct StackT {
    int val;
    struct StackT *next;
} Stack;
int isStackEmpty (Stack *S) {
    if (S == NULL)
        return 1;
    else
        return 0;
}

int *pop(Stack **S) {
    Stack *tmp = *S;
    int i = -1;
    if (isStackEmpty(tmp) == 0) {
        i = tmp->val;
        *S = tmp->next;
    }
    return i;
}
Stack *pushStack (Stack *S, int x) {
    Stack *node = (Stack *) malloc (sizeof (Stack));
    node->val = x;
    node->next = S;
    return node;
}

你可以很容易地调用pop和stack:

    Stack *S = NULL;
    int x = somevalue;
    int y;
    S = pushStack(S, x);
    y = pop(&S);

相关内容

  • 没有找到相关文章

最新更新