gpt4 book ai didi

c - 为什么当我在 C 中创建双向链表时,节点中的变量数量似乎很重要?

转载 作者:行者123 更新时间:2023-11-30 14:25:00 26 4
gpt4 key购买 nike

我正在用 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 指针?

谢谢!

复仇的 Nerd

附注这是我的结构

typedef struct node{
int x;
int y;
bool z;
struct node *next;
struct node *prev;
} node;

typedef struct list{
node *head;
node *tail;
} list;

最佳答案

node *n = malloc(sizeof(n));

这没有任何意义。您想要分配足够的字节来保存节点,而不是指向节点的指针。尝试:

node *n = malloc(sizeof node);

关于c - 为什么当我在 C 中创建双向链表时,节点中的变量数量似乎很重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10875590/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com