Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Doubly Linked List - Fatal编程技术网

C 这是创建双链接列表的有效方法吗?

C 这是创建双链接列表的有效方法吗?,c,doubly-linked-list,C,Doubly Linked List,可能重复: 我在看书 他给出了以下双链接列表的示例 我无法理解标记为1和2的语句的目的。1看起来是错误的,2看起来是多余的 这是创建双链接列表的有效方法吗?将项目插入双链接列表时,必须更改指向新元素的两个指针和指向新元素的两个指针 标有//1的行将新指针的下一个指针设置为插入位置后的下一个指针。标记为//2的行将下一个元素的上一个指针设置为新元素,完成它们之间的双向链接 请注意,当新元素添加到列表末尾时,此代码将出错。在这种情况下,bp1->forp将为空,因此bp1->forp->backp

可能重复:

我在看书

他给出了以下双链接列表的示例

我无法理解标记为1和2的语句的目的。1看起来是错误的,2看起来是多余的


这是创建双链接列表的有效方法吗?

将项目插入双链接列表时,必须更改指向新元素的两个指针和指向新元素的两个指针

标有//1的行将新指针的下一个指针设置为插入位置后的下一个指针。标记为//2的行将下一个元素的上一个指针设置为新元素,完成它们之间的双向链接


请注意,当新元素添加到列表末尾时,此代码将出错。在这种情况下,bp1->forp将为空,因此bp1->forp->backp将尝试取消对空指针的引用

编辑

开始时:

bp  ->forp  = next
next->backp = bp  
bp1 ->forp  = null
bp1 ->backp = null 

The list looks like this. bp and next are linked, bp1 is outside of the list.

       /---\/            
    [bp]   [next]         [bp1]
      /\---/      
第//1行之后

第//2行之前

第//2行之后


将项目插入双链接列表时,必须更改指向新元素的两个指针和指向新元素的两个指针

标有//1的行将新指针的下一个指针设置为插入位置后的下一个指针。标记为//2的行将下一个元素的上一个指针设置为新元素,完成它们之间的双向链接


请注意,当新元素添加到列表末尾时,此代码将出错。在这种情况下,bp1->forp将为空,因此bp1->forp->backp将尝试取消对空指针的引用

编辑

开始时:

bp  ->forp  = next
next->backp = bp  
bp1 ->forp  = null
bp1 ->backp = null 

The list looks like this. bp and next are linked, bp1 is outside of the list.

       /---\/            
    [bp]   [next]         [bp1]
      /\---/      
第//1行之后

第//2行之前

第//2行之后

代码是正确的

bp是一个双链接列表。 您希望将bp1作为列表中的第二项插入到bp中,这是代码的作用

为此,您需要设置4个指针:

bp1->forp应指向列表中的第二项,即上面的bp->forp//1

bp1->backp应指向列表中的第一项bp

bp->forp应指向插入的项目bp1

第二个项目bp1->forp->backp的后向指针应指向插入的项目bp1//2以上

编辑:

让我们把结构称为A,B,C,D。。。 英国石油公司指出的清单包括A、C、D。。。在插入之前。我们想插入bp1指向的B。 表示向前和向后指针

之前:

bp --> A <-> C <-> D <-> E <-> ...
bp1--> B
之后:

bp--> A <-> B <-> C <-> D <-> E <-> ...
代码是正确的

bp是一个双链接列表。 您希望将bp1作为列表中的第二项插入到bp中,这是代码的作用

为此,您需要设置4个指针:

bp1->forp应指向列表中的第二项,即上面的bp->forp//1

bp1->backp应指向列表中的第一项bp

bp->forp应指向插入的项目bp1

第二个项目bp1->forp->backp的后向指针应指向插入的项目bp1//2以上

编辑:

让我们把结构称为A,B,C,D。。。 英国石油公司指出的清单包括A、C、D。。。在插入之前。我们想插入bp1指向的B。 表示向前和向后指针

之前:

bp --> A <-> C <-> D <-> E <-> ...
bp1--> B
之后:

bp--> A <-> B <-> C <-> D <-> E <-> ...
这是创建双链接列表的有效方法吗

**不,现在这个代码只会给你一个分段错误。很明显,如果在每个步骤后添加以下行,原因是:

printf("bp = %#x\n\tbp->forp=%#x\n\tbp->backp=%#x\n", bp, bp->forp, bp->backp);
printf("bp1 = %#x\n\tbp1->forp=%#x\n\tbp1->backp=%#x\n", bp1, bp1->forp, bp1->backp);
首先,您需要分配和初始化您的结构:

bp = malloc(sizeof(struct queue));
bp->forp = NULL;
bp->backp = NULL;
bp1 = malloc(sizeof(struct queue));
bp1->forp = NULL;
bp1->backp = NULL;
然后我们打印您将看到的值,如下所示:

bp = 0x804b008
    bp->forp=0     //forward and back pointers are not pointing anywhere, good start
    bp->backp=0
bp1 = 0x804b018
    bp1->forp=0
    bp1->backp=0
在这些行之后:

    bp1->forp = bp->forp;  //bp1->forp is pointing no where (NULL), neither is bp->forp
                           // so this does nothing really... 
    bp1->backp = bp;
    bp->forp = bp1; 
现在你会有这样的东西:

