初始化链表时,我定义参数为*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;
最佳答案
在第二个实现中,您有一个初始化的局部变量 L
。问题是,它是一个局部变量——改变它不会改变调用代码中的变量。当函数退出时,您丢失了分配的内存——内存泄漏。他们很糟糕!
第一个代码获取一个指向调用代码中的变量的指针并小心地更改它。这不会泄漏内存。
您可以使用如下代码修改第二个,使其工作:
LinkList NewList(void)
{
LinkList L = (LinkList)malloc(sizeof(*L));
if (L)
{
L->data = 0;
L->next = NULL;
}
return L;
}
它做了不同的工作,所以它被重命名了。 请注意,它确保结构的所有元素都初始化为已知值。你会这样调用它:
LinkList list = NewList();
关于c - 如何正确初始化链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23198587/