单向单链表的头插法是很容易实现的一种单链表插入新元素的途径。其函数功能如下:
typedef int data_t;
typedef struct linklist
{
data_t data;
struct linklist *next;
}Linklist; //定义的全局变量
void Linklist_insert_head(Linklist *head,data_t data)
{
Linklist *new = (Linklist *)malloc(sizeof(Linklist));
if(new == NULL)
{
perror("malloc");
return;
}
new->data = data;
new->next = NULL;
new->next = head->next;
head->next = new;
return;
}
若要按用户给定位置插入具有更高的泛用性,更加方便,功能比起头插法也要更完善,为实现按位置插入元素函数的实现,我编写了以下代码:
void Linklist_insert_pos(Linklist *head,int pos,data_t data)
{
Linklist *p = head;
int i=0;
while(i < pos)
{
p = p->next;
if(p == NULL)
{
return;
}
i++;
}
Linklist_insert_head(p,data); //调用头插法函数,把遍历到的p指针所在位置当作头
return;
}
其实头插法玩整理解就可以理解为固定在某个节点后插入,我们一般函数传参将一个单链表头节点作为这个固定节点,但实际上若将一个链表中的任意节点当作传入的参数,实现的就是在该节点后插入新元素。也就是说,所谓按位置插入,可以理解为找到该位置的上一位,把上一位当节点头头插。这样就实现了把原本较长的问题分解成两个简单的问题。
扩展到更广泛的情况,许多按数据处理和按位置处理的问题,其实按数据处理的问题可以分解为先找到这个数据所在位置,在按位置处理,因此其实只需要姐姐按位置处理的问题即可。