数据结构-无法理解c中的Null指针



我正在处理单链表,无法解决问题(我认为问题是在添加带有NULL指针的函数中),问题是它只将第一个数字添加到列表中,并跳过其余的添加函数调用。

#include<stdlib.h>
#include<stdio.h>
struct node
{
  int i;
  struct node* next;
};
struct node* head = NULL;
int add(int val)
{
  if(head == NULL)
  {
    head = (struct node*)malloc(sizeof(struct node));
    head->i = val;
  }
  else
  {
    struct node* current = head;
    while(current != NULL)
    {
      current = current->next;
    }
    current = (struct node*)malloc(sizeof(struct node));
    current->i = val;
  }
}
int print(struct node* first)
{
  while(first != NULL)
  {
    printf("%dn",first->i);
    first = first->next;
  }
}
int main()
{
  add(36);
  add(46);
  add(97);
  print(head);
  return 0;
}

这里有两个问题。首先,在创建新节点时,不要将next设置为NULL。因此,当您遍历列表时,您最终会读取垃圾数据,调用未定义的行为。

下一个问题是,当您遍历一个非空列表时,您会从列表的末尾"脱落",因此current在循环的末尾为NULL,并且没有链接到列表的末尾。当current->next为null时,您需要停止,然后在那里创建新节点。

void add(int val)     // change return type to void since nothing is being returned
{
  if(head == NULL)
  {
    head = malloc(sizeof(struct node));  // don't cast return value of malloc
    head->i = val;
    head->next = NULL;                   // terminate list
  }
  else
  {
    struct node* current = head;
    while(current->next != NULL)         // loop until you're on the last node
    {
      current = current->next;
    }
    current->next = malloc(sizeof(struct node));
    current->next->i = val;
    current->next->next = NULL;          // terminate list
  }
}

您从未将node->next设置为NULL(对于head->nextcurrent->next路径)。使用malloc进行分配不会清除分配的内存,因此您需要自己进行分配。

此外,当您添加第二个元素时,您会进行迭代,直到current达到NULL,但您从未将previous_node->next设置为指向新元素,因此您从未实际"链接"链表中的任何内容。

此外,您不应该在C.中强制转换malloc的结果

您没有看到添加第二个和后续节点的效果的主要原因是,当您分配一个不是头节点的新节点时,您只将指向它的指针存储在函数add()的局部变量current中。您需要将其存储在上一个节点的next指针中。将其与您的原始代码进行比较:

    struct node* current = head;
    while (current->next != NULL) {
      current = current->next;
    }
    current->next = malloc(sizeof(*current->next));

还请注意,正如@Lousy所观察到的,您无法将新节点的next指针设置为NULL。您必须这样做,因为在为这些字段指定一些值之前,它们的内容是不确定的。

相关内容

  • 没有找到相关文章

最新更新