单链表 – C.

我对单链表有一个非常快速的问题,我在其他问题中找不到答案。

这是我的代码:

#include  #include  void add(int data); void printList(); struct node { int data; struct node * link; }; struct node * head = NULL; main() { char c; while ((c = getchar()) != 'q') { if (c == 'a') { int temp; printf("data: "); scanf("%d", &temp); add(temp); } if (c == 'p') printList(); } } void add(int data) { struct node * temp = (struct node *) malloc(sizeof(struct node)); if (temp == NULL) fprintf(stderr, "error"); temp->link = head; temp->data = data; head = temp; } void printList() { struct node * temp = (struct node *) malloc(sizeof(struct node)); if (temp == NULL) fprintf(stderr, "error"); temp = head; while (temp != NULL) { printf("%d", temp->data); temp = temp->link; } } 

现在,我被告知我需要在我的add函数中创建一个函数或一个场景,如果正在创建一个新列表,它会做一些不同的事情。 换句话说,当列表为空并且第一个元素被添加到它时,它需要与填充列表在前面接收另一个节点时不同地完成。 我在网上找到了这样的代码示例:

 # // Adding a Node at the Beginning of the List # # void addBeg(int num) # { # struct Node *temp; # # temp=(struct Node *)malloc(sizeof(struct Node)); # temp->Data = num; # # if (Head == NULL) # { # //List is Empty # Head=temp; # Head->Next=NULL; # } # else # { # temp->Next=Head; # Head=temp; # } # } 

正如您将注意到的,如果列表为空,则填充头节点。

我的代码工作正常,但我想知道我是否忽略了处理空头情况的问题。

非常感谢!

add()函数没有任何根本错误。 head == NULL的情况不需要特殊处理。

正如其他人注意到的那样,您的错误检查不正确,因为您需要从函数返回,以防malloc失败。 就像它的情况一样,当tempNULL时,你的add()函数会继续尝试分配给*temp

您通过这种特殊处理展示的代码是虚假的。 当head == NULL时,该代码中的else子句可以很好地工作。

您可以选择在每次使用时检查您的指针是否为空,或者如果您对头节点的处理方式不同,则可以假设它不为空。

良好的举止假设您应该始终检查它,但如果您不检查并且不取消引用空指针,那么您的代码无论如何都会起作用。

因为您将始终运行该行(添加节点时)

 head = temp; 

添加节点后,头节点中永远不会有NULL引用。 这是因为您validation上面(temp!= null)temp不是空指针。

现在,在搜索节点时,在访问任何(不)指向的字段之前检查头节点是否为空是一个非常好的主意。 也许这就是“特殊条件”中的含义,并且这些注释与这种情况混淆在一起,通常不需要。

如果你考虑addBeg if branch:

 if (Head == NULL) { Head=temp; Head->Next=NULL; } else { Head=temp; temp->Next=Head; } 

你看到你正在为head分配temp然后设置next指针。 另一方面,您的实施是:

 temp->link = head; temp->data = data; head = temp; 

如果你跳过data部分(并且head = temp在两种情况下都存在),你会很容易看到它等同于第一个,因为

 temp->link = head; 

是相同的:

 if (Head == NULL) { Head->Next=NULL; } else { temp->Next=Head; }