/* Note:Your choice is C IDE */
#include "stdio.h"
#include<malloc.h>
#define LEN sizeof(slink)
typedef struct node
{
    int data;
    struct node *next;
}slink;
slink *creat(int n)
{
    slink *head,*p,*s;
    int i;
    if(n<1)return NULL;
    p=head=(slink *)malloc(LEN);
  //同时为指针开创一个存储空间
    for(i=1;i<=n;i++)
    {
        s=(slink *)malloc(LEN);
        scanf("%d",&s->data);
        p->next=s;
        p=s;
    }
    p->next=NULL;
    return head;
}
void print(slink *head)
{
    slink *p;
    p=head->next;
    while(p)
    {
        printf("%4d",p->data);
        p=p->next;
    }
    printf("\n");
}
int getlen(slink *head)
  //求表长
{
    slink *p;
    int n;
    p=head->next;n=0;
    while(p)
    { n++;p=p->next; }
    return n;
}
slink *del(slink *head,int i)
{
    slink *p,*q;
    int j;
    if(i<1)return 0;
    p=head;j=0;
    while(p->next!=NULL&&j<i-1)
       //删除和增加指向都一样,只是判断的指向不同
    { p=p->next;j++; }
          
    if(p->next==NULL)return 0;
    q=p->next;
    p->next=q->next;
    free(q);
    return head;
}
slink *insert(slink *head,int i,int x)
      //插入到第i个结点之前
{
    slink *p,*q;
    int j;
    if(i<1)return 0;
    p=head;j=0;
    while(p&&j<i-1)
    { p=p->next;j++; }
          //从第一个结点开始查找第i-1个结点,数据域
    if(!p)return 0;
        //i结点为空,返回零值,进行下面的语句
    q=(slink *)malloc(LEN);
    q->data=x;
                   
    q->next=p->next;
    p->next=q;
    return head;
}
void main()
{
    slink *head;
    int n,i1,i2,x;
    scanf("%d",&n);
    head=creat(n);
    printf("输出链表的数据:");
    print(head);
    printf("表的长度:");
    printf("%d\n",getlen(head));
    printf("请输入要删除数的位置:");
    scanf("%d",&i1);
    head=del(head,i1);
    print(head);
    printf("请输入要插入的位置和数据:");
    scanf("%d%d",&i2,&x);
    head=insert(head,i2,x);
    print(head);
}