在删除一个单链表的一个数据成员时,大家都应该很清楚得有个头,就说说简单的尾删吧,你的做法一定是这样子:phead位置向后一直找到尾巴的前一个位置,将他的next改为NULL,然后释放掉尾巴就ok;看似简单问题还是用到了phead,因为你至少得让可动指针指向准备删除这个成员的前一个成员身上。
中间删,就是从头找到要删的成员之前成员身上,问题还是在phead,也许你会这么想,直接给定你位置,不久可以不用phead从头开始再挨个挨个找那个位置了呀!但是敏感的人都知道,要是问题要删除的是p后面那个元素,那么问题就很简单了吧!
(但是问题就让你删除p)如果你直接删除p那么这个单链表就断了,你如果先不删,准备把上一个的next指过来,但是单链表没有前驱,找不到上一个成员。而且也没有phead来寻找上一个成员。那么现在我来教你一种很经典的办法!
办法:
你将p->data的值用p->next->data覆盖ok;一次类推将后面的都要往前覆盖,记得释放掉最后一个结构体,不然内存泄漏。
代码:
bool destory_link_list_ex(NODE *phead)
{
elem_type e = 0;
int m = get_length(phead);
if(phead == NULL)
{
return false;
}
for(int i = 0;i < m ;i ++)
{
delete_head(phead,&e);
}
free(phead);
return true;
}
bool del_no_head(NODE *p)
{
NODE *s = p->next;
if(p == NULL)
{
return false;
}
while(s->next != NULL)
{
p->data = s->data;
p = s;
s = s->next;
}
p->data = s->data;
p->next = NULL;
destory_link_list_ex(s);
return true;
}
代码就是这样子,是不是很经典。