#define   MAXSIZE   50
#define NULL 0
typedef struct
{    long num;  
     char name[20];
     int  age;
     char sex[2];
     char address[20];
}student;
    typedef struct  Node
      { student data;
        struct Node *next;
      } LNode,*LinkList;
LinkList Creat_LinkList()
{
         LinkList L;
         LNode *s;
         char a[2];
         int flag;
         L =  (LNode *) malloc (sizeof(LNode));
         L -> next = NULL;
        
         do{
             s = (LNode *) malloc (sizeof(LNode)); 
              printf("请输入学号:(1~40)");
            scanf("%ld",&s->data.num);
            printf("请输入姓名:");
            scanf("%s",s-> data.name);
            printf("请输入性别:");
             scanf("%s",a);
             printf("请输入年龄:");
             scanf("%d",&s-> data.age);
           printf("请输入地址:");
            scanf("%s",s-> data.address);
            strcpy(s->data.sex,a);
             printf("请输入节点值,如链表结束,请输入-1:");
             scanf("%d",&flag);
              s ->next=L->next;
            L ->next=s ;
         }while( flag!=-1);
        
     return L;
}
 void Show_LinkList(LinkList L)
{
   LNode *s;
   s = L->next;
   printf("\t学号\t姓名\t性别\t年龄\t地址\n");
   while(s!= NULL)     
     {printf("\t%ld\t%s\t%c\t%d\t%s\n",s->data.num,s->data.name,s->data.sex,s->data.age,s->data.address); 
           s = s -> next ;
          
     }
     printf("\n");
}
int Insert_LinkList( LinkList L,int i,int x)
{
    LNode *p,*s;
    p =  Get_LinkList(L,i-1);
    if ( p == NULL )
    {
        printf("错误的参数值!\n");
        return 0 ;
    }
    else 
    {
         s= (LNode *)malloc ( sizeof ( LNode ) );
         s->data = x;
         s -> next = p-> next ;
         p -> next = s;
         return  1;
    }
}

int  Del_LinkList ( LinkList L,int i)
{
    LNode  *p,*s;
    p = Get_LinkList(L,i-1);
    if( p == NULL)
    {
        printf("第i-1个节点不存在\n");
        return -1;
    }
    else  if ( p-> next == NULL)
        {
            printf("第i个节点不存在\n");
            return 0;
        }
    else 
    {
        s = p->next ;
        p -> next = s ->next;
        free(s);

    }
}

   main()
{  int i,j,x;
    LinkList L;
   do{
       printf("1、从前面插入的链表   2、输出 3、插入  4、删除 0、退出\n");
       scanf("%d",&i);
       if(i == 1 )  L =  Creat_LinkList();
       if(i == 2 )  Show_LinkList( L);
       if(i == 3 ) { printf("请在指定位置插入数值,请输入位置(请在1 ~ %d 之内选择):",Length_LinkList(L));
                      scanf("%d",&j);
                     printf("请输入您要插入的数值:");
                      scanf("%d",&x);
                     if(Insert_LinkList(L,j,x) == 0 )
                       printf("插入失败!\n");
                     else { printf("数据插入成功,新数据序列为:\n");
                            Show_LinkList(L);}
                   }
       if(i == 4 ){printf("请在指定位置插入数值,请输入位置(请在1 ~ %d 之内选择):",Length_LinkList(L)+1);
                      scanf("%d",&j);
                     if(Get_LinkList(L,j) == NULL ) printf("您查找的节点为空!\n");
                     else { printf("您确定要删除数据:%d: 确定请输入1,输入其他数字退出删除 ",Get_LinkList(L,j)->next); 
                            scanf("%d",&x);
                            if(x ==1)
                            {   if(Del_LinkList (L,j) == 0 )    printf("数据删除失败!\n");
                                else { printf("数据数据成功,新数据序列为:\n");
                                       Show_LinkList(L);}                 
                            }
                             else printf("您放弃了删除\n");
                          }
                     }
     }while(i!=0); 
    return 0;
 }