2017-04-27 17 views
1

I次のコードを持っている: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; 
} 

それはITEM1 ITEM2 ITEM3 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ループの他の変数を使用する必要があります – 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

関連する問題