链表基本操作集合

概述

代码的背景是这样的,一个链表,里面存着图书的信息,图书的信息有书名,作者姓名,出版社,年份,按字典序升序排列,按书名的关键字删除和查找书本信息。

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)非头结点要怎么改

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值