删除重复结点的算法,哪里错了求解答,运行不了!!

void DeleteList(linklist &L)
{
linklist p,q,s;
p=L->next ;

while(p)
{
    q=p->next;
    while(q)
    {
        if(q->data==p->data )
            {
             s=q; 
             q=s->next;  
             free(s);

            }
            else
                q=q->next ;
    }
    p=p->next ;
}

}

void RemoveDupNode(linklist &L)//删除重复结点的算法
{
linklist p,q,r;
p=L->next;
while(p) // p用于遍历链表
{
q=p;
while(q->next) // q遍历p后面的结点,并与p数值比较
{
if(q->next->data==p->data)
{
r=q->next; // r保存需要删掉的结点
q->next=r->next; // 需要删掉的结点的前后结点相接
free(r);
}
else
q=q->next;
}
p=p->next;
}
}

如果是这样就对了 ,为什么?

链表链接不对,修改:

            if(q->data==p->data )
            {
                s=q; 
                //q=s->next;  
                p->next=s->next;  //增加
                free(s);

            }

没有保存中间节点,这样导致非法访问内存...