程序以错误的方式对数据进行排序

时间:2017-01-21 15:29:27

标签: c

我必须为学校开设一个项目,这里是Program description

您可以在程序说明中看到我必须按标签对书籍进行排序。现在由于某种原因,不属于特定标签的书籍印在该标签下。 For exemple Plato is printed under medival

我找不到我犯了什么错误,我将不胜感激任何帮助。

这是我的代码:

#define _CRT_SECURE_NO_WARNINGS

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <stdio.h>
#include <string.h>

typedef struct BOOK Book;
struct BOOK
{
    char *author;
    char *title;
    Book *next;
};

typedef struct LABEL Label;
struct LABEL
{
    char *text;
    Label *next;
    Book *books;
};

void clear(Label** head);
void addLabel(Label **head, Label *elem);
void addBook(Book **head, Book **elem);
void readFromFile(char *fileName, char *outputFileName, Label *Ihead);
void saveBooks(FILE *file, Book *head);
void saveLabels(FILE *file, Label *Ihead);
void saveToFile(char *fileName, Label *Ihead);
void ComandConsole(int argc, char* argv[], int* fileinput, int* fileoutput);
Label* checkIfExists(Label **head, char *labelText);


Label* checkIfExists(Label **head, char *labelText)
{
    Label *tmp = *head;
    while (tmp != NULL)
    {
        if (strcmp(labelText, tmp->text) == 0)
            return tmp;

        tmp = tmp->next;
    }
    return NULL;
}

void addLabel(Label **head, Label *elem)
{

    Label *temp = NULL;

    if ((temp = checkIfExists(head, elem->text)) == NULL)
    {
        if (*head == NULL)
        {
            *head = elem;
            return;
        }

        temp = *head;

        while (temp->next != NULL)
        temp = temp->next;
        temp->next = elem;

    }
    else
        addBook(&(temp->books), &(elem->books));

}

void addBook(Book **head, Book **elem)
{

    Book *pom = *head;

    if (strcmp(pom->author, (*elem)->author) > 0)
    {
        (*elem)->next = (*head)->next;
        *head = *elem;
        *elem = pom;
        (*head)->next = *elem;
        return;
    }


    while (pom->next != NULL && (strcmp((*elem)->author, pom->author) > 0))
    pom = pom->next;

    (*elem)->next = pom->next;
    pom->next = *elem;

}

void readFromFile(char *fileName, char *outputFileName, Label *head)
{
    FILE* input;
    if ((input = fopen(fileName, "r")) == NULL)
    {
        printf("Reading failed!\n");
        exit(1);
    }


    char buf[255];
    while (fgets(buf, sizeof buf, input) != NULL)
    {

        Book *ksiazka = (Book*)malloc(sizeof(Book));
        ksiazka->next = NULL;

        char *store = strtok(buf, ";");

        char * autor = (char*)malloc(sizeof(char)*strlen(store) + 1);
        strcpy(autor, store);
        ksiazka->author = autor;

        store = strtok(NULL, ";");
        char * tytul = (char*)malloc(sizeof(char)*strlen(store) + 1);
        strcpy(tytul, store);
        ksiazka->title = tytul;

        store = strtok(NULL, "\n");
        char * label = (char*)malloc(sizeof(char)*strlen(store) + 1);
        strcpy(label, store);

        char *tmp = strtok(label, ",\n");
        while (tmp != NULL)
        {

            Label *newLabel = (Label*)malloc(sizeof(Label));
            newLabel->books = NULL;
            newLabel->next = NULL;

            char *labelText = (char*)malloc(sizeof(char)*strlen(tmp) + 1);
            strcpy(labelText, tmp);
            newLabel->text = labelText;
            newLabel->books = ksiazka;
            addLabel(&head, newLabel);
            tmp = strtok(NULL, ",\n");
        }
    }

    saveToFile(outputFileName, head);

    fclose(input);
}

void clear(Label** head)
{
    while (*head != NULL)
    {
        Label* cur = *head;

        *head = (*head)->next;

        Book* a = cur->books;

        while (a != NULL)
        {
            Book* b = a;
            a = a->next;
            free(b->author);
            free(b->title);
            free(b);
        }

        free(cur->text);

        free(cur);
    }
}

void saveBooks(FILE *file, Book *head)
{
    Book *tmp = head;
    while (tmp != NULL)
    {
        fprintf(file, "%s, %s\n", tmp->author, tmp->title);
        tmp = tmp->next;
    }
    fprintf(file, "\n");
}


void saveLabels(FILE *file, Label *head)
{
    Label *tmp = head;
    while (tmp != NULL)
    {
        fprintf(file, "%s:\n", tmp->text);
        if (tmp->books != NULL)
        {
            saveBooks(file, tmp->books);
        }
        tmp = tmp->next;
    }


}

void saveToFile(char *fileName, Label *head)
{
    FILE *output;
    if ((output = fopen(fileName, "w")) == NULL)
    {
        printf("Writing failed!\n");                                        
        exit(1);
        //clear(&head);
    }
    else
    {
        saveLabels(output, head);
    }

    //clear(&head);

    fclose(output);
}

void ComandConsole(int argc, char* argv[], int* fileinput, int* fileoutput)
{
    int i;

    for (i = 1; i < argc; i++)
    {
        if (argv[i][0] == '-')
            switch (argv[i][1])
            {
            case 'i':
            {
                i++;
                if (i == argc) break;
                *fileinput = i;
            }
            break;

            case 'o':
            {
                i++;
                if (i == argc) break;
                *fileoutput = i;
            }
            break;

            default:
            {
                printf("Wrong parameter");
            } break;

            }
    }
}

int main(int argc, char* argv[])
{
    int fileinputname = 0;
    int fileoutputname = 0;
    ComandConsole(argc, argv, &fileinputname, &fileoutputname);

    if (fileinputname == 0 || fileoutputname == 0)
    {
        printf("Wrong parrametes");
        getchar();
        return 1;
    }

    Label *head = NULL;
    readFromFile(argv[fileinputname], argv[fileoutputname], head);


    _CrtDumpMemoryLeaks();

    return 0;
}

0 个答案:

没有答案