typedef
  struct
  LNode{
     ElemType data;
          //数据域
        struct
   LNode
  *next;
   //后继指针域
}LNode,*LinkList
LinkList CreateList(int n) //建立n个节点的单链表
{
    
    head=(LinkList)malloc(sizeof(LNode));
    head->next=NULL;//初始时头节点后继为空
    for(i=0;i<n;i++)
    {
        NewNode=(LinkList)malloc(sizeof(LNode));
                    //产生新节点
        printf("input the %dth data: ",i+1);
        scanf("%d",&(NewNode->data));// 输入节点数据
        NewNode->next=head->next;
        head->next=NewNode; //将新节点插入在头节点之后
    } //for
    return head;
}
LinkList CreateList_tail(int n) /*
  尾插法建立单链表
  */
{
   tail=head=(LinkList)malloc(sizeof(LNode));
       
    head->next=NULL;
    for(i=0;i<n;i++){
       NewNode=(LinkList)malloc(sizeof(LNode));
       
       printf("input data %i:",i+1);
       scanf("%d",&NewNode->data);
     /*输入元素值*/
       tail->next=NewNode;
       /*新结点连在表末尾*/
       tail=NewNode;
    }
    tail->next=NULL;
                 /*结点指针域置空*/
    return head;
}
Status GetElem(LinkList L,int i,ElemType *e){
//按序号查找值
    j=1;
    p=L->next;
    while(p&&j<i){
                      
        p=p->next;j++;//指针移动i-1次
    }
    if(!p||j>i)
        return ERROR;
                  
   *e=p->data;
                        
   return OK;
}/*GetElem*/
Status ListInsert(LinkList L,int i,ElemType e)
{
     //在带头单链表中第i个位置插入元素e
       j=1;
    p=L;
    while(p&&j<i)
      //找到第i个节点的直接前驱
    {
    p=p->next;
        j++;
      }
    if(!p||j>i) return ERROR;
    NewNode=(LinkList)malloc(sizeof(LNode));
    NewNode->data=e;
    NewNode->next =p->next;
    p->next=NewNode;
     //注意两个语句的先后
    return OK;
}
Status ListDelete(LinkList L, int i, ElemType *e)
{
    // 
    删除以L为头指针的单链表的第i个元素
    p=L;
    j=1 ;
    while(p&&j<i)
  //找到第I-1个节点
    {p=p->next;
            j++;
    }
    if(!p||j>i) return ERROR;
    q=p->next;
    p->next=q->next;
  //改变指针链接
    *e=q->data;
         free(q);
  //释放被删节点
    return OK;
} // ListDelete_L