C Append节点返回NULL appending fist元素

C Append节点返回NULL appending fist元素,c,linked-list,C,Linked List,当链接列表为空时,将节点附加到链接列表时遇到问题。总的来说,它总是打印零。我该如何解决这个问题。下面是我对链表节点的实现,以及创建节点和附加节点函数 struct LL_node { int data; struct LL_node* next; }; typedef struct LL_node LL_node_t; LL_node_t* create_node(int x){ LL_node_t* node = (LL_node_t*)malloc(sizeof

当链接列表为空时,将节点附加到链接列表时遇到问题。总的来说,它总是打印零。我该如何解决这个问题。下面是我对链表节点的实现,以及创建节点和附加节点函数

struct LL_node {
    int data;
    struct LL_node* next;
  };
  typedef struct LL_node LL_node_t;

LL_node_t* create_node(int x){
  LL_node_t* node = (LL_node_t*)malloc(sizeof(LL_node_t)) ;
  node->data = x;
  node->next = NULL;
  return node;
}

void append_node(LL_node_t* start,int x){
  LL_node_t* node = create_node(x);
  if(start == NULL){
    start = node;
    return;
  }
  LL_node_t* nodes =  start;
  while(nodes->next != NULL){
    nodes =  nodes->next;
  }
  node->next = create_node(x);
}

int main(void) {
  LL_node_t* head = create_node(5);
  LL_node_t* nodes = NULL;
  append_node(nodes,3);
  printf("%p\n",nodes);
  return 0;
}

C严格地按值调用。当您将
节点
传递到
附加节点
时,在函数内部将有一个指针值的副本。修改后的值将不会传递回调用方

您有两个选择:

  • 返回修改后的值并在调用函数中赋值 (
    main
    )或
  • 传递指针的地址以便修改 被调用函数(
    append\u节点
    )中的指针
  • 第一种变体:

    LL_node_t* append_node(LL_node_t* start,int x){
      LL_node_t* node = create_node(x);
      if(start == NULL){
        start = node;
        return start;
      }
      LL_node_t* nodes =  start;
      while(nodes->next != NULL){
        nodes =  nodes->next;
      }
      node->next = create_node(x);
      return start;
    }
    
    int main(void) {
      LL_node_t* head = create_node(5);
      LL_node_t* nodes = NULL;
      nodes = append_node(nodes,3);
      printf("%p\n",nodes);
      return 0;
    }
    
    第二种变体:

    void append_node(LL_node_t** start,int x){
      /* avoid dereferencing NULL pointer */
      if(start == NULL) {
        return;
      }
      LL_node_t* node = create_node(x);
      if(*start == NULL){
        *start = node;
        return;
      }
      LL_node_t* nodes =  *start;
      while(nodes->next != NULL){
        nodes =  nodes->next;
      }
      node->next = create_node(x);
    }
    
    int main(void) {
      LL_node_t* head = create_node(5);
      LL_node_t* nodes = NULL;
      append_node(&nodes,3);
      printf("%p\n",nodes);
      return 0;
    }
    

    您想用
    printf(“%p\n”,节点)打印什么
    void append\u node(LL\u node\u t*start,int x)
    这将按值传递
    start
    指针<代码>开始=节点这将修改作为参数接收的指针副本。它不会也不能修改
    main
    中原始指针
    节点的值。