我犯过的错
1.寻找尾节点:
//m为链表结构体指针 p为指向头节点地址的指针 该链表为单向不循环
1. for(m = p->next; m != NULL; m = m->next) // 此时的m为空,不能进行增删
2. for(m = p; m->next != NULL; m = m->next)//此时的m为尾节点,可以进行增删
第一种情况,m的任何操作都是对NULL进行的,所以要注意。
2.清除表的所有数据节点
//m为链表结构体指针 p为指向头节点地址的指针 该链表为双向循环
1.错误
for(m = p; m->next != p;) //循环进行删除操作,即更改指针指向,再释放空间
{
m->next->next->prev = m;
m->next = m->next->next;
free(m->next);
}
//原因:指针m和指针p都指向头节点的地址,而循环的操作只是m对链表操作,p的指向在m的操作的第一步就没有了
2.正确
for(m = p->next; m != p;m = p->next) //循环进行删除操作,即更改指针指向,再释放空间
{
m->next->prev = p;
p->next = m->next;
free(m);
}
个人认为:如果是操作 数据 或 数据节点本身,最好调用中间变量去操作数据节点本身,中间变量是防止链表断掉