あなたが選ぶべきソートアルゴリズムよりも大きな問題があると思います。1 つ目は、定義している構造体が実際には単語のリストではなく、1 文字 (または 1 つの単語) のリストを保持することです。C の文字列は、null で終わる文字の配列として表されます。 、次のようにレイアウトされています。
| A | n | t | h | o | n | y | \0 |
この配列は、理想的には char[8] として宣言されます。文字ごとに 1 つのスロットと、ヌル バイト用の 1 つのスロット (文字通り、メモリ内のゼロの 1 バイト)。
おそらくこれを知っていると思いますが、明確にするためにこれを指摘する価値があります。配列を操作する場合、一度に複数のバイトを調べて速度を上げることができます。リンクされたリストを使用すると、真に直線的な時間でのみ物事を見ることができます。つまり、ある文字から次の文字へと進みます。これは、文字列に対して何かをすばやく実行しようとしている場合に重要です。
この情報を保持するためのより適切な方法は、非常に C に似たスタイルであり、C++ でvectorとして使用されます: malloc と realloc を使用して連続したメモリのブロックを自動的にサイズ変更します。
まず、次のような構造体をセットアップします。
struct sstring {
char *data;
int logLen;
int allocLen;
};
typedef struct string sstring;
そして、これらのためにいくつかの機能を提供します:
// mallocs a block of memory and holds its length in allocLen
string_create(string* input);
// inserts a string and moves up the null character
// if running out of space, (logLen == allocLen), realloc 2x as much
string_addchar(string* input, char c);
string_delete(string* input);
scanf を使用して簡単なバッファに読み込むことができないため、これは素晴らしいことではありませんが、getchar() のような関数を使用して単一の文字を取得し、string_addchar() を使用してそれらを文字列に配置して、使用を避けることができます。リンクされたリスト。文字列は可能な限り再割り当てを回避し、2^n 挿入ごとに 1 回だけで、C 文字列ライブラリから文字列関数を引き続き使用できます!! これは、ソートの実装に大いに役立ちます。
では、これで実際にソートを実装するにはどうすればよいでしょうか。同様の方法で文字列全体を保持することを目的とした同様の型を作成し、必要に応じて拡張して、コンソールからの入力文字列を保持できます。いずれにせよ、すべてのデータは配列としてアクセスできる連続したメモリ ブロックに存在するようになりました。これは配列であるためです。たとえば、次のようになったとします。
struct stringarray {
string *data;
int logLen;
int allocLen;
};
typedef struct stringarray cVector;
cVector myData;
以前と同様の機能: 作成、削除、挿入。
ここで重要なのは、string.data 要素で strcmp() を使用してソート関数を実装できることです。これは C 文字列に過ぎないためです。関数ポインターを使用する qsort の組み込み実装があるため、これらの型で使用するために strcmp() をラップし、アドレスを渡すだけです。