求教动态链表释放的有关问题

求教动态链表释放的问题
while (p1->getgcv_buf != 0) //如果获取到了gc_RcvBuf的值
{
n++;
if (n == 1)
{
head = p1; //把p1所指的结点作为第一个结点
}
else
{
printf("the information of new node is :%s\n", p1->getgcv_buf); //输出每个结点的中的内容
p2->next = p1; //下一个结点的地址为新结点的地址
p2 = p1;
p1 = (struct RecvLink *)malloc(LEN);
p1->getgcv_buf = gc_RcvBuf;
}

这段代码该如何用free来释放?想了半天没头绪
------解决方案--------------------
引用:
while (p1->getgcv_buf != 0) //如果获取到了gc_RcvBuf的值
{
n++;
if (n == 1)
{
head = p1; //把p1所指的结点作为第一个结点
}
else
{
printf("the information of new node is :%s\n", p1->getgcv_buf); //输出……


在循环外面delete(head)
------解决方案--------------------

if (n == 1)
{
head = p1;  //把p1所指的结点作为第一个结点
free(p1);
}
else
{
printf("the information of new node is :%s\n", p1->getgcv_buf); //输出每个结点的中的内容
p2->next = p1; //下一个结点的地址为新结点的地址
p2 = p1;
free(p1);  // ********* << 这里最好释放一次,否则容易报错,或者造成内存浪费。********//
p1 = (struct RecvLink *)malloc(LEN);
p1->getgcv_buf = gc_RcvBuf;
}