Я работаю со связанным списком, чтобы имитировать список книг, и меня попросили создать функцию для удаления узла из списка, используя имя автора и название книги. Я создал рабочую функцию, и мне было интересно, есть ли более чистый способ делать то, что я делал (или более эффективный способ?).
Вот мой код:
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;
}
Приведенный выше код работает и выполняет то, что мне нужно (по крайней мере, в тех тестах, которые я выполнял), но я все еще очень плохо знаком с работой со связанными списками, и сначала мне пришлось пройтись по вышеуказанному коду на карандаше / бумаге. чтобы убедиться, что я не делал ошибок. Поэтому мне было интересно, есть ли более чистый или более эффективный способ удаления узла из связанного списка?
Дополнительно, пока это не требуется в этом назначении. Мне было интересно, есть ли другие условия, которые мне нужно было бы проверить при изменении связанного списка (например, проверка пустого списка), которые я не проверял здесь.