user-0 提问: 求助：关于读入文本格式数据并排序问题的思路

回复:
user: user-0
content: 感谢大家指点！我学C两周多时间，水平还很低，链表这些都还没开学。这道题是谭浩强第三版作业。待会仔细看看你们的回复。有问题还会请教你们的！

user: user-1

user: user-1
content: 实际应用 比如你有1000个数据 STUDENT  stu[1000];  你有6个字段，你可以定义6个排序，即按每列排序 LIST   *SortHead[6]; LIST   *SortTail[6]; 创建排序如下 for(int x=0;x<6;x++) { 	for(int i=0;i<1000;i++) 	{ 		LIST *p=new LIST; 		p->data=&stu[i]; 		p->prev=NULL; 		p->next=NULL;  		if(SortHead[x]==NULL) 		{ 			SortHead[x]=p; 			SortTail[x]=p; 		} 		else 		{ 			SortTail[x]->next=p; 			p->prev=SortTail[x]; 			SortTail[x]=p; 		} 	} } 然后分别对SortHead[6]的6个链进行排序i计算和节点交换 完成后排序就准备好了  由于你同一时间只能操作一种，你只需要定义一个默认的指针 LIST   *SortNormalHead； LIST   *SortNormalTail； 比如，按第一列排序显示给观众，则SorNormalHead=SortHead[0];  SorNormalTail=SortTail[0], 按第6列排序显示给观众，则SorNormalHead=SortHead[5];  SorNormalTail=SortTail[5],  补充说明： 如果你操作熟练后，你发现stu[1000]是不合理的 因为数据有多有少，所以最后其实数据读取还多出一根绳， 那根绳按不排序的方式挂住数据，排序的绳以不排序绳作为数据构建基础

user: user-1
content: 编程的核心是数据结构+算法 文件是实现数据的保存，和算法无关 排序本身是一种算法，只和数据结构有关，和文件无关  struct student { 	char name[90]; 	int id; 	float mathscore; 	float englishscore; 	float chinesescore; 	float average; }stu[3]; 这东西只是个结构体，并非数据结构，所以你依靠他保存读取文件是挺方便的 但一设计算法，就傻B了，这就是因为对数据结构没有很好认识。 再直接点说，结构体最多是种数据类型，并不是数据结构 而你的这东西连数据类型都算不上 你应该养成如下习惯，先定义数据类型，再去定义变量，思路才会清晰起来 typedef struct tagSTUDENT { 	char name[90]; 	int id; 	float mathscore; 	float englishscore; 	float chinesescore; 	float average; }STUDENT;  STUDENT stu[3];  有了定义好的数据类型，才能在定义变量的同时，方便的定义数据结构 比如链表 typedef struct tagLIST { 	STUDENT *data; 	struct tagLIST *prev; 	struct tagLIST *next; }LIST  数据就好比瓜儿一样吊在STUDENT *data;上 LIST就向线一样链接了所有的瓜 根据data的数据，改变LIST链接的先后顺序，着就是排序 数据本身的大小，位置，都是不变的 因为有了LIST就有了顺藤摸瓜的便利，这才是正道  试想一堆瓜，不是用绳接先后去标记，而是抱着瓜真实的排大小，你不累吗？

user: user-0
content: fscanf(fp,"%10d%20s%10.2f%10.2f%10.2f%10.2f",temp.id,temp.name,temp.mathscore,temp.englishscore,temp.chineses 少写了取地址符号&。 编译运行成功，但是读的值是0，不知道为什么。

user: user-0
content: 接着上面的话题，我先实现读取结构体数组字段的功能。我写的代码如下：编译通过，可是运行崩溃了。请高手帮忙查找一下错误！ #include <stdio.h> #include <stdlib.h> int count; struct student { 	char name[90]; 	int id; 	float mathscore; 	float englishscore; 	float chinesescore; 	float average; } stu[3],temp;   struct student readfile(void);  int main() { 	for(count=0;count<3;count++) 	{ 	stu[count]=readfile(); 	printf("total is:%f\n",stu[count].mathscore+stu[count].englishscore+stu[count].chinesescore);     }     return 0; }  struct student readfile() { 	FILE *fp; 	if((fp=fopen("stud.dat","r"))==NULL)     {     	fputs("Can't open stud.dat!",stderr);     	exit(1); 	} 	fscanf(fp,"%10d%20s%10.2f%10.2f%10.2f%10.2f",temp.id,temp.name,temp.mathscore,temp.englishscore,temp.chinesescore,temp.average); 	fclose(fp); 	return temp; }

user: user-0
content: 请注意用c语言

user: user-0
content: #include <stdio.h>  #include <stdlib.h> int count; struct student { 	char name[90]; 	int id; 	float mathscore; 	float englishscore; 	float chinesescore; 	float average; } stu[3];  struct student getinfo(); struct student calculateaverage(struct student); void savedata(struct student); int main() { 	for (count=0;count<3;count++) 	{ 		stu[count]=getinfo(); 		stu[count]=calculateaverage(stu[count]); 		savedata(stu[count]); 	} 	return 0; }  struct student getinfo() { 	struct student temp; 	printf("Input Name:\n"); 	gets(temp.name); 	printf("ID number:\n"); 	scanf("%d",&(temp.id)); 	printf("Math score:\n"); 	scanf("%f",&(temp.mathscore)); 	printf("English score:\n"); 	scanf("%f",&(temp.englishscore)); 	printf("Chinese score:\n"); 	scanf("%f",&(temp.chinesescore)); 	while(getchar()!='\n') 	    continue; 	return temp; }  struct student calculateaverage(struct student stu) { 		struct student temp; 		temp=stu; 		temp.average=(temp.mathscore+temp.englishscore+temp.chinesescore)/3; 		return temp; }  void savedata(struct student stu) { 	FILE *fp; 	if((fp=fopen("stud.dat","a+"))==NULL) 	{ 		fputs("Can't open stud.dat file\n",stderr); 		exit(1);     }    	fprintf(fp,"%10d%20s%10.2f%10.2f%10.2f%10.2f\n",stu.id,stu.name,stu.mathscore,stu.englishscore,stu.chinesescore,stu.average); 	fclose(fp); 	return; 	  } /*希望构建三个函数分别实现读入、排序和输出。对如何排序也是没有头绪。请指导！*/

user: user-2
content: 为什么限定死呢，只要建立 CPP项目  ，或者文件名扩展为 .cpp 就可以 使用 C++的容器和 算法库了  所以，这样处理起来就简单了，不要自己去重复 造 轮子了，先把功能实现取来吧。  你可以贴出 几行样本数据，我可以写一个看看

user: user-3
content: 怎么写的就怎么读，用fscanf,第1，2个参数与fprintf一样，但注意，如果是读double型，要改成%lf  排序C语言只有一个qsort可以用