为什么指针会被覆盖?

时间:2017-10-21 16:58:20

标签: c pointers struct linked-list

void addPort(s **port, char *port_name){
    //s *pointer = malloc(sizeof(s));
    s * new_node;
    new_node = malloc(sizeof(s));
    if (port_name != new_node->name){
    new_node->name = port_name;
    new_node->next = *port;
    *port = new_node;
    }
    else {
        printf("Port %s exists ", port_name);
    }
}

所以我有上面的代码,用于向链表添加元素。目前,当我添加元素时发生的一切是添加一个新元素,并将所有先前元素更改为新元素的值。例如:如果我添加香港然后打印它将打印'香港'(如预期的那样),但如果我再添加鹿特丹并打印它将打印'鹿特丹鹿特丹'。谁能看出我的错误是什么?

typedef struct port {
    char *name;
    struct port *next;
    struct port *ptr;
} s;

如果需要,这是结构。

2 个答案:

答案 0 :(得分:1)

*port = new_node

以上是罪魁祸首。它删除对端口指针中存在的早期节点的引用,并使其指向新节点。在您的情况下,最初port过去常常指向"香港"以上一行指向" Rotterdam"

代码也存在其他一些问题,但它不起作用。请参考C在线的一些链表实现。

答案 1 :(得分:0)

void addPort(s **port, char *port_name){
    s * new_node;
    if (!strcmp(port_name, (*port)->name)){ // <-use strcmp() to compare string *contents*
        fprintf(stderr, "Port %s exists\n", port_name);
        return; // <-- return before allocating
        }
    new_node = malloc(sizeof *new_node);
    new_node->name = strdup(port_name); // <- create a copy of the function argument
    new_node->next = *port;
    *port = new_node;
    }
}

现在:同样检查整个链表,而不仅仅是第一个节点:

void addPort(s **port, char *port_name){
    s * new_node;
    for (; *port;port=&(*port)->next) { // walk the COMPLETE linked list.
        if (!strcmp(port_name, (*port)->name)){ // <- use strcmp() to compare string *contents*
                fprintf(stderr, "Port %s exists\n", port_name);
                return; // <-- return before allocating
                }
        }
    new_node = malloc(sizeof *new_node);
    new_node->name = strdup(port_name); //<- create a copy of the function argument
    new_node->next = *port;
    *port = new_node;
    }
}