无法理解c

时间:2016-08-01 20:57:37

标签: c data-structures linked-list

我正在处理单链表并且无法解决问题(我认为问题是在添加函数的情况下使用NULL指针),问题是它只添加第一个数字列表并跳过其余的调用来添加函数。 / p>

#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("%d\n",first->i);
    first = first->next;
  }
}

int main()
{
  add(36);
  add(46);
  add(97);
  print(head);
  return 0;
}

3 个答案:

答案 0 :(得分:2)

您永远不会将node->next设置为NULL(适用于head->nextcurrent->next路径)。使用malloc进行分配并不会清除已分配的内存,因此您需要自己执行此操作。

此外,当您添加第二个元素时,您正在迭代直到current到达NULL,但您从未将previous_node->next设置为指向新元素,因此您实际上从未# 34;连结&#34;链接列表中的任何内容。

另外,你shouldn't cast the result of malloc in C

答案 1 :(得分:2)

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

接下来的问题是当你遍历一个非空列表时,你“脱落”了列表的末尾,所以current在循环结束时为NULL,并且没有到结尾的链接的清单。您需要在current->next为空时停止,然后在那里创建新节点。

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
  }
}

答案 2 :(得分:2)

您没有看到添加第二个节点和后续节点的影响的主要原因是,当您分配一个不是头节点的新节点时,只将指针存储在本地变量current中功能add()。您需要将其存储在前一节点的next指针中。将其与原始代码进行比较:

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

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