以下の関数は、リンクリスト上の文字列を昇順で並べ替えようとします。新しいリストを返すと、破損します。
void* order( void *ptr){
struct wordlist *head;
head = (struct wordlist *) ptr;
struct wordlist *first = (struct wordlist*)malloc(sizeof(struct wordlist));
struct wordlist *second = (struct wordlist*)malloc(sizeof(struct wordlist));
struct wordlist *temp = (struct wordlist*)malloc(sizeof(struct wordlist));
first = head;
int j = 1;
while( first != NULL){
second = first->next;
while( second != NULL){
if( strcmp( first->word, second->word) > 0){
if( temp->word == NULL){
temp->word = malloc( sizeof(first->word));
}
else{
if( realloc( temp->word, sizeof( first->word)) != NULL){
strcpy( temp->word, first->word);
}
}
if( realloc( first->word, sizeof(second->word)) != NULL){
strcpy( first->word, second->word);
}
if( realloc( second->word, sizeof(temp->word)) != NULL){
strcpy( second->word, temp->word);
}
free(temp);
}
second = second->next;
}
j++;
first = first->next;
}
}
たとえば、入力が
piero
ronaldo
messi
その場合、出力は次のようになります
messi
ŽŽŽ
ronaldo
上記の例はコードでは試されていませんが、手がかりが得られます。メモリの割り当てに何かがあると思いますが、なんとか見つけることができませんでした。ちなみに、言葉も空っぽになることがあります。
また、ワードリストは次のとおりです。
struct wordlist{
char *word;
struct wordlist *next;
};