#include<stdio.h>//单链表的定义和基本操作
#include<stdlib.h>//malloc函数所需要的头文件
#include<stddef.h>//定义NULLL的头文件

typedef struct LNode//定义单链表的节点
{
    int data;
    struct LNode*next;
}LNode;

void Creatlinklist(LNode *&L,int a[],int n)//尾插法建立单链表
{
    int i;
    LNode*r;
    LNode*p;
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    r=L;
    for(i=0;i<n;i++)
    {
        p=(LNode*)malloc(sizeof(LNode));
        p->data=a[i];
        r->next=p;
        r=r->next;
    }
    r->next =NULL;
}
 
void Creatlinklist2(LNode *&L,int a[],int n)//头插法建立单链表
{
    int i;
    LNode*p;
    L=(LNode*)malloc(sizeof(LNode));
    L->next=NULL;
    for(i=0;i<n;i++)
    {
        p=(LNode*)malloc(sizeof(LNode));
        p->data=a[i];
        p->next=L->next;
        L->next=p;
    }
}



int FindAndDeletelem(LNode *&L,int x)//寻找并删除等于x的元素成功返回1失败返回0
{
    LNode *p;
    LNode *q;
    p=L;
    while(p->next!=NULL)
    {
        if(p->next->data==x)
            break;
        p=p->next ;
    }
    if(p->next==NULL)
        return 0;
    else
    {
        q=p->next;
        p->next=q->next;
        free(q);
        return 1;
    }
}


int Insertlist(LNode *&L,int i,int a)//在第i个元素的位置插入数据a(有头结点)
{
    int j;
    LNode *p,*q;
    q=L;
    p=(LNode*)malloc(sizeof(LNode));
    p->data=a;
    for(j=1;j<i;q=q->next)
        j++;
    p->next=q->next ;
    q->next=p;
    return 1;
}



int main()//测试程序
{
    LNode *L;
    int a[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
    Creatlinklist(L,a,10);
    FindAndDeletelem(L,5);
    Insertlist(L,5,22);
    printf("%d",L->next->next->next->next->next->data);
    return 0;
}