Мой код работает, но только для небольшого количества данных, например: * c dba A C BD * ввод -> ** a A b B c C d D **
Мне он нужен для огромного количества данных, например, нескольких МБ текстового файла. Моя программа должна читать данные из файла, затем отсортировать их и сохранить в другой файл.
Это моя структура:
***
struct Word
{
char* word;
struct Word* pNext;
};
typedef struct Word Word;
Это часть моего основного кода:
Word* s_words = NULL;
FILE* input_file = NULL;
if(input_file != NULL){
InsertWordsToStruct(&s_words, input_file);
fclose(input_file);
}
else{
ShowErrorUnknownFileName();
RemoveWordList(&s_words);
return 0;
}
bubbleSort(s_words);
Мои функции:
void AddElementToWord(Word** pH, char* word){
Word* temp = *pH;
int word_length = strlen(word);
Word* new_item = (Word *)malloc(sizeof(Word));
new_item->word = (char *)malloc((word_length+1)*sizeof(char));
strcpy(new_item->word, word);
new_item->pNext = NULL;
if (*pH == NULL){
*pH = new_item;
}
else{
while(temp->pNext != NULL){
temp = temp->pNext;
}
temp->pNext = new_item;
}
}
void InsertWordsToStruct(Word** pH, FILE* filename){
char one_line[8192];
while(fgets(one_line, 8192, filename))
{
char* one_word = strtok(one_line, " \t\n\0");
while(one_word != NULL)
{
if(IsLegitWord(one_word) == true)
{
char* copied = NULL;
copied = (char *)malloc((strlen(one_word)+1)*sizeof(char));
strcpy(copied, one_word);
AddElementToWord(pH, copied);
free(copied);
}
one_word = strtok(NULL, " \t\n\0");
}
}
}
void RemoveWordList(Word** pH){
Word* current = *pH;
while (current != NULL){
Word* next = current->pNext;
free(current->word);
free(current);
current = next;
}
free(current);
*pH = NULL;
}
char* MakeLowerCase(char* word)
{
char* lower = (char *)malloc(sizeof(char)*strlen(word)+1);
strcpy(lower, word);
int i = 0;
for(i = 0; i < strlen(lower); i++){
lower[i] = tolower(lower[i]);
}
return lower;
}
void swap(Word* a, Word* b)
{
char* word = malloc(sizeof(char)*strlen(a->word)+1);
strcpy(word,a->word);
strcpy(a->word,b->word);
strcpy(b->word,word);
free(word);
}
void bubbleSort(Word* start)
{
int swapped = 0;
int i = 0;
Word* pointer = start;
Word* previous = NULL;
if (start == NULL)
return;
do
{
swapped = 0;
pointer = start;
while (pointer->pNext != previous)
{
if (strcmp(MakeLowerCase(pointer->word), MakeLowerCase(pointer->pNext->word)) > 0)
{
swap(pointer, pointer->pNext);
swapped = 1;
}
pointer = pointer->pNext;
}
previous = pointer;
} while (swapped);
}
Если бы вы, ребята, могли мне помочь, я был бы благодарен. Я могу связаться с кем-нибудь, чтобы поделиться всем проектом, если это поможет.