C语言建立一个链表,其每个结点代表一位学生的信息。信息从文件student.in读取。求平均年龄;并且按字母顺序对链表排序,输出排序后的学生姓名和学号

题目描述:建立一个链表,其每个节点代表一位学生的信息。信息从文件student.in中读取(文件student.in是外部已经存在文件,其格式为第一行是一个大于零的整数表示学生数量,以后每行表示一位学生的信息分别有学号、姓名、性别、年龄)。

    要求:1. 求所有学生的平均年龄

               2. 以姓名为标准按照字母表顺序对链表进行排序,输出排序后的学生姓名和学号

题目分析:本题主要考察c语言中的文件读写信息、链表创建和链表排序。

           先介绍一下c语言中对文件操作的函数  : 

               (1)c语言中打开文件函数fopen(文件名,使用文件方式),关闭文件fclose(文件指针),其中文件读写方式主要                          ①"r"只 读 ②"w"只写,如果指定文件不存在建立新文件③"r+"读写④"w+"读写,如果指定文件不存在建立新文件。

               (2)c语言中读写字符所用函数fgetc(fp)从fp所指向的文件读入一个字符;fputc(ch,fp)把字符ch写到文件指针变量fp所指              向的文件中

               (3)其次C语言读写字符串所用函数fets(str,n,fp)从fp指向的文件读入一个长度为n-1的字符串,存放到字符数组str中;                 fputs(str,fp)把str所指向的字符串写到文件指针变量fp所指向的文件中。

           本题解决思路:先把文件student.in中的信息读出,然后用这些信息建立学生链表(StuLink)。链表创建完成后,完成要求               1:遍历链表找出每个学生的年龄,然后求平均年龄。完成要求二 :利用选择排序思想对学生姓名按字母表顺序进行链表              排序,然后输出排序好的姓名和学号。  

   一、已经存在的文件student.in信息

               

       本文件我将它放在桌面具体路径为C:\Users\Mr.w\Desktop\student.in,以便在读入文件信息时快速找到此文件

   二、读入文件信息并创建链表

        部分代码:

	
    typedef struct Student{
	   int num;    //学号
	   char name[20]; //姓名
	   char sex[2];     //性别
	   int age;    //年龄

	   struct Student *next;
    }Student,*StuLink;
    

    fp = fopen("C:\\Users\\Mr.w\\Desktop\\student.in", "r");//在指定位置读取信息
    fgets(ch,4,fp);    //读取信息
    q = (StuLink)malloc(sizeof(Student));   //创建单个学生结点
    fgets(q->name, 5, fp);  //将读取到的学生姓名赋予当前学生结点的name域

    三、求平均年龄

void ageAverage(StuLink s){
	StuLink p=s->next;
	int sum = 0, count = 0;
	double aver;
	while (p!=NULL)
	{
		sum += p->age;
		count++;
		p = p->next;
	}
	aver =(double) sum / count;
	printf("平均分:%.2f\n", aver);
}

   四、对学生姓名按字母表顺序排序

void nameSort(StuLink s){
	StuLink minpre, min, p, pre,r;
	r = s;
	while (r->next != NULL){  //选择排序对链表按名字排序
		pre = r;
		p = pre->next;
		min = p;
		minpre = pre;
		while (p != NULL)
		{
			if (strcmp(min->name,p->name) > 0){
				minpre = pre;
				min = p;
			}
			pre = p;
			p = p->next;
		}
		if (r->next == min)
			r = r->next;
		else{
			minpre->next = min->next;  //防止断链
			min->next = r->next;    //尾插法
			r->next = min;    
			r = min;

		}

	}
	r = s->next;
	while (r!=NULL)
	{
		printf("%s %d\n", r->name,r->num);
		r = r->next;
	}
	
}

运行结果:

                   

     对本问题有什么疑问欢迎讨论!!!

猜你喜欢

转载自blog.csdn.net/weixin_42070473/article/details/105067634