如何正确初始化链接列表

时间:2014-04-21 13:37:35

标签: c struct

初始化链表时,我将参数定义为* 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;

1 个答案:

答案 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();