【问题标题】:Adding a new node to my linked list stack updates all my old nodes to the new node向我的链表堆栈添加一个新节点会将我的所有旧节点更新到新节点
【发布时间】:2017-11-16 01:54:12
【问题描述】:

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

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

插入 8

8 --> 8 --> 8

【问题讨论】:

    标签: c pointers linked-list stack


    【解决方案1】:

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

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

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

    【讨论】:

    • 您好,感谢您的回复。一旦我弄清楚了这一点,我就计划存储多个值。有没有一种简单的方法可以在仍然通过字符串的同时解决这个问题?
    • 是的。就像我说的,复制数据。这意味着malloc 有足够的内存供它使用,并使用memcpy 或strcpy 复制到新位置。
    【解决方案2】:

    这是因为newNode-&gt;value = item,它始终在您的节点中存储一个指向同一内存位置p 的指针,该指针保留在您的push 之外,并一次又一次地被新内容覆盖。要克服这个问题,请写newNode-&gt;value = strdup(item) 以复制内容。不要忘记稍后释放它。如果strdup 不可用,您可以轻松地将其替换为newNode-&gt;value = malloc(strlen(item)+1);strcpy(newNode-&gt;value, item)。

    【讨论】:

    • 非常感谢,帮了大忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2010-09-20
    • 2013-01-15
    • 2022-01-22
    • 1970-01-01
    • 2014-05-14
    相关资源
    最近更新 更多