2014-12-12 6 views
0

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

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 


typedef struct list_element{ 
    char passwort[100]; 
    int haufigkeit; 
    struct list_element *next; 
} list_element; 

typedef struct list{ 

    list_element *first; 
    list_element *last; 
} list; 


void init_list(list* mylist) 
{ 
    mylist->first=NULL; 
    mylist->last=NULL; 
} 


// Diese Funktion fügt Listenelemente am Anfang der Liste an 
void insert_front(list_element* le, list* mylist) 
{ 
    if(mylist->first == NULL){ 
     le->next = mylist-> first; 
     mylist->first=le; 
     mylist->last=le; 

     printf("%s %d \n",le->passwort, le->haufigkeit); 

    } 
    else { 
     le->next = mylist-> first; 
     mylist->first= le; 

    } 

    // printf("%s %d \n",le->passwort, &le->haufigkeit); 

} 

// Speicher für Listenelemente wieder freigeben 
void free_list(list* mylist) 
{ 
    free((mylist)->first); 
    free(mylist); 
    mylist=NULL; 
} 


// Namen, Zahlen Paare in Liste einlesen 
void read_data(char* filename, list* mylist) 
{ 
    assert(mylist != NULL); 
    FILE* f=fopen(filename,"rb"); 
    assert(f != NULL); 
    list_element* temp = malloc(sizeof(list_element));// * Speicher allozieren 

    while (fscanf(f,"%s %d",temp->passwort, &temp-> haufigkeit) != EOF) 
    { 

     fscanf(f,"%s %d",temp->passwort, &temp-> haufigkeit);// * Daten in list_element einlesen 
     printf("%s %d \n",temp->passwort, temp->haufigkeit); 

     insert_front(temp, mylist); // * insert_front benutzen um list_element in Liste einzufügen 

    } 
    fclose(f); 
} 

// Pivot finden, das die Liste aufteilt 
list_element* partition(list* input, list* left, list* right){ 
    list_element* pivot= input->first; 
    printf("hi"); 
    list_element *i; 
    for(i=input->first; i != NULL; i=i->next){ 

     if ((i -> haufigkeit) < (pivot -> haufigkeit)){ 
      insert_front(i, left); 
     } 
     else{ 
      insert_front(i, right); 
     } 

    } 

    return pivot; 
} 


// Hauptfunktion des quicksort Algorithmus 
void qsort_list(list* mylist){ 
    // HIER Code einfügen 
    // list liste= mylist; 
    list right; 
    list left; 
    init_list(&right); 
    init_list(&left); 
    list_element* pivot; 
    printf("hi11"); 
    if (mylist->last != mylist->first){ 
     printf("d1 \n"); 


     pivot = partition(mylist, &left, &right); 
     printf("pivot %s %d \n",pivot->passwort, pivot->haufigkeit); 

     qsort_list(&left); 
     qsort_list(&right); 
     /* 
     if(left.first == NULL){ 
     pivot->next = right.first; 
     mylist->first = pivot; 
     mylist->last = right.last; 
     } 
     else if(right.first == NULL){ 
     left.last-> next = pivot; 
     mylist->first = left.first; 
     mylist->last = pivot; 
     } 
     else{ 
     left.last->next=pivot; 
     pivot->next = right.first; 
     mylist->first = left.first; 
     mylist->last = right.last; 
     } 

     printf("pivot %s %d \n",pivot->passwort, pivot->haufigkeit); 
     } 
     /* mylist->first = left-> first; 
     mylist->last=right->last; 
     pivot->next=right->last; 
     left.last->next=pivot; 
     pivot->next=right.first; 
     */ 
     if(left.first == NULL) { 
      // Special 

      left.first = pivot; 
      mylist->first = left.first; 
     } else { 
      // REGULAR 
      mylist->first = left.first; 
      left.last->next = pivot; 
     } 
     if(right.first == NULL) { 
      // Special 
      pivot->next = right.first; 
      mylist->last = pivot; 
     } else { 
      // Regular 
      pivot->next = right.first; 
      mylist->last = right.last; 
     } 



    } 
} 

// Liste ausgeben 
void print_list(list* mylist){ 

    list_element* current = mylist-> first; 
    while(current != NULL){ 
     printf("%s %d \n",current->passwort,current->haufigkeit); 
     current=current->next; 
    } 
} 

// Argumente einlesen, Liste kreieren, verarbeiten und ausgeben 
int main(int argc, char** args) 

{ 
    if (argc != 2) 
    { 
     printf("Nutzung: %s <Dateiname>\n",args[0]); 
     return 1; 
    } 
    list mylist; 
    init_list(&mylist); 
    read_data(args[1],&mylist); 
    qsort_list(&mylist); 
    printf("Sortierte Liste:\n"); 
    print_list(&mylist); 
    free_list(&mylist); 
    return 0; 
} 

список TXT в «пароль частоты» формы, как

daniel 27720 
welcome 22204 
adobeadobe 27840 
superman 24499 
7777777 19818 
liverpool 18008 
princess 28132 
1qaz2wsx 22180 
+5

Я видел действительно аналогичный [код] (http://stackoverflow.com/questions/27444559/quicksort-on-single-linked-list) [дважды] (http://stackoverflow.com/questions/27434746/quicksort -on-single-linked-list) до ... Вы должны научиться использовать ваш отладчик, выполнять программу по очереди, где вы думаете, что проблема, наблюдать за значениями переменных ... – Leiaz

+1

Название предполагает, что вы будет использовать quicksort в этом связанном списке: это плохая идея. Используйте qs только для структур данных, которые обеспечивают произвольный доступ –

+0

Я согласен; mergesort, как правило, намного лучше подходит для ll. – WhozCraig

ответ

1

Ваша проблема начинается в read_data(): вы выделяете memofry только один единый list_element (temp) и перезаписать его содержание с каждой записью, которую вы читать из файла данных. Вы должны выделить отдельно list_element s для каждого.

1

Проблема в том, что ваш insert_front не будет работать, если следующий не равен NULL. Вы в конечном итоге устанавливаете список в NULL, который вы видите. У вас также нет способа узнать, что указывает на этот элемент. Строка списка должна содержать следующую точку, а также следующий указатель.

typedef struct list_element{ 
char passwort[100]; 
int haufigkeit; 
struct list_element *prev; 
struct list_element *next; 
} list_element; 

Вот новая версия вашего метода insert_front программы:

void insert_front(list_element* le, list* mylist) 
{ 
    if(mylist->first == NULL){ 
     mylist->first=le; 
     mylist->last=le; 
     le->prev = NULL; 
     printf("%s %d \n",le->passwort, le->haufigkeit); 

    } 
    else { 
     if (le->prev != NULL) { 
     le->prev->next = le->next; 
     }   
     le->next = mylist-> first; 
     mylist->prev = le 
     mylist->first= le; 

    } 

// printf("%s %d \n",le->passwort, &le->haufigkeit); 

} 

Это должно решить проблему, что вы видите.

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