作业帮 > 综合 > 作业

关于数据结构线性链表中的指针后移和删除结点的疑问

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/11/08 06:12:55
关于数据结构线性链表中的指针后移和删除结点的疑问
我想问问指针后移和删除元素是不是一回事?
比如在线性链表中有三个结点A、B、C
A指向B,B指向C
那么A->next=A->next->next;(删除B结点,这里我想问问,是不是这儿一定要加个free(B)才算删除B结点?)
与B=B->next;(指针后移)
是不是都是一回事,把B结点删除了.
假如是一回事的话,那么算法
Status Insert(LinkList &L,int i,int b)//在无头结点链表L的第i个元素之前插入元素b
{
p=L;
q=(LinkList*)malloc(sizeof(LNode));
q.data=b;
if(i==1)
{
q->next=p;
L=q; //插入在链表头部
}
else
{
while(--i>1)
p=p->next;
q->next=p->next;
p->next=q; //插入
}
}//Insert
里面的
while(--i>1)
p=p->next;
实际上也就是在一直删除结点咯?
那不就是做了多余的事情吗?要求的只是“在无头结点链表L的第i个元素之前插入元素b”,可结果插入是插入了,却删除了许多的结点.
十分不解,期待回答.(是在没分了,想给也给不了.)
是不是这样一回事
A->next是存储了结点A的后继结点的位置.
那么 A->next =A->next->next的意思就是改变了这个位置,A的后继结点变成了C.
而B=B->next,就是让指针B指向了B的后继结点,但因为A的指针域无变化,所以B仍然是A的后继结点.
最后我还想问个问题,两个结点之间比如一个结点A和B,只要A->next所储存的是B的位置,无论有没有指针指向B,B就是A的后继结点.
那么A->next=A->next->next;(删除B结点,这里我想问问,是不是这儿一定要加个free(B)才算删除B结点?)
首先 A->next =A->next->next 意思只是将A的指针指向C 不是说 删除B B在内存中还是存在的 只是和A C失去了前后继的关系 用free 来释放B节点
而后面的p=p->next 不是删除节点,而是使得指针p向后移动 明白吗