char name[8]; int score[4] }stu[N];
input(struct student stu[]) {int I,j;
for(I=0;I {printf(“input scores of student %d:\\n”,I+1); printf(“NO.:”); scanf(“%s”,stu[i].num); printf(“name: ”); scanf(“%s”, stu[i].name); for(j=0;j<3;j++) {printf(“score%d:”,j++); scanf(“%d”, &stu[i].score[j]);} } printf(“\\n”); } } 11.5 有10个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入10个学生的数据,要求打印出3门课的总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课成绩) 解:#define N 10 struct student {char num[6] char name[8] int score[4] float avr; }stu[N]; main() {int I,j,max,maxi,sum; float average; for(I=0;I {printf(“\\nInput scores of student %d:\\n”,I+1); printf(“NO.:”); scanf(“%s”,stu[i].num); printf(“name”); scanf(“%s”,stu[i].name); for(j=0;j<3;j++) {printf(“score %d:”,j+1); scanf(“%d”, &stu[i].score[j]); } } average=0; max=0; maxi=0; for(i=0;i<3;i++) {sum=0; for(j=0;j<3;j++) sum+=stu[i].score[j]; stu[i].avr=sum/3.0; average+=stu[i].avr; if(sum>max) {max=sum; maxi=I; } } average/=N; printf(“NO. name score1 score2 score3 average\\n”); for(I=0;I {printf(“%5ss”,stu[i].num, stu[i].name); for(j=0;j<3;j++) printf(“?”,stu[i].score[j]); printf(“%8.2f\\n”,stu[i].avr); } printf(“average=%6.2f\\n”,average); printf(“The highest score is:%s,score total:%d.”stu[maxi].name,max); } 11.6 编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针,指向字符串开始的空间。New(n)表示分配n个字节的内存空间。 解:new函数如下: #define NULL 0 #define NEWSIZE 1000 char newbuf[NEWSIZE]; char *newp=newbuf; char *new(int n) {if (newp+n<=newbuf+ NEWSIZE) { newp= newp+n; return(newp-n); } else return(NULL); } 11.7写一函数free,将上题用new函数占用的空间释放。Free(p)表示将p指向的单元以后的内存段释放。 解: #define Null o #define NEWSIZE 1000 char newbuf[NEWSIZE]; char *newp=newbuf; free(char *p) {if((p>=newbuf)&&(p 21 11.8已有a、b亮光链表,每个链表中的结点包括学好、成绩。要求把两个链表合并,按学号升序排列。 解: #include #define LENsizeof(struct student) strut student {long num; int scor; struct student *next }; struct student listA,listB; int n,sum=0; main() {struct student *creat(void); struct student *insert(struct student *,struct student *); void print(struct student *); stuct student *ahead , *bhead,*abh; printf(“\\ninput list a:\\n”); ahead=creat(); sum=sum+|n; abh=insert(ahead,bhead); print(abh); } struct student *creat(void) {struct student *p1,*p2,*head; n=0; p1=p2=(struct student *)malloc(LEN); printf(“input number&scores of student:\\n”); printf(“if number Is 0,stop inputing.\\n”); scanf(“%ld,%d”,&p1->num,&p1->score); head=NULL; while(p1->num!=0) {n=n+1; if(n==1)head=p1; else p2->next =p1; p2=p1; p1=(struct student *)malloc(LEN); scanf(“%ld,,%d”,&p1->num,&p1->score); } p2->next=NULL; return(head); } struct student *insert(struct student *ah,struct student *bh) {struct student *pa1 , *pa2,*pb1,*pb2; pa2=pa1=ah; pb2=pb1=bh; do {while((pb1->num>pa1->num)&&(pa1->next!=NULL)) {pa2=pa1; pa1=pa1->next; } if(pb->num<=pa1->num) {if(ah=pa1) ah=pb1; else pa2->next=pb1; pb1=pb1->next; pb2->next=pa1; pa2=pb2; pb2=pb1; } } while((pa1->next!=NULL)||(pa1==NULL&&pb1!=NULL)); if((pb1->num>pa1->num)&&(pa1->next==NULl)) ap1->next=pb1; return(ah); } void print(struct student *head) {struct student *p; printf(“%ld%d\\n”,p->num,p->score); p=p->next; while(p!=NULL); } 11.9 13个人围成一圈,从第1个人开始顺序报号1、2、3。凡报到“3”者退出圈子。找出最后留在圈子中的人原来的序号。 解: #define N 13 struct person {int number; int nextop; }link[N+1]; main() {int I,count,h; for(I=1;I<=N;I++) {if(I==N) link[i].nextp=1; else link[i].nextp=I+1; link[i].number=I; } printf(“\\n”); count=0; h=N; printf(“sequence that person2 leave the circle:\\n”); while(count 22 {I=0; while(I!=3) {h=link[h].nextp; if(link[h].number) I++; } printf(“M”,link[h].number); link[h].number=0; count++; } printf(“\\nThe last one is”); for(I=1;ii<=N;I++) if(link[i].number) printf(“=”,lin[i].number); } 11.10有两个链表a和b,设结点中包含学号、姓名。从1链表中删去与b链表中有相同学号的那些结点。 解: #define LA 4 #define LB 5 #define NULL 0 struct student {char nump[6]; char name[8]; struct student *next; }A[LA],b[LB]; main() {struct student a[LA]={{“101”,”Wang”},{“102”,”LI”},{“105”,”zhang”},{“106”,”Wei”}}; struct studentb[LB]={{“103”,”Zhang”},{“104”,”Ma”},{“105”,”Chen”},{“107”,”Guo”}, {“108”,”Lui”}}; int I,j; struct student *p, *p1,*p2,*pt,*head1,*head2; head1=a; head2=b; printf(“list a :\\n”);