请问下列程序在删除节点时一定要用pt指针吗

问题描述:

请问下列程序在删除节点时一定要用pt指针吗
Status PolyDifferential(LinkedPoly &L)
{
LinkedPoly p,q,pt;
q=L;
p=L->next;
while(p!=L){
if(p->data.exp==0){
pt=p;
p=p->next;
q->next=p;
free(pt);
//为什么在删除这个结点时要先用pt指向它?
}
else{
p->data.coef=p->data.coef*p->data.exp;
p->data.exp--;
q=p;
p=p->next;
}
}
return OK;
}
如果在删除结点时用
p->next=q->next;
free(q);
q=p->next;代替
pt=p;
p=p->next;
q->next=p;
free(pt);
有什么不好?
写错了是用q->next=p->next;
free(p);
p=q->next;代替
1个回答 分类:综合 2014-10-27

问题解答:

我来补答
q->next=p->next;
   free(p);
   p=q->next;这里你把p释放了以后,p怎么还能指向下一个节点?所以你要多定义一个节点来表示待删除节点 1.我们必须知道对哪个链表进行操作,所以表头指针head是必须知道的.2.一般来说,待删除的结点是由结点的数据确定的.然而我们还要操作待删除结点之前的结点(或指针),以连接前后两段链表.3.令pGuard指针为待删除结点的前趋结点指针.由于要对待删除结点作内存释放,需要有一个指针p指向待删除结点.4.如果待删除结点为头结点,则我们要操作表头head,作为特殊情况处理.(你这里没有考虑)5.在删除结点的过程中,仍然要始终保持所有的结点都在我们的控制范围内,保证链表的完整性.为了达到这一点,我们还是采用先连后断的方式:先把待删除结点的前趋结点和它的后继结点连接,再把待删除结点与它的后继结点断开,并释放其空间.
再问: 先把前一个节点的next指向p的next 释放p指针所指地址后,这个指针不是还能用吗?所以它还可以指向新的p结点 保证链表的完整性有什么实际意义,先断开链表再接上有什么坏处?
再答: 你free(p)后怎么找到前一个节点?你的p就是用来找到待删除节点的前一个节点,如果不是就p->next
再问: q存了p前面的结点,要删除p的话先用q->next=p->next 然后free(p), 之后p=q->next 这样也可以让p找到下一个节点 前一个节点用q来存
再答: q得到待删除节点,然后释放它所在的内存,你多看几遍书吧画一遍图,不然我怎么讲也没用
 
 
展开全文阅读
剩余:2000