我正在尝试使用指向结构的指针在C中创建一个链表。我的逻辑存在一些问题。所以我想知道,当删除列表的头部时,我会返回删除的项目,或者,我是否会返回列表的新头部。另外,如果我要回新头,我怎么能释放记忆? (这部分用于作业)根据作业信息,我们不应该在功能中释放被删除的项目。所以,我的问题是,我将在哪里释放记忆?这是代码片段。我的代码只返回新头,如果列表为空则返回NULL。
MusicRec * removeFromFront(MusicRec * theList)
{
if(theList == NULL)
{
return NULL;
}
return theList->next;
}
答案 0 :(得分:1)
简单。每个分配函数都有一个伴随释放函数,有时还有一整套额外的实用函数。查看分配器的文档。
在您返回之前解除分配。这可能意味着你需要一份临时副本。
BTW:你正在返回正确的值...
答案 1 :(得分:1)
MusicRec *removeFromFront(MusicRec **theListref)
{
if(*theListref == NULL)
return NULL; // shouldn't there be an underflow error?
Musicref *oldhead = *theListref;
*theListref = *theListref->next;
return oldhead;
}
我将指针归还给老头。这可以在调用函数中释放。该参数是当前头指针的引用。
修改强> 如果我必须坚持你的界面,你的代码是完全正确的&我将在调用函数中清理内存:
theListCopy = theList;
theList = removeFromFront(theList);
//free the ListCopy here
答案 2 :(得分:1)
该函数应保存指向要删除的节点(当前头节点)的指针,将列表的头部重置为下一个节点(即当前的第二个节点),然后将保存的指针返回到已删除的节点。 / p>
使用链表api的用户可能会将一些复杂的结构用作节点,在这种情况下,最好由调用者来处理数据的内存清理。