配列の中に、リストが入っているものをボトムアップ形式でマージソートして
配列の中に、リストが入っているものをボトムアップ形式でマージソートしています。
リストは、空のノードの次に文字列が入ったノード、というものです。
sizeは、配列の要素数となっています。
merge_listは、リスト2つをマージするものです。
2つのリストをマージして、ひとつになったリストを最初のリストが入っていた配列に入れる。
もう片方はNULLにする。
順に繰り返していき、配列の要素が1つのみになったらそれを返す・・・
といったアルゴリズムなのですが、うまく配列の中のリストが指定できません。
調べたところ、おそらくプログラム中の矢印があるところに問題があってprintfが実行できないようなんですが、原因がわかりません。
同じ原因によりmerge_listに、マージしたいリストが入っていないようなんですが・・・。
説明下手ですいませんが、どうかよろしくお願いします。
typedef struct list * word_list;
struct list {
char* word;
word_list rest;
};
word_list _mergesort(word_list* word_lists, int size) {
int i=0, j;
while(1){
while(1){
while(word_lists[i] =NULL) //配列に一つ目の要素が見つかるまで回す <- 原因
i++;
j = i+1;
while(word_lists[j] =NULL) //配列に二つ目の要素が見つかるまで回す<- 原因
j++;
if(j == size) //マージする要素が後ろになかったら終了
break;
//printf("%d,%d\n",i, j);
printf("%s\n",word_lists[i] ->rest ->word); <-ここでエラー
printf("%s\n",word_lists[j] ->rest ->word);
word_lists[i] =merge_list(word_lists[i], word_lists[j]);
word_lists[j] =NULL;
printf("%s",word_lists[i]->rest ->word);
i = j+1;
}
if(i !=0){
i = 0;
}else{
break; //要素がひとつしかなかったら終了
}
}
return word_lists[0];
}
補足
回答ありがとうございます 自己解決しました すいません 出力はトップダウンでもボトムアップでも2,1,5,1,4,3,2,1で正解で、ボトムアップで考える場合は recur(0)→何もしない recur(1)→recur(-2),1,recur(0)→1 recur(2)→recur(-1),2,recur(1)→2,1 recur(3)→recur(0),3,recur(2)→3,2,1 recur(4)→recur(1),4,recur(3)→1,4,3,2,1 recur(5)→recur(2),5,recur(4)→2,1,5,1,4,3,2,1 と考えるようです