Более эффективный метод удаления из связанного списка - PullRequest
0 голосов
/ 10 ноября 2018

Я работаю со связанным списком, чтобы имитировать список книг, и меня попросили создать функцию для удаления узла из списка, используя имя автора и название книги. Я создал рабочую функцию, и мне было интересно, есть ли более чистый способ делать то, что я делал (или более эффективный способ?).

Вот мой код:

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;
}

Приведенный выше код работает и выполняет то, что мне нужно (по крайней мере, в тех тестах, которые я выполнял), но я все еще очень плохо знаком с работой со связанными списками, и сначала мне пришлось пройтись по вышеуказанному коду на карандаше / бумаге. чтобы убедиться, что я не делал ошибок. Поэтому мне было интересно, есть ли более чистый или более эффективный способ удаления узла из связанного списка?

Дополнительно, пока это не требуется в этом назначении. Мне было интересно, есть ли другие условия, которые мне нужно было бы проверить при изменении связанного списка (например, проверка пустого списка), которые я не проверял здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...