单链表 – 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
失败。 就像它的情况一样,当temp
为NULL
时,你的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; }