向现有链表中插入结点,根据插入位置的不同,可分为以下 3 种情况:
- 插入到链表的头部,作为新的链表中第一个存有数据的结点(又称为”首元结点”);
- 插入到链表中某两个结点之间的位置;
- 插入到链表的最末端的位置;
使用头插法和尾插法可分别解决第 1 和第 3 种情况,但是无法解决第 2 种情况,所以本节给大家一段通用代码,可有效解决所有链表结点插入的问题。(分为节点前和节点后)
节点后插入
节点后插入分为以下几个步骤:
1.通过查找代码找到指定节点;
2.定义一个新节点,将指定节点的下一个节点地址赋给新节点;
3.将新节点地址赋给指定节点的下一个节点。
定义一个查找函数
int searchLink(struct Test *head,int Data)
{
        while(head != NULL)
        {
                if(head->Data == Data)//输入的节点值刚好等于链表节点值
                {
                        return 1;
                }
                head = head->next;
        }
        return 0;
}
定义一个节点后插入函数
int insertFronBehind(struct Test *head,int Data,struct Test *new)
{
        struct Test *p = head;
        while(p != NULL)
        {
                if(p->Data == Data)
                {
                        new->next = p->next;//指定节点的下一个节点地址赋给新节点
                        p->next = new;//将新节点地址赋给指定节点的下一个节点
                        return 1;
                }
                p=p->next;
        }
        return 0;
}
主函数中创建一个新节点并调用以上两个函数
        struct Test new={99,NULL};
        printLink(&t1);
        puts("after insert behind");
        insertFronBehind(&t1,3,&new);
        printLink(&t1);
这里是在原链表第三个节点处插入一个99,编译结果如下

节点前插入
节点前插入分为以下两种情况:
第一种是链表头插入,则链表头插入的地址改变了整个链表的地址,所以链表头插入的地址可以作为整个链表首地址,同时往下延申即可,就可以得到链表中的所有数据;
第二种是链表中插入,链表中插入的步骤是:
1.若p节点的下一个节点数据等于要插入的节点数据,则将插入的节点地址赋给新节点;
2.将p节点地址赋给新节点。
定义一个查找函数
int searchLink(struct Test *head,int Data)
{
        while(head != NULL)
        {
                if(head->Data == Data)//输入的节点值刚好等于链表节点值
                {
                        return 1;
                }
                head = head->next;
        }
        return 0;
}
定义一个节点前插入函数(分两种情况)
struct Test* insertFromfor(struct Test *head,int Data,struct Test *new)
{
        struct Test *p = head;
        if(p->Data == Data)//p的地址刚好的输入的地址,即链表头插入
        {
                new->next = head;
                return new;
        }
        while(p->next != NULL)//p的下一个不为空指针,如果为空指针就跳出循环,判断是不是在链表头
        {
                if(p->next->Data == Data)//p的下一个节点数据等于插入节点数据
                {
                        new->next=p->next;//p下一个节点地址给新节点
                        p->next=new;//新节点地址给p
                        printf("Insert ok\n");
                        return head;
                }
                p=p->next;
        }
        printf("No this data%d\n",Data);
        return head;
}
主函数创建一个新节点调用上面两个函数
        struct Test new1={111,NULL};
        struct Test *head=NULL;
        head = &t1;//若为链表头,则需要作为链表首地址;若不为链表头,就从t1正常输出
        printLink(head);
        head=insertFromfor(head,3,&new);
        printLink(head);
这里是在3前面插入一个111,编译结果如下:








![[架构之路-251/创业之路-82]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 商业智能、决策支持系统、知识管理](https://img-blog.csdnimg.cn/5ea1150dabd8486295b0dd77167ed22e.png)











