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