Я думаю, что есть большая проблема, чем алгоритм сортировки, который вы должны выбрать. Первый из них состоит в том, что структура, которую вы определяете, на самом деле не будет содержать список слов, а список отдельных букв (или одно слово). Строки в C представлены как массивы символов с нулевым символом , изложены следующим образом: - (. буквально один байт нулей в памяти)
| A | n | t | h | o | n | y | \0 |
Этот массив, в идеале, быть объявлены в символьном [8] один слот для каждой буквы, плюс один слот для нулевого байта
Теперь я знаю, что вы, вероятно, знаете это, но это стоит указать на это для ясности. Когда вы работаете с массивами, вы можете просматривать несколько байтов за раз и ускорять работу. Со связанным списком вы можете смотреть только на вещи в истинное линейное время: переход от одного символа к другому. Это важно, когда вы пытаетесь сделать что-то быстро по строкам.
Более подходящий способ хранения этой информации в стиле, который очень похож на C, и используется в C++ как векторы: автоматически изменяемые размеры блоков смежной памяти с использованием 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 вставки, и вы все равно можете использовать строковые функции на нем из библиотеки строк C! Это помогает LOT с реализацией ваших ролей.
Итак, как я могу реализовать сортировку с этим? Вы можете создать аналогичный тип, предназначенный для хранения целых строк аналогичным образом, при необходимости увеличивая, чтобы удерживать входные строки с консоли. В любом случае, все ваши данные теперь живут в смежных блоках памяти, к которым можно получить доступ как к массиву, потому что это массив! Например, скажем, у нас есть это:
struct stringarray {
string *data;
int logLen;
int allocLen;
};
typedef struct stringarray cVector;
cVector myData;
И аналогичные функции, как и прежде: создавать, удалять, вставлять.
Ключ здесь в том, что вы можете реализовать свои функции сортировки с помощью strcmp() в элементе string.data, так как это просто строка C.Поскольку у нас есть встроенная реализация qsort, которая использует указатель на функции, все, что нам нужно сделать, это обернуть strcmp() для использования с этими типами и передать адрес.
Спасибо за ответ. К сожалению, я не могу сортировать во время чтения. Это должно быть сделано после того, как они будут «поданы» в программу. – Dimitar
Я просто говорю, чтобы найти правильное место в структуре, чтобы вставить элемент во время чтения. Таким образом, ваша структура памяти всегда сортируется. Я добавлю несколько псевдокодов для иллюстрации. – tvanfosson