C语言,结构体,新的信息插入,求

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;
...