双链表工作不正常,C

双链表工作不正常,C,c,buffer,C,Buffer,好的,我消除了总线错误,但现在当我尝试打印我的列表时,它打印出来的是: 一, 问题出在init函数还是我的add函数中?我想知道,既然我在init函数中没有使用malloc,那么在每次调用add函数之后,列表是否会被删除?这是真的吗?我尝试过这样分配: slist\u t*list=slist\u t*mallocsizeofslist\t 但它给了我一个错误。无法将旧尾巴的旁边链接到新尾巴 #include <stdio.h> #include <stdlib.h>

好的,我消除了总线错误,但现在当我尝试打印我的列表时,它打印出来的是: 一,

问题出在init函数还是我的add函数中?我想知道,既然我在init函数中没有使用malloc,那么在每次调用add函数之后,列表是否会被删除?这是真的吗?我尝试过这样分配: slist\u t*list=slist\u t*mallocsizeofslist\t
但它给了我一个错误。

无法将旧尾巴的旁边链接到新尾巴

#include <stdio.h>
#include <stdlib.h>

typedef struct list_item {
  int value;
  struct list_item *next;
  struct list_item *prev;
} list_item_t;

typedef struct single_list {
  list_item_t *head;
  list_item_t *tail;
} slist_t;

void init(slist_t *list) {
  list->head = NULL;
  list->tail = NULL;
}

void add(slist_t *list, int value) {
  list_item_t *newNode = (list_item_t *)malloc(sizeof(list_item_t));
  // Case for empty list
  if (list->head == NULL) {
      list->head = newNode;
      list->tail = newNode;
      newNode->value = value;
      newNode->prev = NULL;
      newNode->next = NULL;
  }
  // Case for nonempty list
  else {
      newNode->prev = list->tail;
      newNode->value = value;
      newNode->next = NULL;
      list->tail = newNode;
  }
}

void print(slist_t *list) {
  if (list->head == NULL) {
    printf("The list is empty\n");
    return;
  }
  list_item_t *currentNode = list->head;
  while (currentNode != NULL) {
    printf("%d ", currentNode->value);
    currentNode = currentNode->next;
  }
  printf("\n");
}

int main() {
  slist_t myList;
  init(&myList);
  add(&myList, 5);
  add(&myList, 2);
  add(&myList, 6);
  print(&myList);
}

首先,您永远不会更改list->tail以指向新的tail…您应该再次检查您的init函数。您的list的tail被初始化为NULL并取消引用。init从不使用其参数…使用所有警告和调试信息进行编译,例如gcc-Wall-g,然后使用调试器gdb
// Case for nonempty list
else {
  // Add.  `list->tail->next` should be NULL before this code.  
  list->tail->next = newNode;

  newNode->prev = list->tail;
  newNode->value = value;
  newNode->next = NULL;
  list->tail = newNode;
}