从链接列表中删除的更有效方法

时间:2018-11-10 17:10:29

标签: c pointers linked-list

我正在使用链接列表来模仿书籍列表,并被要求创建一种功能,以使用作者的姓名和书名从列表中删除节点。我已经创建了一个工作功能,并且想知道是否有一种更干净的方法来进行我的工作(或更有效的方法?)。

这是我的代码:

struct book* delete_from_list(struct book* list){
    if(list == NULL){       //handling an empty list
        printf("There are no books to delete.\n");
        return list;
    }

    //getting book info
    char title[TITLE_LEN], first[NAME_LEN], last[NAME_LEN];
    printf("\nEnter the title of the book: ");
    read_line(title, TITLE_LEN);
    printf("\nEnter the author's first name: ");
    read_line(first, NAME_LEN);
    printf("\nEnter the author's last name: ");
    read_line(last, NAME_LEN);

    struct book* cur = list;
    struct book* prev;
    //conditions for finding book
    bool c1 = strcmp(cur->title, title) == 0;
    bool c2 = strcmp(cur->first, first) == 0;
    bool c3 = strcmp(cur->last, last) == 0;

    for(cur; cur != NULL; prev = cur, cur = cur->next){
        if(c1 && c2 && c3){
            if(cur == list){ //first book in list
                list = cur->next;
                free(cur);
                return list;
            }else{
                prev->next = cur->next;
                free(cur);
                return list;
            }
    }
    printf("Unable to find book, to add a book use the 'a' command.\n");
    return list;
}

上面的代码可以工作,并且可以满足我的需要(至少在我运行的测试中),但是我对使用链表仍然很陌生,首先必须在铅笔/纸上浏览上面的代码以确保我没有犯任何错误。所以我想知道是否有一种更干净或更有效的方法从链表中删除节点?

此外,尽管在此作业中不需要。我想知道更改链接列表(例如检查空列表)时是否还有其他条件需要检查,而我在这里没有检查。

0 个答案:

没有答案