我在 C 中创建了一个双向链表,在它具有三个变量作为其数据之前(在我输入 typedef int bool 之后,两个 int 和一个 bool)和两个指针 next 和 prev。我在后面插入了一个大致说的功能
void insert(list *l, int x, int y, bool z)
{
node *n = makeNode(x, y, z);
if(isEmpty(*l))
l->head = l->tail = NULL;
else
{
l->tail->next = n;
n->prev = l->tail;
l->tail = n;
}
}
我的 makeNode 函数说的是:
node *makeNode(int x, int y, bool z)
{
node *n = malloc(sizeof(n));
n -> x = x;
n -> y = y;
n -> z = z;
n -> next = NULL;
n -> prev = NULL;
return n;
}
所以然后我用看起来像这样的东西打印出来:
void printList(list l)
{
node *i;
for(i = list.head; i != NULL; i = i -> next)
printf("%d %d %d\n", i -> x, i -> y, i -> z);
printf("\n");
}
那个效果很好,但后来我有了
void reversePrintList(list l)
{
node *i;
for(i = list.tail; i != NULL; i = i -> prev)
printf("%d %d %d\n", i -> x, i -> y, i -> z);
printf("\n");
}
那一个是段错误的。在玩弄了代码之后,出于某种奇怪的原因,虽然“下一个”指针每次都保持不变,但“上一个”指针并没有指向我最初让它们指向的节点,而且显然它们没有指向 NULL任何一个。
此外,早些时候我试图将它实现为一个循环双向链表,由于某种原因,下一个指针仍然工作得很好,但上一个指针再次指向某个奇怪的地方。
但真正奇怪的是,当节点只包含一个 int 时,一切都在线性和循环双向链表上完美运行。当我进行一些语法更改以将代码转换为 C++ 时,它可以完美地与更大的节点配合使用。我看了一遍,没有我写的代码应该改变插入函数之外的 prev 指针。那么,当我在 C 中使用更大的节点时,会发生什么弄乱了 prev 指针和只有 prev 指针?
谢谢!
复仇的书呆子
PS这是我的结构
typedef struct node{
int x;
int y;
bool z;
struct node *next;
struct node *prev;
} node;
typedef struct list{
node *head;
node *tail;
} list;