示例代码如下,假设单链表如下:
typedef struct Node{
ElemType data;
Node *next;
}Node;
typedef struct Node *LNodelist;
现需要初始化链表头结点,设函数为:
void create(Node *list)
{
list = (Node *)malloc(sizeof(Node));
if (NULL == list)
{
……;
}
return;
}
以上函数为经典常犯错误,今天还犯了以上错误。通过对以上函数当在下面main函数中调用时,简单情况下不会发生编译错误,但是运行结果却会发现调用create(first)函数后,并未对头结点进行了初始化分配了空间,仍然为NULL。
int main(void)
{
Node *first = NULL;
create(first);
return 0;
}
针对以上问题,可以做如下解决,引入指向指针的指针:
void create(Node **list)
{
Node *p = NULL;
p = (Node *)malloc(sizeof(Node));
if (NULL ==p)
{
……;
}
*list = p;
}
主函数中调用相应改为:
int main(void)
{
Node *first = NULL;
create(&first);
return 0;
}
或者还可以改为:
Node *create()
{
Node *p = Null;
p = (Node *)malloc(sizeof(Node));
if(p == NULL)
{……}
return p;
}
main函数调用为:
int main(void)
{
Node *first = NULL;
first = create();
return 0;
}