【问题标题】:How to pass two parameters in a linked list node using c?如何使用c在链表节点中传递两个参数?
【发布时间】:2016-09-30 23:00:50
【问题描述】:

我正在学习如何在 c 中使用带有链表的结构。所以我试图继续将节点插入到第一个位置。此外,每个节点包含两种不同的值,一种是 char 数组,另一种是整数。一旦我插入一个值,然后将当前列表打印出来。我一遍又一遍地看,但我找不到哪里出了问题,因为我在插入函数中设置了一个 printf() 测试。我看到 new_node 是我当前插入的。

当我先插入一个 1 并打印出 a/1。但是当我插入另一个集合(例如 b 2)时,我很困惑,它会打印出来

b/2

b/1

这意味着第一个节点的名称随着插入一个新节点而改变,但数字没有改变。谁能看到这里发生了什么?

struct node{
    char *name;
    int numbers;
    struct node *next;
};
struct node *list = NULL;

void printList(struct node *node){
    while (node != NULL){
        printf("%s/%d\n", node->name, node->numbers);
        node = node->next;
  }
}

void insert(struct node **list, char *name, int numbers){
    struct node * new_node = malloc(sizeof(struct node));
    new_node->name = name;
    new_node->numbers = numbers;
    //printf("......%s %d.........\n", new_node->name, new_node->numbers);
    new_node->next = *list;
    *list = new_node;
}

int main(){
    ......code for scanf() are omitted......
    insert(&list, name, numbers);
    printList(list);
}

【问题讨论】:

  • new_node->name = name; --> 像new_node->name = strdup(name);一样复制
  • 别忘了以正确的方式释放你的节点,这意味着释放名称指针,因为它是一个分配的内存,指向它的唯一指针就是这个节点名称。
  • @BLUEPIXY 为什么 char 数组需要 strdup 而整数不需要?
  • 因为name 是指针(numbers 不是指针)。该指针指向同一个缓冲区。
  • 请包含您已删除的 main() 代码

标签: c struct linked-list


【解决方案1】:

您的问题是您指向每个节点的相同缓冲区。 即使没有看到您删除的代码,我也可以猜到您正在读取同一 char 数组中的节点名称。 您最好考虑按照建议使用 strdup():

new_node->name = strdup(name);

确保在销毁节点时释放此指针。

【讨论】:

  • 你是对的,这就是问题所在。但我不明白“名称”是否指向当前名称,为什么我不能只更新当前节点的名称?
  • 您的所有节点都将指向同一个缓冲区,这意味着它们都将具有相同的名称,实际上与您插入的最后一个节点的名称相同。
【解决方案2】:

在 C 中,字符串采用“字符数组”的形式,即 - 一系列彼此相邻的 char 变量,后跟一个空字符。

当你看到类似的东西时

char* string = "foo";

在 C 中,即char* 的声明(指向char 类型变量的指针)分配了字符串中第一个字符的内存地址。在您的插入函数中,该行

new_node->name = name;

获取分配给name 的内存地址并将其存储在您的对象中。它确实 not 将字符串值本身存储在您的对象中;那仍然是原来的样子。如果您随后使用scanf(),传入相同的指针,您将覆盖原来的字符串,您之前创建的对象仍然指向该字符串。

【讨论】:

  • 有道理!谢谢大家!
猜你喜欢
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
相关资源
最近更新 更多