链表清空函数有有关问题但不知道出在哪…运行到第五步出错…求帮助求解释…本人新手…

链表清空函数有问题但不知道出在哪…运行到第五步出错……求帮助求解释……本人新手……
#include <iostream.h>
#include<stdlib.h>
#define ok 1
#define error 0
typedef int ElemType;
typedef int status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,* LinkList; //单链表存储结构
void CreateList(LinkList &L,int n){  
LinkList s,r;
  int i,m;
  L=(LinkList )malloc(sizeof(LNode));
  L->next=NULL;
  r=L; 
cout<<"请输入元素:"<<endl;
  for (i=0;i<n;i++)
{  
  s=(LinkList)malloc(sizeof(LinkList));
  cin>>m;  
  s->data=m;
  r->next=s;  
  r=s;
  }
  r->next=NULL;
} //尾插法创建链表
void MergeList( LinkList &La, LinkList &Lb, LinkList &Lc)
{
 LinkList pa=La->next;
 LinkList pb=Lb->next;
 LinkList pc;
 Lc=pc=La;
while(pa&&pb)
{
  if(pa->data<=pb->data)
{pc->next=pa; pc=pa; pa=pa ->next;} 
else 
{pc->next=pb; pc=pb; pb=pb->next;}
}
pc->next=pa?pa:pb;  
free(Lb); Lb=NULL;
} //实现两个有序表的合并
status PrintList(LinkList L)
{
LinkList p=L->next;
  LinkList px;
  LinkList Lx=(LinkList)malloc(sizeof(LNode));
  Lx->next=NULL;
if(p==NULL)
cout<<"链表为空!"<<endl;
while(p)
{
  LinkList px=(LinkList)malloc(sizeof(LNode));
px->data=p->data;
px->next=Lx->next;
Lx->next=px;
px=px->next;
  p=p->next;
} //利用头插法倒序存储链表
  px=Lx->next;
  while(px)
  {
  cout<<' '<<px->data;
  px=px->next;
  }
cout<<endl;
  return ok;
} //输出链表
status ClearList(LinkList &L)
{
if (!L) { cout<<"ERROR"; return 0;}
LinkList q,p=L->next;
  while(p)
{
q=p;
p=p->next;
free(q);
}
L->next=NULL;
  return ok;
}//清空链表
int main()
{
 LinkList La,Lb,Lc;
 int x=1,a,b;
 while(x<=5)
 {
cout<<"(1)创建单链表La并按递增顺序赋值"<<endl;
cout<<"(2)创建单链表Lb并按递增顺序赋值"<<endl;
cout<<"(3)将La和Lb按原来顺序合并到Lc中"<<endl;
cout<<"(4)输出链表Lc"<<endl;
cout<<"(5)清空链表Lc"<<endl;
cout<<"(6)退出"<<endl;
cout<<"请输入选项"<<endl;
cin>>x;
switch(x)
{
case 1:
cout<<"请输入元素个数:"<<endl;
cin>>a;
CreateList(La,a);
break;
case 2:
cout<<"请输入元素个数:"<<endl;
cin>>b;
CreateList(Lb,b);
break;
case 3:MergeList(La,Lb,Lc);
break;
case 4:PrintList(Lc);
break;
case 5:ClearList(Lc);
  break;
}
 }//while
return ok;
}

------解决方案--------------------
你创建链表时,申请节点内存时出错了,头节点的申请是对的。

C/C++ code

#include    <iostream>
#include    <stdlib.h>

using namespace std;
#define ok 1
#define error 0
typedef int ElemType;
typedef int status;

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,* LinkList; //单链表存储结构

void CreateList(LinkList &L,int n){   
    LinkList s,r;
    int i,m;
    L=(LinkList )malloc(sizeof(LNode)); 
    L->next=NULL;
    r=L;  
    cout<<"请输入元素:"<<endl;
    for (i=0;i<n;i++)
    {   
        //s=(LinkList)malloc(sizeof(LinkList));   这里有问题
        s=(LinkList)malloc(sizeof(LNode));  
        cin>>m;   
        s->data=m;
        r->next=s;   
        r=s;
    }
    r->next=NULL;    
} //尾插法创建链表

void MergeList( LinkList &La, LinkList &Lb, LinkList &Lc)
{
    if( !La || !Lb )                 //使用之前最好检查一下
    {
        cout <<"Error" <<endl;
        return;
    }
    LinkList pa=La->next;
    LinkList pb=Lb->next;
    LinkList pc;
    Lc=pc=La;
    while(pa&&pb)
    {
        if(pa->data<=pb->data)
        {pc->next=pa; pc=pa; pa=pa ->next;}  
        else  
        {pc->next=pb; pc=pb; pb=pb->next;}
    }
    pc->next=pa?pa:pb;   
    free(Lb); 
    Lb=NULL;
} //实现两个有序表的合并

status PrintList(LinkList L)
{
    LinkList p=L->next;
    LinkList px;
    LinkList Lx=(LinkList)malloc(sizeof(LNode));
    Lx->next=NULL;
    if(p==NULL)
        cout<<"链表为空!"<<endl;
    while(p)
    {
        LinkList px=(LinkList)malloc(sizeof(LNode));
        px->data=p->data;
        px->next=Lx->next;
        Lx->next=px;
        px=px->next;
        p=p->next;
    } //利用头插法倒序存储链表
    px=Lx->next;
    while(px)
    {
        cout<<' '<<px->data;
        px=px->next;
    }
    cout<<endl;
    return ok;
} //输出链表

status ClearList(LinkList &L)
{
    if (!L) { cout<<"ERROR"; return 0;}
    LinkList q;
    LinkList p=L->next;
    while(p)
    {
        q=p;
        p=p->next;
        free(q);
    }
    L->next=NULL;
    return ok;
}//清空链表

int main()
{
    LinkList La,Lb,Lc;
    int x=1,a,b;
    while(x<=5)
    {
        cout<<"(1)创建单链表La并按递增顺序赋值"<<endl;
        cout<<"(2)创建单链表Lb并按递增顺序赋值"<<endl;
        cout<<"(3)将La和Lb按原来顺序合并到Lc中"<<endl;
        cout<<"(4)输出链表Lc"<<endl;
        cout<<"(5)清空链表Lc"<<endl;
        cout<<"(6)退出"<<endl;
        cout<<"请输入选项"<<endl;
        cin>>x;
        switch(x)
        {
        case 1:
            cout<<"请输入元素个数:"<<endl;
            cin>>a;
            CreateList(La,a);
            break;
        case 2:
            cout<<"请输入元素个数:"<<endl;
            cin>>b;
            CreateList(Lb,b);
            break;
        case 3:MergeList(La,Lb,Lc);
            break;
        case 4:PrintList(Lc);
            break;
        case 5:ClearList(Lc);
            break;
        }
    }//while
    return ok;
}