欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

链表插入、删除节点、查找节点

程序员文章站 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)非头结点要怎么改

相关标签: C/C++