void InsertNew(){
int p=0,i;
STU temp1={0};
printf("请输入要插入学生信息的位置,如将信息放在第一位则输入1\n");
scanf("%d",&p);
stu[NUM-1].o=p;
for(i=NUM-2;i>=0;i--)
{
if(p < stu[i].o){
temp1=stu[i+1];
stu[i+1]=stu[i];
stu[i]=temp1;
}
else{
printf("请输入学生信息:");
printf("Student ID(zy00*)\n");
scanf("%s",stu[p-1].id);
getchar();//Absorb extra line breaks
printf("name\n");
scanf("%s",stu[p-1].name);
printf("Please input the score of each subject\n");
stu[p-1].sum=0;
for(int j =0;j<3;j++)
{
scanf("%f",&stu[p-1].ach[j]);
stu[p-1].sum +=stu[p-1].ach[j];
}
break;
}
}
这是部分代码,请问为什么输出的效果,在插入一个新的数据前我的结构体不会往后移动?
下面是我结构体的定义
typedef struct student{//定义一个结构体
char name[NL];
char id[NUM];
float ach[3];
//Computer programming
//Physical Education
//Communication and Research
float sum;
float avg;
int o;
}STU;
STU stu[NUM];
有几点疑问: 1.你结构体中的o是什么意思? 2.插入的时候为什么要比较p和o的大小?
正确逻辑应该是: 1.获取插入的学生信息(不要把获取信息放在for循环中) 2.获取需要插入的位置;(1和2换一下也无所谓) 3.根据插入规则,将学生信息插入到数组中,如果只是将p以后的数据后移,完全不用比较p和o,而且stu[NUM-1].o=p;这句话更是让人摸不着头脑,这句话有什么意义 4.建议用一个数来记录当前数组中实际存在的结构体个数。
1。最好用链表结构(结构体里面加一个指向下一个结构的指针)。 2。如果非要用数组,那么找到位置p之后,把p后面的数组元素一个一个后移。
/* 从现有数组的最后一个元素(M, M<N-1)向后移动,如果数组已满,
* 新加一个结构体后,重新申请一个大的内存,把原来的数组复制过来。
*/
for (i = M; i > p; i --) {
stu[i].sum = stu[i-1].sum;
....
}
/* 然后把p插入到空出来的位置 */
stu[i].sum = tmp1.sum;
...