单链表-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;