Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于链表的几个问题_C_Algorithm - Fatal编程技术网

C 关于链表的几个问题

C 关于链表的几个问题,c,algorithm,C,Algorithm,这是一个关于删除一个链表的节点的函数,接下来是代码 //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

这是一个关于删除一个链表的节点的函数,接下来是代码

//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;
}

您可以通过取消选中
i
来修改条件,以确定是否尝试拼接。您的算法已将
p
指针正确放置在要拼接的节点之前的节点上。只有当
p
都不为null并且在其后面存在要拼接的节点时,才需要执行操作

if (p==NULL || p->pNext==NULL)
{
    return 0;
}
else
{
    PNODE q=p->pNext;
    p->pNext=q->pNext;
    free(q);
    return 1;
}

您可以通过取消选中
i
来修改条件,以确定是否尝试拼接。您的算法已将
p
指针正确放置在要拼接的节点之前的节点上。只有当
p
都不为null并且在其后面存在要拼接的节点时,才需要执行操作

if (p==NULL || p->pNext==NULL)
{
    return 0;
}
else
{
    PNODE q=p->pNext;
    p->pNext=q->pNext;
    free(q);
    return 1;
}

下面是对代码的一个逐块解释

一,

这将设置变量。I表示索引,用于跟踪我们在链表中的位置,p表示跟踪我们在链表中的节点

二,

这段代码检查我们是否真的找到了我们要查找的列表中的位置——如果在到达
pos
之前列表项用完了,那么我们不应该做任何事情。基本上,如果第2步到达列表末尾时没有到达
pos-1
,那么我们不想尝试删除任何内容,因为我们已经超出了列表末尾

四,

这是实际上从列表中删除内容的代码位。现在,p是要删除的节点之前的节点(我们在步骤2中将p设置为该节点)。因此,我们得到想要移除的节点,并将其放入
q
中,使用
pnodeq=p->pNext


在我们删除q之前,我们必须把我们的链表放回一起,所以我们必须用
p->pNext=q->pNext将p的下一个节点设置为q的下一个节点。基本上,如果我们有一个链表
o->p->q->r
,我们就把它改成
o->p->r
。一旦我们有了这个集合,我们就可以删除q并返回成功。

下面是对代码的解释,一块一块地解释

一,

这将设置变量。I表示索引,用于跟踪我们在链表中的位置,p表示跟踪我们在链表中的节点

二,

这段代码检查我们是否真的找到了我们要查找的列表中的位置——如果在到达
pos
之前列表项用完了,那么我们不应该做任何事情。基本上,如果第2步到达列表末尾时没有到达
pos-1
,那么我们不想尝试删除任何内容,因为我们已经超出了列表末尾

四,

这是实际上从列表中删除内容的代码位。现在,p是要删除的节点之前的节点(我们在步骤2中将p设置为该节点)。因此,我们得到想要移除的节点,并将其放入
q
中,使用
pnodeq=p->pNext


在我们删除q之前,我们必须把我们的链表放回一起,所以我们必须用
p->pNext=q->pNext将p的下一个节点设置为q的下一个节点。基本上,如果我们有一个链表
o->p->q->r
,我们就把它改成
o->p->r
。一旦设置好,我们就可以删除q并返回成功。

没有对参数进行健全性检查。其中一半是检查是否传入了负数,另一半是检查您的阅读是否超过了列表的末尾


如果您希望完全安全,您应该在取消引用其成员之前检查pHead是否为null。

没有对参数进行健全性检查。其中一半是检查是否传入了负数,另一半是检查您的阅读是否超过了列表的末尾


如果您希望完全安全,在取消引用其成员之前,您应该检查pHead是否不为null。

是的,这很重要,因为如果没有这样的节点,那么它将到达i=pos的位置,代码也会运行。它的用途是什么?如果您放置的pos高于节点总数-1,那么您的代码应该会崩溃,因为它将尝试释放空指针。另外,谢谢你,我现在知道了。如果pospos。那么这可以判断pos是不是很重要,因为如果没有这样的节点,那么它将到达i=pos的位置。没有这个,代码也会运行。它用于什么?如果你放置的pos高于节点总数-1,那么你的代码将崩溃,因为它将尝试释放空指针。还有,谢谢你,我现在知道了。如果是POSPOSPOS。那么这可以判断POST是否感谢你,@Tim,我现在知道了谢谢,@Tim,我现在知道了
int i=0;
PNODE p=pHead->pNext;
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;