我正在使用链接列表来模仿书籍列表,并被要求创建一种功能,以使用作者的姓名和书名从列表中删除节点。我已经创建了一个工作功能,并且想知道是否有一种更干净的方法来进行我的工作(或更有效的方法?)。
这是我的代码:
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;
}
上面的代码可以工作,并且可以满足我的需要(至少在我运行的测试中),但是我对使用链表仍然很陌生,首先必须在铅笔/纸上浏览上面的代码以确保我没有犯任何错误。所以我想知道是否有一种更干净或更有效的方法从链表中删除节点?
此外,尽管在此作业中不需要。我想知道更改链接列表(例如检查空列表)时是否还有其他条件需要检查,而我在这里没有检查。