void linklist_inverse(node_t **p) //链表逆置
{
node_t *tmp, *tmp1;
if(is_empty(*p)) //判空
return;
tmp1 = tmp = (*p)->next; //tmp和tmp1分别指向第一个有效节点
(*p)->next = NULL;
//将表头和链表节点断开,这一步很重要,如果不断开,
//会出现链表逆置前的部分仍处在链表后面半部分,没有断开
while(tmp1)
{
tmp = tmp1;
tmp1 = tmp1->next;
//这两行要写上面,否则第一次循环时,由于p->next = NULL,tmp->next = p->next;
//就会把tmp->next置NULL,tmp和tmp1指向同一块地址,所以tmp1->next = NULL,
//程序由于while(tmp1)条件不成立,退出,链表最后只剩第一个节点p->next了
tmp->next = (*p)->next;
(*p)->next = tmp;
}
}