这是关于删除一个链表的节点的功能,接下来是代码。
//delete List
int deleteList(PNODE pHead,int pos)
{
int i=0;
PNODE p=pHead->pNext;
//locate the position
while(p!=NULL && i<pos-1)
{
p=p->pNext;
i++;
}
if(i>pos-1 || p==NULL)
{
return 0;
}
PNODE q=p->pNext;
p->pNext=q->pNext;
free(q);
return 1;
}
我不知道以下代码是否有实际用途:
if(i>pos-1 || p==NULL)
{
return 0;
}
答案 0 :(得分:0)
您可以通过放弃i
上的检查来修改确定是否尝试拼接的条件。您的算法已经将p
指针正确放置在要拼接的节点之前的节点上。如果p
都不为空并且在拼接出来之后存在一个节点,您只想采取行动。
if (p==NULL || p->pNext==NULL)
{
return 0;
}
else
{
PNODE q=p->pNext;
p->pNext=q->pNext;
free(q);
return 1;
}
答案 1 :(得分:0)
以下是对代码的逐个解释。
1
int i=0;
PNODE p=pHead->pNext;
这会设置变量。我是索引来跟踪我们在链表中的位置,p是跟踪我们在链表中的节点。
2
while(p!=NULL && i<pos-1)
{
p=p->pNext;
i++;
}
这会遍历列表,直到它到达结尾(意味着传入的位置超出列表范围)或者它到达我们要删除的节点的位置(减1)。此时,我将成为pos - 1(我们要删除的元素的位置 - 1),并且p将成为我们要删除的节点之前的元素。
3
if(i>pos-1 || p==NULL)
{
return 0;
}
此代码检查我们是否确实在我们要查找的列表中找到了位置 - 如果我们在到达pos
之前用完了列表项,那么我们就不应该做任何事情。基本上,如果第2步到达列表的末尾而没有到达pos-1
,那么我们不想尝试删除任何内容,因为我们已经不在列表的末尾。
4
PNODE q=p->pNext;
p->pNext=q->pNext;
free(q);
return 1;
这是实际从列表中删除内容的代码。现在,p是我们要删除的节点之前的节点(我们在步骤2中将p设置为此节点)。因此,我们获取要删除的节点,并将其放在q
PNODE q=p->pNext;
在我们删除q之前,我们必须将链接列表重新组合在一起,因此我们必须将p的下一个节点设置为q的下一个节点p->pNext=q->pNext;
。基本上,如果我们有一个链接列表o->p->q->r
,我们只需将其更改为o->p->r
。一旦我们有了这个集合,我们就准备好删除q并返回成功。
答案 2 :(得分:0)
没有对参数进行健全性检查。其中一半是检查是否已传入负数,另一半是检查您是否未读过列表末尾。
如果你想要完全安全,你应该在取消引用它的成员之前检查pHead是否为空。