2014-01-18 5 views
0

У меня проблема с моим проектом. Я написал функцию, которая читает структуру из файла, сортирует ее по алфавиту и записывает обратно в файл. Чтение из файла и возвращение его обратно в норму, поскольку я использую тот же код в других функциях, и он отлично работает. Что-то не так с моей сортировкой, так как после использования этой функции txt-файл пуст. Он работает на структуре вне функций:C: Сортировка списка по алфавиту

typedef struct baseofwords         
    { 
     char *word; 
     char *category; 
     struct baseofwords* next; 
    } base; 

Вот моя функция:

void SORTING (base **head) 
{ 
char word[30]; 
char category[20]; 
FILE *fp; 
if ((fp = fopen("baza.txt", "r"))==NULL) 
    {printf("Error while opening the file!"); 
    exit(EXIT_FAILURE);} 
else 
    { 
    while(!feof(fp)) 
     { 
     fscanf(fp,"%s %s \n", word, category); 
     base *wsk = *head; 
     base *new = malloc (sizeof(base)); 
     new -> next = NULL; 
     new -> word = strdup(word); 
     new -> category = strdup(category); 
     if(wsk == NULL) 
      { 
      new -> next = *head; 
      *head = new; 
      } 
     else 
      { 
      while(wsk -> next != NULL) 
      wsk = wsk -> next; 
      wsk -> next = new; 
      } 
     } 
    } 
fclose(fp); 
//==========================================up until here it works, problem must be down there 


base *newHead = NULL; 
base *wsk1, *wsk2, *tmp; 
wsk1 = tmp = *head; 
wsk2 = NULL; 
while(tmp->next) 
    { if (tmp->next->word > wsk1->word) 
     { wsk2 = tmp; 
     wsk1 = tmp->next; 
     } 
    tmp = tmp->next; 
    } 
if (wsk2) wsk2->next = wsk1->next; 
else *head = wsk1->next; 
wsk1->next = newHead; 
newHead = wsk1; 
*head = newHead; 


//======================this part is okay again 
if ((fp = fopen("base.txt", "w"))==NULL) 
    {printf("Error while opening file!"); 
    exit(EXIT_FAILURE);} 
else 
    {base *wsk = *head; 
    while (wsk->next != NULL) 
    {fprintf(fp, "%s %s\n", wsk->word, wsk->category); 
    wsk=wsk->next;} 
    }fclose(fp); 
} 

Большое спасибо заранее за помощь!

+0

Как эта строка: base * new = malloc (sizeof (baza)); ? Я даже не вижу, как это компилируется ... – GreenAsJade

+0

Извините! Я перевел его с моего языка. Это база * new = malloc (sizeof (base)); , конечно! – user3188206

+1

Я думаю, было бы лучше, если бы мы смотрели на фактический код, который вы используете, или даже лучше ... если вы скомпилируете и протестируете код, который вы публикуете здесь, прежде чем публиковать его, говоря, что «это работает» ... – GreenAsJade

ответ

1

Несколько вещей здесь не так, давайте посмотрим на эту петлю:

while(tmp->next) 
    { if (tmp->next->word > wsk1->word) 
     { wsk2 = tmp; 
     wsk1 = tmp->next; 
     } 
    tmp = tmp->next; 
    } 

Вы назначаете то wsk2, а затем никогда не использовать его. Вы пытаетесь сравнить word, сравнив его адрес (вместо значений по этому адресу). И я не вижу, как вы переупорядочиваете предметы вообще.

Для сравнения двух строк, вам нужно использовать strcmp, и вы также должны решить, в каком порядке вы хотите их.

Во-вторых, вы не можете отсортировать список, просто шагая через него один раз. Вам придется иметь вложенные петли, которые сравнивают предметы друг с другом и выполняют, возможно, несколько ходов для перемещения элементов на место.

И переупорядочение элементов в связанном списке (односвязное не менее), довольно сложно и чревато краевыми условиями, которые необходимо учитывать. Вместо этого следует переместить указатели на word и category, если вы хотите обменять два элемента. Это может выглядеть примерно так:

void swapbases(base *it1, base *it2) 
{ 
    base tmp= * it1 ; 
    it1-> word= it2-> word, it1-> category= it2-> category ; 
    it2-> word= tmp.word, it2-> category= tmp.category ; 
} 

А затем напишите пару петель, которые пройдут и найдут предметы не по порядку. Существует ужасный тип, называемый пузырьковым видом:

int swaps ; 
for (swaps= 1 ; (swaps) ;) 
{ 
    swaps= 0 ; 
    for (tmp= head ; (tmp-> next) ; tmp= tmp-> next) 
    { 
    if (strcmp(tmp-> word, tmp-> next-> word) < 0) 
     { swapbases(tmp, tmp-> next) ; swaps ++ ; } 
    } 
} 
+0

Да, это похоже на код после того, как {} предположительно будет внутри него каким-то образом (потому что это после кода, который использует wsk2) – GreenAsJade

+0

Спасибо, что объяснил мне все терпеливо! Теперь я вижу свои ошибки. Я удалил часть и после нее {} и добавил то, что вы мне сказали. Теперь он сохраняет список правильно, но он по-прежнему не сортирован. – user3188206

Смежные вопросы