Сортировка и динамическое размещение односвязного списка в C - PullRequest
0 голосов
/ 30 мая 2020

Мой код работает, но только для небольшого количества данных, например: * 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);
}

Если бы вы, ребята, могли мне помочь, я был бы благодарен. Я могу связаться с кем-нибудь, чтобы поделиться всем проектом, если это поможет.

...