Is this a valid way to create a doubly linked-list?
**不,现在,这段代码只会给你一个分段错误。很明显,为什么在每个步骤之后添加以下行:
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;
现在你可以走了。
**假设最初是一个空列表。