2017-10-21 141 views
-4
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; 

這是結構,如果需要的話。

+1

'new_node-> name'是在'if'聲明未初始化。未定義的行爲。 – melpomene

+0

多重欺騙。 'new_node-> name = port_name;'僅複製指針,以便所有節點具有相同的指針(可能超出範圍),最後一個字符串已輸入。 –

+0

可能在main中傳遞一個靜態字符數組的地址。請發佈主代碼,以便我們可以驗證(對於添加的每個元素,地址都是相同的,因爲它爲每個字符串使用相同的內存位置) –

回答

0
*port = new_node 

上方是罪魁禍首。它刪除對端口指針中前一個節點的引用,並使其指向新節點。在你的情況下,最初port曾用來指向「香港」,並且上面的行使它指向「鹿特丹」

代碼也有一些其他問題,它不會工作。請參閱C在線的鏈接列表實現。

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