- ベストアンサー
配列の中に、リストが入っているものをボトムアップ形式でマージソートしています
- 配列の中に、リストが入っているものをボトムアップ形式でマージソートしています。
- リストをマージする際に、配列の要素数とノードの次に文字列が入ったノードの関係に問題があります。
- printf関数が実行できないため、マージしたリストや配列の要素の状態がわかりません。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> while(word_lists[j] =NULL) while (j < size && word_lists[j] == NULL) i の方も同様。にしても while (1) が既に二重なのが気になる。 > if(j == size) if(j >= size) の方が安全な気がする。
その他の回答 (1)
- asuncion
- ベストアンサー率33% (2127/6289)
とりあえず、回答しようとする側でコンパイル~実行ができるよう、 ソースコード全体を載せてみてください。 >char* word; 何となくですけど、ポインターでいいのかな?配列でなくていいのかな? という気がしています。 まあ、ソースコード全体を見てからの話ですね。
補足
回答ありがとうございます。 指定されているため、構造体は変更できないんです・・・。 #include<stdio.h> #include<stdlib.h> #include<string.h> #define WORDS_NUM 10 /* 単語リスト型 word_list の定義 (変更しないこと) */ typedef struct list * word_list; struct list { char* word; word_list rest; }; char *words[10] = {"cat", "dog", "tiger", "bug", "bird", "fish", "cat", "cow", "pig", "rat" }; word_list make_clist(char *data) { int i =0; word_list head, n; head = (word_list)malloc(sizeof(struct list)); head->rest = NULL; n = (word_list)malloc(sizeof(struct list)); //ノードの容量を作る n->word = data; n->rest = head->rest; head->rest = n; return head; } word_list merge_list(word_list x, word_list y){ word_list p, p_head; x = x ->rest; y = y-> rest; p = (word_list)malloc(sizeof(struct list)); p ->rest = NULL; p_head = p; while( x != NULL && y != NULL ) { if(compare(x->word,y->word) == -1) { p->rest = x; p = x; x = x->rest; }else{ p->rest = y; p = y; y = y->rest; } } if( x == NULL ) { p->rest = y; }else{ p->rest = x; } return p_head; } /* 文字列比較の関数*/ int compare(char* w1,char* w2) { int len1 = strlen(w1), len2 = strlen(w2); if (strcmp(w1, w2) == 0) return 0; while(w1[len1] == w2[len2]){ len1--; len2--; } if(w1[len1] > w2[len2]){ return 1; }else{ return -1; } } int main() { int i; word_list w, word_lists[WORDS_NUM]; int n = 10 for(i =0; i<n; i++){ word_lists[i]=make_clist(words[i]); } w = _mergesort(word_lists, n); for(i=0; i < n; i++){ w = w->rest; printf("%s\n", w->word); } }
お礼
ありがとうございます! 解決しました・・・!