将新节点添加到链接列表堆栈会将所有旧节点更新到新节点

时间:2017-11-16 01:54:13

标签: c pointers linked-list stack

当我将一个字符串插入到我的堆栈中时,它会添加它,但也会更改所有以前的元素。

void push(linkedList *ll,char *item) {
node *newNode = malloc(sizeof(node));
if (ll->size == 0) {
    newNode->value = item;
    newNode->next = NULL;
    ll->head = newNode;
    ll->tail = newNode;
    ll->size++;
}
else {
    newNode->value = item;
    newNode->next = ll->head;
    ll->head = newNode;
    ll->size++;
}
}


int main() {
linkedList* stack = init();
int scan = 1;
char * p = malloc(sizeof(char) * 5);
while (scan = 1) {
    scanf("%1s", p);
    if (*p >= '0' && *p <= '9') {
        push(stack, p);
        print(stack);
    }
}

WINPAUSE;
}

输出看起来像这样:

插入5

5

插入7

7 - &gt; 7

插入8

8 - &gt; 8 - &gt; 8

2 个答案:

答案 0 :(得分:0)

每次都添加相同的指针。您分配了一次该内存,并不断替换其内容。由于列表中的每个节点都保持相同的指针值,遍历列表将返回最近输入的数据,包括数据是否甚至不在有效范围内。

最合适的解决方案(许多选项)可能是做以下事情之一:

  • 在推送项目时为其分配新内存来复制数据
  • 将数据存储为char值而不是指针,因为您一次只能保留一个字符(如果这适合您的任务)

答案 1 :(得分:0)

这是因为newNode->value = item,它存储在您的节点中,始终是指向p之外保留的同一内存位置push的指针,并一次又一次地覆盖新内容。要解决此问题,请编写newNode->value = strdup(item)以复制内容。别忘了以后再免费。如果strdup不可用,您可以轻松地将其替换为newNode->value = malloc(strlen(item)+1);strcpy(newNode->value, item)