c语言中的内存及释放问题

假如我写了一个函数,这个函数的功能是创建一个单链表并返回头指针(用了malloc申请了内存),我调用下面的函数释放链表的节点内存时,链表中的数据还在吗?还可以访问这个链表吗
假设p是头指针
void freen(struct data *p)
{while (p  != NULL)
{
    q=p->next;
    free(p);
    p=q;
}

再追加一个问题,麻烦友友们解释一下释放内存的原理!

只要释放了,肯定就不在了
所谓释放内存,就是程序告诉操作系统,归还之前申请的内存空间的控制权。只有拥有控制权的程序才能修改内存信息。一旦释放,操作系统随时可能将这块内存分配给其它程序或本程序的其它模块