我正在尝试创建一个链表在C与指针结构的时刻。我的逻辑有点问题。所以我想知道,当删除列表的头部时,我是否会返回被删除的项,或者,我是否会返回新的列表头部。此外,如果我将返回新的头,我将如何释放内存?(这部分是赋值)根据赋值信息,我们不应该释放函数中被删除的项。我的问题是,我要在哪里释放内存?下面是这段代码。我的代码在这里只是返回新的头部,或返回NULL,如果列表是空的。
MusicRec * removeFromFront(MusicRec * theList)
{
if(theList == NULL)
{
return NULL;
}
return theList->next;
}
很简单。每个分配函数都有一个配套的分配函数,有时还有一套额外的实用函数。在文档中查找分配器。
在返回之前释放。这可能意味着您需要一个临时副本。
BTW:您正在返回正确的值…
函数应该保存一个指向被删除节点(当前头节点)的指针,将列表的头重置为下一个节点(即当前的第二个节点),然后将保存的指针返回到被删除的节点。
使用链表api的用户可能会使用一些复杂的结构作为节点,在这种情况下,最好留给调用者来处理数据的内存清理。
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