三道C程题

来源:百度知道 编辑:UC知道 时间:2024/07/03 03:15:03
1、有n个人围成一圈,顺序排号,从第一个人开始报数(从1到3),凡是报到3的人退出圈子。问最后留下的是原来几号的那位(要求:用指针)
2、有5个学生,每个学生有3门课的成绩,从键盘输入学生数据(包括学生号,姓名,三门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。
3、请编程建立一个带有头结点的单项链表,链表结点中的数据通过键盘输入,当输入数据为-1时,表示输入结束。(链头结点的data域不放数据,表空的条件是ph->next=NULL)

三道题,150分,谢谢!

第1题:
#include<stdio.h>
#include<stdlib.h>
struct circle {int num;struct circle *next;};
void main()
{ int n,i;
struct circle * p,*q;

printf("请输入围成一圈的人数n=");
scanf("%d",&n);
p=(struct circle*)calloc( n,sizeof(struct circle) );
for(i=1;i<n;i++)
{(p+i-1)->num=i;(p+i-1)->next=p+i;}
(p+n-1)->num=n;(p+i-1)->next=p;
for(i=1;p->next!=p;i++)
{if(i%3==0) q->next=p->next;q=p;p=p->next;}
printf("最后留下的是%d号\n",p->num);}
第2题:
#include "stdio.h"
#define N 5
void main()
{struct students{
int num;
char name[15];
float grade1;
float grade2;
float grade3;
float average;}stu[N];
FILE *fp;
int i;
float average1=0,average2=0,average3=0;
for(i=0;i<N;i++)
{printf("请依次输入第%d学生的学号,姓名,第1科成绩,第2科成绩,第3科成绩:",i+1);
scanf(&qu