我试图将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;
}
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
}
}
能否指定链表类的属性?[有没有可能你做错了什么]
如果不是你,我会这样做:
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);