ListInsert(LinkList L,int i,ElemType e)是一个子程序 我把他单独弄出来 能帮我看为什么运行不了吗?

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;
struct LNode {
ElemType data;
struct LNode *next;
};
typedef struct LNode *LinkList,LNODE;
void ListInsert(LinkList L,int i,ElemType e);
int main(){
int i;
LinkList L;
for(i=1;i<3;i++)
{
ListInsert(L,i,i+1);
}
while(L!=NULL){
printf("%d ",L->data);
L=L->next;
}
return 0;
}
void ListInsert(LinkList L,int i,ElemType e){//插入

LinkList p=L,q;
q=(LinkList)malloc(sizeof(LNODE));
q->data=e;
if(i==1) L=q,q->next=NULL;
while(i>1){
    p=p->next;
    i--;
} 
q->next=p->next;
p->next=q;

}

按题主提供的代码修改,这里是不带头结点的链表的插入,供参考:

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;
struct LNode {
    ElemType     data;
    struct LNode *next;
};
typedef struct LNode *LinkList,LNODE;
void ListInsert(LinkList* L,int i,ElemType e);
int main()
{
    int i;
    LinkList L = NULL,p;
    for(i=0;i<5;i++)
    {
        ListInsert(&L,i+1,i+1);
    }
    ListInsert(&L,1,6);
    p = L;
    while(p!=NULL){
        printf("%d ",p->data);
        p=p->next;
    }
    system("pause");
    return 0;
}
void ListInsert(LinkList* L,int i,ElemType e)//插入
{
    int j;
    LinkList pL,pLr,q;
    if(i < 1) return;
    for(j = 0,pLr = NULL,pL = (*L);pL && j < i-1;pLr = pL,pL = pL->next,j++);
    q = (LinkList)malloc(sizeof(LNODE));
    q->data = e;
    q->next = NULL;
    if((*L) == NULL || pLr == NULL ){  //,q->next=NULL; //i==1
           q->next = pL;               //whil(i>1){
           (*L) = q;                   // p=p->next;
                                       // i--;
    }
    else{
          q->next = pLr->next;
          pLr->next = q;
    }
}