关于结构体顺序表存储另结构体的代码有一些小问题不懂,求大神解答
不懂的都在下面标注了。这里再说一下,不知道为什么要用到place函数和move函数,还有creat函数里j=!(l->length)?0:place(l,c,num)的意思。为什么不能删除place和move函数然后在creat函数里面直接输入结构体信息?如果不用place和move函数该怎么实现存放学生信息的结构体?#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct {
int cla;
int num;
char name[20];
char sex;
long phonenum;
}student;
typedef struct{
student *elem;
int length;
int sum;
}ST;
ST *initlist(){
ST *l;
l=(ST*)malloc(sizeof(ST));
if(!l)printf("没有创建ST!\n");
l->length=0;l->sum=10;
l->elem=(student*)malloc(10*sizeof(student));
if(!l->elem)printf("没有创建elem!\n");
return(l);
}
int place(ST *l,int c,int num){//不知道这个函数和下一个函数的作用
int low,high,mid,j=-1,i;
low=0;high=l->length-1;
while(low<=high){
mid=(low+high)/2;
if(l->elem[mid].num>num)high=mid-1;
else {j=mid;low=mid+1;}
}i=j;
for(j=mid;j>=i;j--){
if(j==-1||num>l->elem[j].num)break;
else
if(num==l->elem[j].num&&c>l->elem[j].cla)break;}
return(++j);
}
void move(ST *l,int j){
int i;
for(i=l->length-1;i>=j;i--){
l->elem[i+1].cla=l->elem[i].cla;
strcpy(l->elem[i+1].name,l->elem[i].name);
l->elem[i+1].num=l->elem[i].num;
l->elem[i+1].sex=l->elem[i].sex;
l->elem[i+1].phonenum=l->elem[i].phonenum;
}
}
void createlist(ST *l){
int i,j,c,num;
char nam[20],s;long p;
printf("输入学生信息(class name num sex phonenum):\n");
for(i=0;i<l->sum;i++){
flushall();
scanf("%d %s %d %c %ld",&c,nam,&num,&s,&p);//为什么不能把place,move函数和下面的删除然后把scanf改成下面那样(试过但输出乱码)?
//scanf("%d%s%d%c%ld",&l->elem[i].cla,&l->elem[i].name,&l->elem[i].num,&l->elem[i].sex,&l->elem[i].phonenum);
j=!(l->length)?0:place(l,c,num);//这个是什么意思
move(l,j);
l->elem[j].cla=c;
strcpy(l->elem[j].name,nam);
l->elem[j].num=num;
l->elem[j].sex=s;
l->elem[j].phonenum=p;
l->length++;
}
}
void printlist(ST *l){
int i,j=0;
printf("当前表中信息如下:class/name/num/sex/phonenum\n");
for(i=0;i<l->sum;i++){
printf("class:%d,name:%s,num:%d,sex:%c,phonenum:%ld\n",l->elem[i].cla,l->elem[i].name,l->elem[i].num,l->elem[i].sex,l->elem[i].phonenum);
if(++j==10){j=0;printf("\n");
}
}
printf("\n");
}
void main(){
ST *l;
printf("class1\n");
l=initlist();
createlist(l);
printlist(l);
}