头结点和第0个结点之间插入新结点,即头插法,代码如下: int insert_dplink_list_1(node_t *phead,int data){
if(NULL == phead){
printf("入参为NULL\n");
return -1;
}
//创建新结点
node_t *pnew = NULL;
create_dplink_node_2(&pnew,data);
//头插到链表
pnew->next = phead->next;
pnew->front = phead;
if(NULL != phead->next)
{
phead->next->front = pnew;
}
phead->next = pnew;
return 0;
}
操作步骤:
1.创建新结点pnew;
2.将新结点的后继指针(即pnew->next)指向头结点的后继指针(phead->next)此处存储的是第0个结点的地址,可能是空指针(NULL)即pnew->next = phead->next;
3.再将新结点的前驱地址(即pnew->front)指向头结点的地址,即pnew->front = phead;
4.判断是否有第0个结点;
5.如果存在,则第0个结点的前驱指针指向新结点的地址,即phead->next->front = pnew;
6.最后,头结点的后继指针(phead->next)指向新结点的地址(pnew),即phead->next = pnew;
尾插法:
在双向链表的最后一个结点后面插入新结点,即尾插法,代码如下:
示例代码:
int insert_dplink_list_2(node_t *phead,int data){
if(NULL == phead){
printf("入参为NULL\n");
return -1;
}
//创建新结点
node_t *pnew = NULL;
create_dplink_node_2(&pnew,data);
//遍历链表,找到最后一个结点
node_t *ptemp = phead;
while(NULL != ptemp->next){
ptemp = ptemp->next;
}
ptemp->next = pnew;
pnew->front = ptemp;
return 0;
}
pnew;ptemp;ptemp->next = pnew;pnew->front = ptemp; int insert_dplink_list_3(node_t *phead,int pos,int data){
if(NULL == phead){
printf("入参为NULL\n");
return -1;
}
if(pos < 0){
printf("插入位置不合理,插入失败\n");
return -1;
}
node_t *ptemp = phead;
int i = 0;
for(i = 0; i < pos; i++){
if(NULL == ptemp->next){
break;
}
ptemp = ptemp->next;
}
if(i < pos){
printf("插入位置不合理,插入失败\n");
return -1;
}
//创建新结点
node_t *pnew = NULL;
create_dplink_node_2(&pnew,data);
pnew->next = ptemp->next;
pnew->front = ptemp;
if(NULL != ptemp->next)
{
ptemp->next->front = pnew;
}
ptemp->next = pnew;
return 0;
}
ptemp;pnew;头插法插入即可;