簡體   English   中英

當我在C中創建一個雙向鏈表時,為什么我的節點中的變量數似乎很重要?

[英]Why does the number of variables in my node seem to matter when I make a doubly linked list in C?

我在C中創建了一個雙向鏈表,在它有三個變量作為其數據之前(兩個整數和一個bool在我投入了typedef 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");
}

那一個發生了分裂。 在玩了代碼之后,由於一些奇怪的原因,雖然“下一個”指針每次都保持完整,但“prev”指針並沒有指向我最初指向他們的節點,顯然他們沒有指向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;

這是什么????

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:你能發布“list”和“node”定義的代碼嗎? 他們看起來很有希望......

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

這沒有任何意義。 您希望分配足夠的字節來保存節點,而不是指向節點的指針。 嘗試:

node *n = malloc(sizeof node);

我注意到插入函數的else部分有一個小東西。 在l-> tail = n之后,我認為你應該有
l-> tail-> next = NULL
這是為了將最后一個節點分配給NULL。 你的代碼似乎遺漏了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM