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;
如果需要,这是结构。
答案 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;
}
}