假如要在A之前插入一个节点D,那么只需修改1st和5th的值即可。对链表的插入删除的操作其实就是对“橙黄色的变量“里的值得修改,为了顺序访问”橙黄色的变量“,定义一个变量p来遍历他们(橙黄色变量是node*类型,那么p就是node**类型)。
// 一般1st这个变量我们会取名叫head,那么p的初始化式就是
node ** p = &head;
// 遍历操作就是
while(p)
{
p = &((*p)->next);
}
当p分别指向1st 2nd 3rd 4th的时候,*p 分别指向A B C NULL
/*
* p node * entry = *p
* 1st A
* 2nd B
* 3rd C
* 4th NULL
*/
下面是插入算法的实现:
void insert(node ** pfirst, node * pnew, int (*if_insert)(node *))
{// 向单链表中插入一个节点
node ** p = pfirst;
while(p)
{
node * entry = *p;
if( if_insert(pnew, entry) )
{
*p = pnew;
pnew->next = entry;
return;
}
}
}// 向单链表中插入一个节点
/*
* 这里假设链表的data域从小到大有序
* 要求链表的insert操作后扔有序
*/
int if_insert(node *pnew, node *entry)
{
if(!entry || pnew->data <= entry->data) // 注意,如果*p为NULL,那么此时要插入新节点了(处理的在表头和表尾插入的情况)
return 1;
return 0;
}