単語の単独リンクされたリスト

私はパラメータとして渡されたテキストから単語の単独リンクされたリスト(空白で区切られた文字のシーケンス)を生成する関数 words を作成しようとしています。結果リストの単語は、テキストと同じにする必要があります。

残念ながら、プログラムは実行中にエラーを出しますが、何がうまくいかないかを私に説明することができますか、いくつかのヒントもありがとうございます。コードは次のとおりです:

#include 
#include 
#include 
#include 

struct node{
    char* word;
    struct node* next;
};

void printList(struct node* list){
    struct node* it = list;
    while(it != NULL){
        printf("%s ", it -> word);
        it = it -> next;
    }
    printf("\n");
}

void insertLast(struct node* tail, char* neww){
    tail -> next = (struct node*)malloc(sizeof(struct node));
    tail = tail -> next;
    tail -> word = neww;
    tail -> next = NULL;
}

struct node* words(char* s){
    char* slowo = strtok(s, " ");
    struct node* head;
    struct node* tail;
    if (sizeof(slowo) == 0)
        return NULL ;
    head = (struct node*)malloc(sizeof(struct node));

    head -> word = slowo;
    head -> next = NULL;
    tail = head;
    slowo = strtok(NULL, " ");
    while (slowo != NULL){
        insertLast(tail, slowo);
        tail = tail -> next;
        slowo = strtok(NULL, " ");
    }
    return head;
}

int main() {
    printList(words("Some sentance la al olaalal"));
    getch();
    return (EXIT_SUCCESS);
}
0
あなたが期待しているとおりに正確に動作しないのは何ですか? 1つの問題を正確に記述してください。
追加された 著者 Dave,

2 答え

呼び出し元の関数の tail を設定するために insertLast をしない場合、ポインタを参照(ポインタへのポインタ)として渡す必要があります。

void insertLast(struct node** tail, char* neww)

insertLast で適切な逆参照を使用して機能させます。

1
追加された

あなたの words()関数は、その引数( s )をインプレースで変更します。文字列リテラルで words()を呼び出しています。文字列リテラルを変更することはできません。これに対処するには、 strdup()または malloc()+ strcpy()を使用してヒープ割り当てメモリに s を配置することができます。

0
追加された