对于在链表指定位置插入数据我们可以分两种情况进行分析。
假设一个链表: ①->②->③->④ 需要在链表插入一个新数据new:101。
(1)在指定节点后方插入。
假设我们需要在3的后面插入一个101,那么思路就非常清晰了,
第一步:找到你要在哪个数据前插入(这里是3);
第二步:让新节点的下一个等于3的下一个。 // new->next = 3->next
第三步:让3的下一个等于新节点。 // 3->next = new
图示解析:
首先定义一个新节点(100):
struct Test new = {101,NULL};
然后定义一个函数实现从3的后面插入:
int InsetDataFromBehind(struct Test *head,int data,struct Test *new)
{
struct Test *point;
point = head;
while(point != NULL){
if(point->data == data){
new->next = point->next;
point->next = new;
return 1;
}
point = point->next;
}
return 0;
}
参数说明:首先就是链表头,然后就是你要在哪个数后面插入,最后就是你要插入的数据。
完整代码:
#include <stdio.h>
struct Test
{
int data;
struct Test *next;
};
void printLink(struct Test *head)
{
struct Test *point;
point = head;
while(point != NULL){
printf("%d ",point->data);
point = point->next;
}
printf("\n");
}
int GetLinkNode(struct Test *head)
{
int cnt = 0;
struct Test *point;
point = head;
while(point != NULL){
cnt++;
point = point->next;
}
return cnt;
}
int SeachSomeData(struct Test *head,int data)
{
struct Test *point;
point = head;
while(point != NULL){
if(point->data == data){
return 1;
}
point = point->next;
}
return 0;
}
int InsetDataFromBehind(struct Test *head,int data,struct Test *new)
{
struct Test *point;
point = head;
while(point != NULL){
if(point->data == data){
new->next = point->next;
point->next = new;
return 1;
}
point = point->next;
}
return 0;
}
int main()
{
int i;
int arry[3] = {1,2,3};
printf("this is arry print:\n");
for(i=0;i<sizeof(arry)/sizeof(arry[0]);i++){
printf("%d ",arry[i]);
}
printf("\n");
struct Test t1 = {1,NULL};
struct Test t2 = {2,NULL};
struct Test t3 = {3,NULL};
struct Test t4 = {4,NULL};
struct Test new = {100};
t1.next = &t2;
t2.next = &t3;
t3.next = &t4;
printLink(&t1);
int ret1;
ret1 = GetLinkNode(&t1);
printf("total node is: %d\n",ret1);
printf("this is beforInset\n");
printLink(&t1);
printf("this is afterInset\n");
InsetDataFromBehind(&t1,2,&new);
printLink(&t1);
return 0;
}
运行结果:
(2)在指定节点前方插入。
在指定节点前方插入又要考虑两种情况:第一种就是在头节点的前方插入,第二种就是正常不是头节点。
2.1:从头节点前方插入就相对简单,只需要让new->next=head,然后返回新的头节点就行了。要返回头节点那么函数就应该返回一个结构体指针,如果不这样你就定义一个二级指针,保存头节点的地址,但是相对麻烦,且不容易理解,所以我们返回一个结构体指针。
头节点前插入图示:
不是头节点前插入:
那么就要判断point->next 是否为空,因为如果在最后一个,你只判断point->data就没有意义,
因为他末尾后就没了数据,就无法插入,
代码展示:
struct Test* InsertDataBefor(struct Test *head,int data,struct Test *new2)
{
struct Test *point;
point = head;
if(point->data == data)
{
return new2;
}
while(point->next != NULL){
if(point->next->data == data){
new2->next = point->next;
point->next = new2;
printf("inset ok\n");
return head;
}
point = point->next;
}
printf("no data which you want\n");
return head;
}
运行结果:
注:我是把前面代码也放在一起的。学了一段时间了,自行查看,有问题留言!!!!