#include<stdio.h>
#include<malloc.h>
#include<conio.h>
#define ERROR 0
#define OK 1
#define OVERFLOW -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
struct STU{
   char name[20];
   char stuno[10];
   int age;
   int score1;
   int score2;
   int score3;
};
typedef struct STU ElemType;
struct LIST
{
  ElemType *elem;
  int length;
  int listsize;
};
typedef struct LIST List;
int init(List *L)//构造一个空的线性表L
{
   L->elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
   if(!L->elem) exit(OVERFLOW);
   L->length=0;
   L->listsize=LIST_INIT_SIZE;
   return OK;
}
int ListLength(List *L)
{
  return
  L->length;
}
int Insert_SqList(List *va, int i,ElemType x) 
{
    ElemType *p,*q, *newbase;
   if(i<1||i>va->length+1) return ERROR;
   if(va->length>=va->listsize){
   newbase=(ElemType *)realloc(va->elem,(va->listsize+LISTINCREMENT)*sizeof(ElemType));
   if(!newbase)
  exit(OVERFLOW);
                                  
  va->elem=newbase;
  va->listsize+=LISTINCREMENT;
   }
   q=&(va->elem[i-1]);
   for(p=&(va->elem[va->length-1]);p>=q;--p) *(p+1)=*p;
   *q=x;
   ++va->length;
   return OK;
}
int Delete_SqList(List *va, int i, ElemType *x)
{
    ElemType *p,*q;
    if(i<1||i>va->length) return ERROR;
  
    p=&(va->elem[i-1]);
    x=p;
    q=va->elem+va->length-1;
    for(++p;p<=q;++p)*(p-1)=*p;
    --va->length;
    return OK;
}
void printlist(List *L)
{
    int i;
    for(i=0;i<L->length;i++)
    {
        printf("第%d个学生的信息:\n",i+1);
        printf("姓名
  :%s\n学号
  :%s\n年龄:%d\n语文成绩:%d\n数学成绩:%d\n英语成绩:%d\n",L->elem[i].name,L->elem[i].stuno,L->elem[i].age,L->elem[i].score1,L->elem[i].score2,L->elem[i].score3);
  
    }
}
void main()
{ int i,w,n;
int j=1;
  List list; 
  ElemType stu,k;
  init(&list);
  printf("输入要建立的线性表的长度:\n",n);
  scanf("%d",&n);
  for(i=1;i<=n;i++)
 {
    
     printf("输入第%d个学生的信息:\n",i);
     printf("输入第%d个学生的姓名:\n",i);
      scanf("%s",list.elem[i-1].name);
     printf("输入第%d个学生的学号:\n",i);
      scanf("%s",list.elem[i-1].stuno);
     printf("输入第%d个学生的年龄:\n",i);
         scanf("%d",&list.elem[i-1].age);
     printf("输入第%d个学生的语文成绩:\n",i);
     scanf("%d",&list.elem[i-1].score1);
      printf("输入第%d个学生的数学成绩:\n",i);
      scanf("%d",&list.elem[i-1].score2);
      printf("输入第%d个学生的英语成绩:\n",i);
      scanf("%d",&list.elem[i-1].score3);
     list.length++;
    }
    
      printlist(&list);
     while(1)
     {
        printf("请选择您要进行的操作 1. 插入2. 删除3. 退出\n");
     scanf("%d",&i);
     if(i==1)
     {
     
         printf("输入要插入的学生的信息:\n");
         printf("输入要插入的学生的姓名:\n");
         scanf("%s",stu.name);
         printf("输入要插入的学生的学号:\n");
         scanf("%s",stu.stuno);
         printf("输入要插入的学生的年龄:\n");
         scanf("%d",&stu.age);
         printf("输入这个学生的语文成绩:\n");
         scanf("%d",&stu.score1);
    
         printf("输入这个学生的数学成绩:\n");
         scanf("%d",&stu.score2);
    
         printf("输入这个学生的英语成绩:\n");
         scanf("%d",&stu.score3);
         printf("输入要插入的位置:\n");
         scanf("%d",&w);
       Insert_SqList(&list,w,stu);
         printf("插入一个学生后的学生的信息:\n");
         printlist(&list);
     }
     else if(i==2)
     {
        printf("删除一个学生的信息:\n");
        printf("输入要删除的元素在线性表中的位置:\n");
        scanf("%d",&n);
        Delete_SqList(&list,n,&k);
        printf("删除一个学生后的学生的信息:\n");
        printlist(&list);
     }
     else if(i==3)
         exit(0);
     }
}