链表指定结点的插入

 向现有链表中插入结点,根据插入位置的不同,可分为以下 3 种情况:

  1. 插入到链表的头部,作为新的链表中第一个存有数据的结点(又称为”首元结点”);
  2. 插入到链表中某两个结点之间的位置;
  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,编译结果如下:

你可能感兴趣的:(链表)