2011-09-24 50 views
0

我试图将push/pop合并到链表中,我似乎无法使其工作。当我运行我的测试函数时,我将链接列表设置为零,并尝试推送值,但列表一直返回而没有任何值。谁能告诉我我做错了什么?在链表中实现push/pop(C++)

回答

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

如果顶部为NULL,则设置current = top [这是NULL],然后访问current->next,这将导致一个段错误,您试图访问NULL ..

编辑:跟随高达评论:
你的if语句似乎是多余的,你应该只需要设置:current->next = head;head = current; [除了当前分配]

+0

我从top = current改变了它,但是我仍然没有得到任何回报。 – BleuCheese

+2

@BleuCheese:问题在于当你需要改变全局变量'head'时,你只改变局部变量'top' - 否则,你的改变不会在函数结束后“生存” 。 –

+0

你的if语句似乎是多余的,你应该只需要设置:'current-> next = head;'和'head = current;' – amit

0

而不是

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

你想

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

,当然还有,在此之后,你必须确保你实际设置headtop一次。

现在你已经做了这个改变,应该清楚的是,两种情况都做同样的事情 - 所以不需要区分事实。所以功能可以简化为

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

top变量是push(...)函数的局部变量。您可以改用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 
    } 
} 
0
void push(Data * newPushData) 
{ 
    if(head != NULL) 
    { 
     LinkNode current = new LinkNode(newPushData); 
     current->next = head; 
     head = current; 
    } 
    else 
    { 
     head = new LinkNode(newPushData); 
    } 
} 
0

你能请注明链接列表类的属性? [有轻微的机会,你正在做的事情错]

你相反,我会怎么做:

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

}

在你不得不在维持头指针指向一个链表该列表的头部,保持尾部指针位于列表的尾部, 您必须注意扩大列表的两种情况。 学习的最佳方式是说明在空白链表上的插入。

照顾 小号

0

试试这个代码...

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

这只是一堆代码。请至少发表评论 – kolossus

0

是含有INT元素堆栈我工作的解决方案,但也许这是更好地创建使用堆栈的空隙pushStack ** S而不是Stack * S。

在弹出(栈** 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; 
} 

你可以叫流行音乐和伊斯利堆栈:

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