概述
代码的背景是这样的,一个链表,里面存着图书的信息,图书的信息有书名,作者姓名,出版社,年份,按字典序升序排列,按书名的关键字删除和查找书本信息。
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);
}
}
}
四、输出链表每个节点的内容
//输出到文件里面
void print_link(wordptr head,char * s){
wordptr p;
FILE *out = fopen(s,"w");
for(p=head;p!=NULL;p=p->next){
fprintf(out,"%s",p->a);
}
}
//输出到控制台
void print_link(wordptr head){
wordptr p;
for(p=head;p!=NULL;p=p->next){
printf("%s",p->a);
}
}
五、遍历链表,并输出链表的内容
void print_link(wordptr head){
wordptr p;
for(p=head;p!=NULL;p=p->next){
printf("%s",p->a);//这里就是输出链表节点的内容,可以自行更改
}
}
最后、总结
1.插入的几个注意点如下:
1)当前待插入链表是否为空
2)链表插要不要插在当前头节点的前面,即更换头节点
3)节点插在第二个节点或者往后的位置又该怎么做
2.删除的几个注意点如下:
1)要不要删第一个点
2)往后怎么删除
3.从这道题的情况来看,比较复杂的就是添加和删除节点,也就是需要改动链表的结构;而最容易出错的还是添加节点那里
4.总之就是,需要改动链表结构时,有3个注意点
1)链表是不是空的
2)头节点要怎么改
3)非头结点要怎么改