2017-04-27 293 views
1

我有以下代碼:C字符串和指針

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
struct wordlist { 
    char *value; 
    struct wordlist *next; 
}; 
int compare (struct wordlist *one , struct wordlist *two) { 
    return strcmp(one->value, two->value); 
} 
void add(struct wordlist *pp, char *value) { 
    struct wordlist *new; 
    new = malloc(sizeof(*new)); 
    new->value = value; 
    for (; pp != NULL; pp = pp->next) { 
     if (compare(pp, new) > 0) { 
      break; 
     } 
    } 
    new->next = pp; 
    pp = new; 
} 
void display(struct wordlist *ptr) { 
    for (; ptr != NULL; ptr = ptr->next) { 
     printf("%s\n", ptr->value); 
    } 
} 

打破它在中間才能提交。對不起

int main(void) { 
    struct wordlist *root = NULL; 
    add(root, "item1"); 
    add(root, "item2"); 
    add(root, "item4"); 
    add(root, "item3"); 
    display(root); 
    return 0; 
} 

應該打印出來

物品1 ITEM2項目3 ITEM4

但它不打印任何東西,我不明白爲什麼。

+0

是啊,我也是,,,,,爲什麼不能'改變(5);'不會改變'5' ..:d –

+0

笑,我理解的代碼,但我不能看到任何理由它不會工作 – Yonlif

+0

哪條線? @TonyTannous – Yonlif

回答

1

是否需要將指針傳遞給指針?

void add(struct wordlist **pp, char *value) { 
struct wordlist *new; 
new = malloc(sizeof(*new)); 
new->value = value; 
for (; (*pp) != NULL; (*pp) = (*pp)->next) { 
    if (compare((*pp), new) > 0) { 
     break; 
    } 
} 
new->next = (*pp); 
(*pp) = new; 
} 
+1

您應該在for-loop中使用其他變量 – BLUEPIXY

+1

另外插入位置之前的列表丟失。 – BLUEPIXY

+0

* OP中的所有*'pp'應該在您的建議中變成'(* pp)'。 – alk

1

此方法不改變根目錄,也工作。

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
struct wordlist { 
    char *value; 
    struct wordlist *next; 
}; 

int compare (struct wordlist *one , struct wordlist *two) { 
    return strcmp(one->value, two->value); 
} 

void add(struct wordlist *pp, char *value) { 
    struct wordlist *new; 

    new = malloc(sizeof(*new)); 
    new->value = value; 

    for (; pp->next != NULL; pp = pp->next) { 
     if (compare(pp->next, new) > 0) { 
      break; 
     } 
    } 
    new->next = pp->next; 
    pp->next = new; 

} 
void display(struct wordlist *ptr) { 
    while (ptr->next != NULL) { 
     ptr = ptr->next; 
     printf("%s\n", ptr->value); 
    } 
} 

int main(void) { 
    struct wordlist root; 

    root.next = NULL; 
    add(&root, "item1"); 
    add(&root, "item2"); 
    add(&root, "item4"); 
    add(&root, "item3"); 
    display(&root); 
    return 0; 
} 
+0

它的劑量,但我不想一直改變根。不管怎麼說,還是要謝謝你 – Yonlif