结构体练习题:第1题:计算日期的差值(1)编写一函数,计算两个日期之间的时间差,并将其值返回。日期以年、月、日表示。“时间差”以天数表示。注意考虑日期之间的闰年。函数的输入参数为日期1和日期2,函数的返回值为时间差,单位为天数。(2)编写一程序,在主函数中输入两个日期,调用上述函数计算两个日期之间的时间差,并将结果输出。为了计算简便,假设用户输入的日期1总是早于日期2。参考代码:#includestdio.hstructdate{intyear;intmonth;intday;};intisLeap(intyear);intdif(structdatea,structdateb);voidmain(){structdatea,b;printf(请输入日期1(空格分隔,年月日):\n);scanf(%d%d%d,&a.year,&a.month,&a.day);printf(请输入日期2(空格分隔,年月日,晚于日期1):\n);scanf(%d%d%d,&b.year,&b.month,&b.day);printf(相差天数为:);printf(%d天\n,dif(a,b));}intisLeap(intyear)//判断一个年份是否是闰年的函数{if(year%400==0||(year%4==0&&year%100!=0))return1;elsereturn0;}intdif(structdatea,structdateb){inti;longday=0,day1=0,day2=0;intd[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};//day变量为年份a到年份b前一年的年份总天数for(i=a.year;ib.year;i++)if(isLeap(i))day+=366;elseday+=365;//day1变量为年份a年初到当天的年内总天数for(i=1;ia.month;++i)day1+=d[isLeap(a.year)][i];day1+=a.day;//day1变量为年份b年初到当天的年内总天数for(i=1;ib.month;++i)day2+=d[isLeap(b.year)][i];day2+=b.day;returnday+day2-day1;}参考截图:第2题:结构体数组应用请定义一个描述学生基本信息的结构,包括姓名,学号,籍贯,身份证号,年龄,家庭住址,性别,联系方式等。并定义一个结构体数组。编程:a)编写函数input(),输入基本信息(3~5条记录);b)编写函数print(),输出全体记录信息;c)编写函数search(),检索一个指定的学生信息并返回,由主函数打印到屏幕上;d)说明,访问结构的时候,什么时候应该用运算符“.”,什么时候应该用运算符“-”。(运算符前是结构体变量时用“.”,是指向结构体变量的指针时用“-”)参考代码:#includestdio.h#includestring.h#defineN3//增加程序的可扩展性structstudent{charname[20];charnum[15];charplace[20];charid[20];intage;charaddress[100];charsex;charphone[15];}stu[N];voidinput(structstudentstu[]);voidprint(structstudentstu[]);voidsearch(structstudentstu[],charname[]);voidmain(){charname[20];input(stu);print(stu);printf(\n请输入想要查找的学生姓名:);scanf(%s,name);search(stu,name);}voidinput(structstudentstu[]){for(inti=0;iN;i++){printf(请输入第%d个学生的信息:\n,i+1);printf(姓名:);scanf(%s,stu[i].name);printf(学号:);scanf(%s,stu[i].num);printf(籍贯:);scanf(%s,stu[i].place);printf(身份证号:);scanf(%s,stu[i].id);printf(年龄:);scanf(%d,&stu[i].age);printf(家庭住址:);scanf(%s,stu[i].address);fflush(stdin);printf(性别(M/F):);scanf(%c,&stu[i].sex);printf(电话:);scanf(%s,stu[i].phone);printf(\n);}}voidprint(structstudentstu[]){printf(姓名学号籍贯身份证号年龄地址性别电话\n);for(inti=0;iN;i++)printf(%-8s%-12s%-10s%-20s%-4d%-10s%-3c%-10s\n,stu[i].name,stu[i].num,stu[i].place,stu[i].id,stu[i].age,stu[i].address,stu[i].sex,stu[i].phone);}voidsearch(structstudentstu[],charname[]){intflag=0;for(inti=0;iN;i++)if(strcmp(stu[i].name,name)==0){printf(%-8s%-12s%-10s%-20s%-4d%-10s%-3c%-10s\n,stu[i].name,stu[i].num,stu[i].place,stu[i].id,stu[i].age,stu[i].address,stu[i].sex,stu[i].phone);flag=1;}if(flag==0)printf(没有该学生的信息!\n\n);}参考截图:第3题:一元多项式加法编写一元多项式加法器,输入两个一元稀疏多项式,然后对它们进行加法操作。在具体实现上,要求用线性链表形式来存储一个多项式,每个链表的节点包括两个成员变量,系数和指数(均为整数)。例如A(x)7530x95x850x9,B(x)80x25x790x8可以用下面的链表表示:说明:(1)每个链表节点都是根据需要动态创建的;(2)程序采用多函数形式来实现,至少包括创建链表、打印链表、加法函数等。(3)多项式系数可正、可负;指数肯定是非负整数,且按照递增顺序排列输入格式:第一行是一个整数M,表示第一个多项式的项数。接下来有M行,每行有两个整数ci和ei,分别表示第i项的系数和指数。再接下来是输入第二个多项式,方法同第一个多项式输入。输出格式:输出两个多项式相加的结果。第一行是整数K,表示新多项式的项数。接下来有K行,每一行为两个整数,分别代表系数和指数。参考代码:#includestdio.h#includestdlib.h#defineLENsizeof(structpolynomial)structpolynomial{inta;intx;structpolynomial*next;};structpolynomial*create(int);voidprint(structpolynomial*);structpolynomial*add(structpolynomial*,structpolynomial*);voidmain(){structpolynomial*head1,*head2,*p0,*p;intm1,m2,i,n=0;printf(请输入第一个多项式的项数:);scanf(%d,&m1);printf(请输入第一个多项式(一项一行升幂排列,格式:系数指数):\n);head1=create(m1);printf(请输入第二个多项式的项数:);scanf(%d,&m2);printf(请输入第二个多项式(一项一行升幂排列,格式:系数指数):\n);head2=create(m2);p0=add(head1,head2);p=p0;while(p!=NULL){n++;p=p-next;}printf(\n相加后的多项式项数为:%d\n,n);printf(\n相加后的多项式为:\n);print(p0);}structpolynomial*create(intm){structpolynomial*p1,*p2,*head=NULL;p1=p2=(structpolynomial*)malloc(LEN);scanf(%d%d,&p1-a,&p1-x);head=p1;for(inti=1;im;i++){p1=(structpolynomial*)malloc(LEN);scanf(%d%d,&p1-a,&p1-x);p2-next=p1;p2=p1;}p1-next=NULL;return(head);}voidprint(structpolynomial*head){structpolynomial*p;p=head;while(p!=NULL){printf(%d%d\n,p-a,p-x);p=p-next;}}structpolynomial*add(structpolynomial*head1,structpolynomial*head2){structpolynomial*p1,*p2,*p3;p1=head1;while(head2!=NULL)//将后者往前者中插{p3=head2;head2=p3-next;while(((p1-x)(p3-x))&&(p1-next!=NULL))//找到插入点{p2=p1;p1=p1-next;}if(p1-xp3-x)//如果p1的次数大{if(p1==head1){head1=p3;p3-next=p1;}else{p2-next=p3;p3-next=p1;}}elseif(p1-x==p3-x)//如果相等则相加{p1-a=p1-a+p3-a;if(p1-a==0)//若相加后该项的系数为0,则将其删去{if(p1==head1)head1=p1-next;else{p2-next=p1-next;p1=p1-next;}}}else//p1移动至末尾{p1-next=p3;p3-next=NULL;}}return(head1);}参考截图:第4题:循环淘汰有N个同学,编号分别为1,2,3……,N,围成一圈,随便选定一个整数m,让大家按顺时针依次报数,报到m的同学便会从圈子中退出,从而被淘汰,直到最后剩下一个人。编写函数实现上述循环淘汰功能。编写一个程序测试上述函数的功能,要求用户能够任意输入N与m;程序输入最后剩下人的编号。参考代码:#includestdio.h#includemalloc.h#defineLENsizeof(structstu)structstu{intnum;structstu*next;};structstu*create(intn);intselect(structstu*head,intn,intm);voidmain(){structstu*head;intm,n,last;printf(请输入N的值:);scanf(%d,&n);printf(请输入m的值:);scanf(%d,&m);head=create(n);last=select(head,n,m);printf(最后剩下同学的编号是%d号\n\n,last);}structstu*create(intn){structstu*p1,*p2;structstu*head=NULL;p2=p1=(structst