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