链表插入、删除节点、查找节点
程序员文章站
2022-06-20 20:29:12
...
文章目录
概述
代码的背景是这样的,一个链表,里面存着图书的信息,图书的信息有书名,作者姓名,出版社,年份,按字典序升序排列,按书名的关键字删除和查找书本信息。
typedef struct info{
char book_name[maxbookname];
char writer[max_writer_name];
char press[max_press];
char year[year_len];
struct info *next;
}book;
typedef book* bookptr;
bookptr first=NULL,cur,pre,tempptr;
一、按字典序插入
void add(bookptr a){
//下面这个if是为了防止原链表为空
if(!first){
first=a;
return;
}
//判断头节点是否需要改变
if(strcmp(first->book_name,a->book_name)>0){
a->next=first;
first=a;
return;
}
//从第二个节点开始往后跑,记录前驱节点
pre=first;
cur=first->next;
while(cur!=NULL&&strcmp(cur->book_name,a->book_name)<0){
pre=cur;
cur=cur->next;
}
pre->next=a;
a->next=cur;
}
二、按关键字删除节点
void delete(char keyword[]){
//先看要不要删除头节点
while (first&&strstr(first->book_name,keyword)){
first=first->next;
}
//如果当前链表没有清空,那就接着往后跑,记录前驱节点
if(first){
for(pre=first,cur=first->next;cur!=NULL;){
if(strstr(cur->book_name,keyword)){
pre->next=cur->next;
free(cur);
cur=pre->next;
}
else{
pre=cur;
cur=cur->next;
}
}
}
}
三、按关键字查找节点
void find(char keyword[]){
for(cur=first;cur!=NULL;cur=cur->next){
if(strstr(cur->book_name,keyword)!=NULL){
printf("%-50s%-20s%-30s%-10s\n",cur->book_name,cur->writer,cur->press,cur->year);
}
}
}
四、总结
1.插入的几个注意点如下:
1)当前待插入链表是否为空
2)链表插要不要插在当前头节点的前面,即更换头节点
3)节点插在第二个节点或者往后的位置又该怎么做
2.删除的几个注意点如下:
1)要不要删第一个点
2)往后怎么删除
3.从这道题的情况来看,比较复杂的就是添加和删除节点,也就是需要改动链表的结构;而最容易出错的还是添加节点那里
4.总之就是,需要改动链表结构时,有3个注意点
1)链表是不是空的
2)头节点要怎么改
3)非头结点要怎么改
上一篇: 双向链表的查找、删除、插入节点
下一篇: 操作DOM(一):创建节点、插入节点
推荐阅读
-
jquery删除节点的方法(js阻止事件冒泡的方法)
-
js删除节点的方法(删除节点相关方法)
-
利用vue.js插入dom节点的方法
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
节点的插入之append()和appendTo()的用法介绍
-
jQuery:节点(插入,复制,替换,删除)操作
-
html5中JavaScript removeChild 删除所有节点
-
添加、删除、替换以及插入节点的方法
-
python实现单链表中删除倒数第K个节点的方法
-
jQuery中DOM节点的删除方法总结(超全面)