关于删除链表某一节点遇到的一些问题

  今天在对一个链表删除节点的过程中遇到一些问题,最终得到了解决并进一步加深了对链表的理解。

首先先创造出来链表如下

  lib1 * creatLinkerFromFile( const char * fileName) {
ifstream In(fileName);
int nCount;
In >> nCount;
lib1 *p1 = new lib1();
p1->next = nullptr;
lib1 * pT = p1;
for (int i = 0; i < nCount;i++) {
pT->next = new lib1();
pT = pT->next;
In >> pT->nscore1[0] >> pT->nscore1[1] >> pT->stuName >> pT->stuNum;
}
pT->next = nullptr;
In.close();
return p1;

}

图片为所对应的文档


之后写删除平均分以下的同学如下

void deleteStuUnderSocre(lib1 * pH) {
double total=0;
double nCount = 0;
double total_aver;
lib1 * pT = pH->next;
while (nullptr != pT) {
total += (pT->nscore1[0] + pT->nscore1[1]);
nCount++;
pT = pT->next;
}
total_aver = total / nCount;
lib1 * pTa = pH;
lib1 *pTb = pH->next;
while (nullptr != pTb) {
double Stu_score = pTb->nscore1[0] + pTb->nscore1[1];
if (Stu_score < total_aver) {
pTa->next = pTb->next;
delete pTb;
pTb = pTa->next;
}
else {
pTa = pTa->next;
pTb = pTb->next;
}
}

}

这个是成功的版本,其中重点解释一下关于

if (Stu_score < total_aver) {
pTa->next = pTb->next;
delete pTb;
pTb = pTa->next;
}
else {
pTa = pTa->next;
pTb = pTb->next;

扫描二维码关注公众号,回复: 3107999 查看本文章

}

此部分的语句的原因,由于pTa和ptb分别是指向ph和ph->next,所以在删除ptb时,为了保证链表的连续性并且下一步的可行性,必须把pta和ptb都向后移动(无论是否符合条件),如果符合条件删除了那一部分,在先把pta->next向指向ptb->next,然后执行删除,之后把ptb指向pta的next部分,也就时原来ptb的下一个节点,这样就可以维持原本的pta->next指向ptb的条件,也就是ph->next时指向ph->next的,满足这个条件才能实现链表的连续性和完整性。


猜你喜欢

转载自blog.csdn.net/Victor145/article/details/80469827