向现有链表中插入结点,根据插入位置的不同,可分为以下 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,编译结果如下: