-1

我在 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;
4

3 回答 3

1

这是什么????

int i;
for(i = list.tail; i != NULL; i = i -> prev)
  printf("%d %d %d\n", i -> x, i -> y, i -> z);  /* WTF??? */

我会期待更多类似的东西:

struct mystruct {
  int value;
  struct mystruct *next;
  struct  mystruct *prev;
};
...

  struct mystruct *s;
  ...
  while (s != NULL) {
      printf("value=%d next=%x prev=%x\n", s->value, s->next, s->prev);
      ...

PS:您能否发布“列表”和“节点”定义的代码?他们可能看起来很有希望......

于 2012-06-04T02:16:10.803 回答
1
node *n = malloc(sizeof(n));

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

node *n = malloc(sizeof node);
于 2012-06-04T03:02:48.390 回答
0

我注意到插入函数的 else 部分有一个小东西。在 l->tail=n 行之后,我认为你应该有
l->tail->next = NULL
这是为了将最后一个节点的 next 分配给 NULL。您的代码中似乎缺少它。

于 2012-06-04T04:19:24.520 回答