排序和显示链接列表

时间:2015-12-07 16:37:37

标签: c data-structures

我正在编写一个图书馆管理程序,用户可以在其中将图书添加到数据库中,这意味着该程序将获取用户的输入并将其存储到文本文档中。然后,当程序启动时,它将读取存储所有书籍的文本文档,并构建一个链表,其中每本书都是一个节点。所以,我已经能够达到可以读取文本文件并将值存储到节点中的程度。但是,当我尝试测试bookList函数以按标题查看整个图书列表时,我的程序崩溃了。这是代码:

void loadingMenu(){

    FILE *fp = fopen(filename, "r");

    int lines = 0;
    char line[254];

    char *ti = malloc(MAX_STR_LEN);
    char *au = malloc(MAX_STR_LEN);
    char *ca = malloc(MAX_STR_LEN);
    char *id = malloc(MAX_STR_LEN);
    char *ti_chopped;
    char *au_chopped;
    char *ca_chopped;
    char *id_chopped;

    int id_num;

    struct node *tempNode;
    while(fgets(line, sizeof(line), fp)){

        if(line == 'EOF'){
            break;
        }
        if(lines == 7){
           lines = 0;
        }
        if(lines == 0){
            line[strcspn(line, "\n")] = 0; // remove '\n' from string
            strcpy(ti, line);
        }
        else if(lines == 1){
            line[strcspn(line, "\n")] = 0;
            strcpy(au, line);
        }
        else if(lines == 3){
            line[strcspn(line, "\n")] = 0;
            strcpy(ca, line);
        }
        else if(lines == 6){
            line[strcspn(line, "\n")] = 0;
            strcpy(id, line);
        }
        lines++;

        if(lines == 6){
            // removing the identifiers from each string
            ti_chopped = ti + 6;
            au_chopped = au + 7;
            ca_chopped = ca + 9;
            id_chopped = id + 3;

            id_num = atoi(id_chopped);

            // ------create book node------------
            tempNode = malloc(sizeof *tempNode);
            // ----------------------------------
            tempNode->next = NULL;
            tempNode->titleptr = malloc(strlen(ti_chopped) + 1);
            strcpy(tempNode->titleptr, ti_chopped);

            tempNode->authorptr = malloc(strlen(au_chopped) + 1);
            strcpy(tempNode->authorptr, au_chopped);

            tempNode->categoryptr = malloc(strlen(ca_chopped) + 1);
            strcpy(tempNode->categoryptr, ca_chopped);

            tempNode->id = id_num;

            //printf("%d", tempNode->id);
            head = addNode(head, tempNode);
        }
    }

    fclose(fp);

}


int compareNode(struct node *n1, struct node *n2){

    int compareValue = strcmp(n1->titleptr, n2->titleptr);

    if(compareValue == 0){
        return 0;
    }
    else if(compareValue < 0){
        return -1;
    }
    else {
        return 1;
    }
}

struct node *addNode(struct node *list, struct node *node1){

    struct node* tmp = list;

    if(list == NULL){
        return node1;
    }
    if(compareNode(node1,list) == -1){
        node1->next = list;
        list = node1;
        return list;
    }
    else
    {
        struct node* prev = list;
        while(tmp != NULL && compareNode(node1, tmp) >= 0){
            prev = tmp;
            tmp = tmp->next;
        }
        prev->next = node1;
        node1->next = tmp;
        return list;
    }

}

void bookList(){

    system("cls");
    struct node *tmp;
    tmp = head;

    printf("List of all Books: ");

    while(tmp != NULL)
    {
        printf("%s\n", tmp->titleptr);
        tmp = tmp->next;
    }

    printf("\n\nEnd of list.");
}

首先,我想为糟糕的代码道歉,同时我也删除了程序中的一些内容,并将所涉及的功能留在后面。

所以,如果你能帮助我,或者至少指出我正确的方向,我将非常感激。此外,如果您有任何编码提示或评论,请告诉我,我总是渴望学习!

编辑:代码现在运行,列表将打印,但字符串不会按字母顺序排列。目前正试图解决这个问题。

1 个答案:

答案 0 :(得分:1)

在第一个addNode()函数中,您需要设置上一个指针。这应该可以解决问题。

if(compareNode(node1,list) == -1)
{
        node1->next = list;
        list->prev = node1;
        list = node1;
        return list;
}