初始化链表时,我将参数定义为* L,如:
Status InitList(LinkList *L)
{
*L=(LinkList)malloc(sizeof(struct LNode));
if(!*L)
exit(OVERFLOW);
(*L)->next=NULL;
return OK;
}
但不是
Status InitList(LinkList L)
{
L=(LinkList)malloc(sizeof(struct LNode));
if(!L)
exit(OVERFLOW);
(L)->next=NULL;
return OK;
}
为什么不可能是真的?
struct LNode
{
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList;
答案 0 :(得分:0)
在第二个实现中,您有一个初始化的局部变量L
。麻烦的是,它是一个局部变量 - 改变它不会改变调用代码中的变量。当函数退出时,您丢失了已分配的内存 - 内存泄漏。他们很糟糕!
第一个代码获取指向调用代码中变量的指针并仔细更改它。这不会泄漏记忆。
您可以修改第二个,以便使用以下代码:
LinkList NewList(void)
{
LinkList L = (LinkList)malloc(sizeof(*L));
if (L)
{
L->data = 0;
L->next = NULL;
}
return L;
}
它完成了不同的工作,因此重命名了。 请注意,它确保将结构的所有元素初始化为已知值。你会这样称呼它:
LinkList list = NewList();