我有一个与链表相关的学校作业,这是我所有的函数,我需要完成free函数,但我对C语言还很陌生,不太确定需要释放哪些内存。
以下是我的代码:
这是我的自由函数,但这种方式只释放了一些东西而不是其他东西。
任何帮助都非常感激。
以下是我的代码:
typedef struct TEmployee
{
struct TEmployee * m_Next;
struct TEmployee * m_Bak;
char * m_Name;
} TEMPLOYEE;
#endif /* __PROGTEST__ */
TEMPLOYEE * newEmployee(const char * name, TEMPLOYEE * next)
{
TEMPLOYEE* head = NULL;
head = (TEMPLOYEE *)malloc(sizeof(TEMPLOYEE));
if(head==NULL)
{
return NULL;
}
head -> m_Name = strdup(name);
head -> m_Next = next;
head -> m_Bak = NULL;
return head;
}
int getEmpPos(TEMPLOYEE *list, TEMPLOYEE *el){
int pos = 0;
TEMPLOYEE *listPos = list;
while(listPos != NULL){
if(listPos == el)
return pos;
listPos = listPos->m_Next;
pos++;
}
return -1;
}
TEMPLOYEE* getEmpAtPos(TEMPLOYEE* list, int pos)
{
TEMPLOYEE *toReturn = list;
for(int i = 0; i < pos; i++){
toReturn = toReturn->m_Next;
}
return toReturn;
}
TEMPLOYEE * cloneList(TEMPLOYEE * src)
{
TEMPLOYEE* current = src;
TEMPLOYEE* newList = NULL;
TEMPLOYEE* tail = NULL;
while(current != NULL)
{
if(newList==NULL)
{
newList = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE));
newList -> m_Name = (char *)malloc(1 + strlen(current -> m_Name));
strcpy(newList -> m_Name, current -> m_Name);
newList -> m_Next = NULL;
newList -> m_Bak = NULL;
tail = newList;
}
else
{
tail -> m_Next = (TEMPLOYEE*)malloc(sizeof(TEMPLOYEE));
tail = tail -> m_Next;
tail -> m_Name = (char *)malloc(1 + strlen(current -> m_Name));
strcpy(tail -> m_Name, current -> m_Name);
tail -> m_Next = NULL;
}
current = current -> m_Next;
}
// Clone backups
current = src;
tail = newList;
while(current != NULL){
if(current -> m_Bak)
{
tail -> m_Bak = getEmpAtPos(newList, getEmpPos(src, current->m_Bak));
}
else
{
tail -> m_Bak = NULL;
}
tail = tail -> m_Next;
current = current -> m_Next;
}
return newList;
}
这是我的自由函数,但这种方式只释放了一些东西而不是其他东西。
void freeList(TEMPLOYEE * src)
{
TEMPLOYEE* tmp;
while(src != NULL)
{
tmp = src;
src = src -> m_Next;
free(tmp);
}
}
任何帮助都非常感激。
malloc
、calloc
、realloc
和(非标准的)strdup
函数都分配了需要使用free
释放的内存。应该有很好的文档记录。 - Some programmer dudehead = (TEMPLOYEE *)malloc(sizeof(TEMPLOYEE));
中的头部? - Lada1208malloc
都应该被释放。freeList
似乎(大概)会在节点后释放所有的TEMPLOYEE
,尝试在每个列表的头部使用freeList
? - Neil