09/07/07 01:35:43
>>695
いろいろ間違ってる。
nextを使うべきでないところで使っている(このためstr->next・str2->nextでstrやstr2がNULLになることがある)。
最小値がstr1でない場合に、次のループではstr1を跳ばしている(このためstr1がNULLになることがある)。
どうしてもtop入れ換えでやりたいなら、図でも書いて落ち着いて考えること。
top入れ換えではなく、最小値を1個ずつ抜いて別のツリーをつくる方がややこしくなくてお勧め。
struct data *sort(struct data *top){
struct data work, *d, *target = top, *current = &work;
for(target = top; target != NULL; target = top){ //元のツリーがなくなるまで
for(d = target->next; d != NULL; d = d->next){ //最小値探索
if(strcmp(target->name, d->name) > 0) target = d;
}
if(top == target){
top = target->next; //最小値がtopならtopにnextを保持
}else{
for(d = top; d->next != target; d = d->next) ; // 最小値がtop以外なら最小値の親と最小値の子をつなげる
d->next = target->next;
}
current->next = target; // 新しいツリーの末尾に最小値を追加
current = target;
current->next = NULL;
}
return work.next;
}