单链表-C
我有一个关于单链表的快速问题,我在其他问题中找不到答案 这是我的代码:单链表-C,c,C,我有一个关于单链表的快速问题,我在其他问题中找不到答案 这是我的代码: #include <stdio.h> #include <stdlib.h> void add(int data); void printList(); struct node { int data; struct node * link; }; struct node * head = NULL; main() { char c; while ((c =
#include <stdio.h>
#include <stdlib.h>
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;
}
}
您会注意到,如果列表为空,则会填充head节点
我的代码工作得很好,但是我想知道我是否忽略了一些关于处理空头情况的东西
非常感谢 您的
add()
函数没有根本性的错误。head==NULL
的情况不需要特殊处理
正如其他人所注意到的,您的错误检查是不正确的,因为如果malloc
失败,您需要从函数返回。目前,当temp
为NULL
时,您的add()
函数将尝试分配给*temp
你用这种特殊处理显示的代码是假的。当
head==NULL
时,该代码中的else
子句可以很好地工作。您可以选择在每次使用时检查head上的指针是否为NULL,或者如果对head节点进行不同的处理,则可以假定它不是NULL
<> P>良好的举止假定你应该总是检查它,但是如果你不检查并且不去引用空指针,那么你的代码无论如何都会起作用。 < P>如果你考虑<代码> AdBeg < /C> >如果分支:
if (Head == NULL)
{
Head=temp;
Head->Next=NULL;
}
else
{
Head=temp;
temp->Next=Head;
}
您会看到您正在将temp
分配给head
,然后设置next
指针。
另一方面,您的实现是:
temp->link = head;
temp->data = data;
head = temp;
如果您跳过数据
部分(和head=temp
,这两种情况下都存在),您将很容易看到它与第一个部分等效,因为
temp->link = head;
同:
if (Head == NULL)
{
Head->Next=NULL;
}
else
{
temp->Next=Head;
}
因为您将始终运行该行(添加节点时) 添加节点后,头部节点中永远不会有空引用。这是因为您在上面(temp!=null)验证temp不是null指针
现在,在搜索节点时,最好先检查head节点是否为null,然后再访问它(不)指向的字段。也许这就是“特殊条件”中的意思,注释与本案例混合在一起,通常不需要。有趣。谢谢我觉得很奇怪,在学校里我是怎么被教分开做的。哦,好吧!好吧,按照我的理解,我的代码很好。最好检查null的实例,否则,我的程序不会产生任何意外的小故障?再次感谢大家@seyelent如果要取消引用,只需检查NULL。如果您打算将可能为NULL的内容分配给指针,则不需要任何特殊处理。“但是,否则,我的程序不应该生成任何意外故障?”好吧,请参阅问题的注释以了解一些故障。您的add()函数可以工作,但如果malloc失败,它会出现故障。如果
temp==NULL
,则应返回
。您也不需要在print中malloc一个新节点,只需使用指向头部的指针就足够了。内存泄漏您的printList函数有一个错误:它malloc一个新的临时节点,然后立即用head指针覆盖malloc的指针,从而泄漏分配的节点。在这种情况下,分配是不必要的。。。除非temp为NULL
。在这种情况下,代码将退出上面的四行。编码(如国际象棋)要求你们都关注本地事件和可能影响本地事件的遥远事件。当Head==NULL
时,Head->Next=NULL
肯定会使程序崩溃。@larsmans:真糟糕!你是对的,我编辑了我的答案,推理仍然成立。。。
if (Head == NULL)
{
Head->Next=NULL;
}
else
{
temp->Next=Head;
}
head = temp;