在删除数组的一个结构后怎么内容改变了是什么原因?
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
typedef struct {
char no[8]; //8位学号
char name[20]; //姓名
int price; //成绩
}Student;
Student *le=NULL;
typedef struct {
Student *elem; //指向数据元素的基地址
int length; //线性表的长度
}SqList;
typedef struct {
};
int main(){
int a,i,n,c;
static int x;
//Student *new;
printf("\n********************************\n\n");
puts("1. 构造顺序表");
puts("2. 录入学生信息");
puts("3. 显示学生信息");
puts("4. 输入姓名,查找该学生");
puts("5. 显示某位置该学生信息");
puts("6. 在指定位置插入学生信息");
puts("7. 在指定位置删除学生信息");
puts("8. 统计学生个数");
puts("0. 退出");
printf("\n********************************\n\n");
while(1){
printf("请输入选项:");
scanf("%d",&a);
switch(a){
case 1://创建顺序表
printf("请输入学生总人数:");
scanf("%d",&x);
le=(Student *)malloc(sizeof(Student)*x);//Student *le[MAX]=(Student *)malloc(sizeof(Student)*x);不能用?
if(le!=NULL)//Student *le=(Student *)malloc(sizeof(Student)*x);不能用仅在这个大括号中有用。在别的大括号不能用
printf("创建顺序表完毕\n");
else printf("创建失败\n");
break;
case 2:{
printf("请输入学生信息:");
for(i=0;i<x;i++){
printf("请输入第%d输入姓名:",i+1);
if(le!=NULL)
scanf("%s",(le+i)->name);
printf("请输入第%d输入学号:",i+1);
scanf("%s",(le+i)->no);
printf("请输入第%d输入分数:",i+1);
scanf("%d",&(le+i)->price);
printf("第%d个输入完毕\n",i+1);
}
break;
}
case 3:{
for(i=0;i<x;i++){
printf("姓名:%s 学号:%s 成绩:%d\n",(*(le+i)).name,(*(le+i)).no,(*(le+i)).price);
}
printf("显示完毕\n");
break;
}
case 4:{
char str[MAX];
int flag=1;
printf("输入姓名查找信息:");
scanf("%s",str);
if(flag<x+1){
flag++;
for(i=0;i<x;i++)
if(strcmp(str,(le+i)->name)==0){
printf("姓名:%s 学号:%s 成绩:%d\n",(*(le+i)).name,(*(le+i)).no,(*(le+i)).price);
break;
}
}else printf("没有这个学生的信息\n");
}break;
case 5:{
printf("请输入想要查找的位置:");
//scanf("%d",&i);
while(1){
scanf("%d",&i);
if(i>0 && i<x+1){
printf("姓名:%s 学号:%s 成绩:%d\n",(*(le+i-1)).name,(*(le+i-1)).no,(*(le+i-1)).price);
break;
}
else
printf("你输入的位置不正确输入范围在[1——%d],请重新输入:",x);
}break;
}
case 6:{
printf("请输入想要插入的位置:");
scanf("%d",&c);
x++;
a=x;
le=realloc(le,sizeof(Student)*x);
if(c>0 && c<x){
for(a=a-1;a>c-1;a--){
strcpy((*(le+a)).name,(*(le+a-1)).name);
strcpy((*(le+a)).no,(*(le+a-1)).no);
strcpy(&((le+a)->price),&((le+a-1)->price));
}
printf("请输入姓名:");
scanf("%s",(*(le+c-1)).name);
printf("请输入学号:");
scanf("%s",(*(le+c-1)).no);
printf("请输入分数:");
scanf("%d",&(*(le+c-1)).price);
printf("输入完毕\n");
}
else
printf("输入数值非法\n");
break;
}
case 7:{
printf("请输入想要删除的位置:");
scanf("%d",&c);
a=x;
x--;
le=realloc(le,sizeof(Student)*x);
if(c>0 && c<a){
for(c=c-1;c<a-1;c++){
strcpy((le+c)->name,(le+c+1)->name);
strcpy((le+c)->no,(le+c+1)->no);
strcpy(&(le+c)->price,&(le+c+1)->price);
}
printf("删除完毕\n");break;
}else
printf("输入位置非法\n");
break;
}
case 8:{
printf("总共有:%d个学生\n",x);break;
}
case 0:{free(le);
printf("你已成功退出\n");
exit(0);
}
default:
if(le!=NULL)
free(le);
printf("输入非法导致退出!\n");exit(0);}}}
删除后一个数组成员时在再显示内容变了,这是什么原因?