bp = 0x804b008
    bp->forp=0x804b018
    bp->backp=0
bp1 = 0x804b018
    bp1->forp=0
    bp1->backp=0x804b008
正如你所说,这是有道理的。现在我们来试试下一行怎么样

bp1->forp->backp = bp1; //2
       ^
       |
       +------ That's NULL, and a seg fault. 
在此之前,您还需要一行:

bp1->forp-> = bp;
bp1->forp->backp = bp1;
现在你可以走了

**假设初始列表为空。

这是创建双链接列表的有效方法吗

**不,现在这个代码只会给你一个分段错误。很明显,如果在每个步骤后添加以下行,原因是:

printf("bp = %#x\n\tbp->forp=%#x\n\tbp->backp=%#x\n", bp, bp->forp, bp->backp);
printf("bp1 = %#x\n\tbp1->forp=%#x\n\tbp1->backp=%#x\n", bp1, bp1->forp, bp1->backp);
首先,您需要分配和初始化您的结构:

bp = malloc(sizeof(struct queue));
bp->forp = NULL;
bp->backp = NULL;
bp1 = malloc(sizeof(struct queue));
bp1->forp = NULL;
bp1->backp = NULL;
然后我们打印您将看到的值,如下所示:

bp = 0x804b008
    bp->forp=0     //forward and back pointers are not pointing anywhere, good start
    bp->backp=0
bp1 = 0x804b018
    bp1->forp=0
    bp1->backp=0
在这些行之后:

    bp1->forp = bp->forp;  //bp1->forp is pointing no where (NULL), neither is bp->forp
                           // so this does nothing really... 
    bp1->backp = bp;
    bp->forp = bp1; 
现在你会有这样的东西:

bp = 0x804b008
    bp->forp=0x804b018
    bp->backp=0
bp1 = 0x804b018
    bp1->forp=0
    bp1->backp=0x804b008
正如你所说,这是有道理的。现在我们来试试下一行怎么样

bp1->forp->backp = bp1; //2
       ^
       |
       +------ That's NULL, and a seg fault. 
在此之前,您还需要一行:

bp1->forp-> = bp;
bp1->forp->backp = bp1;
现在你可以走了


**假设初始列表为空。

在双链接列表中的bp之后插入bp1是有效的代码,前提是bp->forp在开始时不为空。@BoPersson我的问题实际上是关于创建链接列表的,而不是涉及上下文切换。为什么问题中的第一个单词有效??你认为如果没有这些,人们会建议创建列表的无效方法吗?@KerrekSB我的意思是,这是一种有效的方法来……:哈,一个重复,这真的是一个重复。在双链接列表中,在bp之后插入bp1是有效的代码,前提是

at bp->forp在开始时不是空的。@BoPersson我的问题实际上是关于链表的创建,而不是涉及上下文切换。为什么问题中的第一个单词有效??你认为如果没有这些,人们会建议创建列表的无效方法吗?@KerrekSB我的意思是,这是一种有效的方法来……:哈,一个复制品,一个真正的复制品,没有想到已经有了一个列表。现在有道理了。谢谢:是的,我想这就是为什么它对你没有意义。我没有想到它已经有了一个列表。现在有道理了。谢谢:是的,我想这就是为什么它对你没有意义。我添加了一些ASCII艺术来说明。我希望这有助于您更好地理解在源代码视图中发生的事情。请注意,当新元素添加到列表末尾时,此代码将出错。在这种情况下,bp1->forp将为空-假设使用空指针指示列表的结束。它们可能不是,而是链接列表存储为循环。我还没有读过这本书来了解其中的一种或另一种方式,因此,如果你读过,请道歉,它是空的:-我添加了一些ASCII艺术来说明。我希望这有助于您更好地理解在源代码视图中发生的事情。请注意,当新元素添加到列表末尾时,此代码将出错。在这种情况下,bp1->forp将为空-假设使用空指针指示列表的结束。它们可能不是,而是链接列表存储为循环。我还没有读过这本书,所以如果你读过的话,我道歉,它是空的:-+1。谢谢,你的代码是书中提到的完整版本,但作者只是在说明他的观点。当我认为bp是一个预先存在的双链接列表时,事情是有道理的,因为公认的答案是:D@Cthulhu-啊,但有个问题。你的问题是,这是创建双链接列表的有效方法吗?答案是否定的。这不是创建双链接列表的有效方法。您应该问一下,这是插入双链接列表的有效方法吗。根据你的问题的当前形式。我是正确的答案;是的,那会让你得到正确的答案!我会尽我所能奖励赏金:直到@KlasLindback提到这件事,我才意识到这是一件好事。我在这个问题上的错误。谢谢,你的代码是书中提到的完整版本,但作者只是在说明他的观点。当我认为bp是一个预先存在的双链接列表时,事情是有道理的,因为公认的答案是:D@Cthulhu-啊,但有个问题。你的问题是,这是创建双链接列表的有效方法吗?答案是否定的。这不是创建双链接列表的有效方法。您应该问一下,这是插入双链接列表的有效方法吗。根据你的问题的当前形式。我是正确的答案;是的,那会让你得到正确的答案!我会尽我所能奖励赏金:直到@KlasLindback提到这件事,我才意识到这是一件好事。我在这个问题上犯了错误。