为什么float型输出float全是0.00啊?

#include<stdio.h>
#include <stdlib.h>
#include <string.h>

struct A{

	struct B *head;
	char *class;
	struct A *next;

};


struct B{

	char *name;
	float Chinese;
	float Math;
	float English;
	float Total;
	struct B *next;

};

struct A *CreatelinkA(struct A *headA,int m){

	int i;
	struct A *new;
	struct A *p = headA;

	for(i = 0;i<m;i++){
	
			new = (struct A *)malloc(sizeof(struct A));	//头插法创建链表
			
			new->head = (struct B *)malloc(sizeof(struct B)); //给新节点开辟空间
			new->class = (char *)malloc(16);
			memset(new->class,'\0',16);
			new->next = p;

			p = new;					//p重新指向头节点
			
			
	}

	headA = p;	//把headA 指向 p指向的空间,即链表A的头节点

	return headA;   
}


struct A *CreatelinkB(struct A *headA,int n){

	int k = 0;
	int i;
	struct A *p = headA;
	struct B *q ;
	struct B *new;

	while(p != NULL){
		
		q = p->head;
		q->name = (char *)malloc(16);
		q->next = NULL;

		for(i = 0;i<(n-1);i++){					//尾插法创建链表B

                        new = (struct B *)malloc(sizeof(struct B));
                        
                        new->name = (char *)malloc(16);

			new->next = NULL;

                        q->next = new;			//q重新指向尾节点
			q = new;
		
		}

		p = p->next;

	
	}


	return headA;

}


struct A *data_input(struct A *headA){

	struct A *p = headA;

	struct B *q = p->head;

	int k = 0;

	int t = 0;

	while(p != NULL){

		k++;
	
		printf("请输入第%d个班级的名字:",k);

		scanf("%s",p->class);

		getchar();

		while(q != NULL){

			t++;
			
			printf("请输入%s班第%d个学生的名字:",p->class,t);
			gets(q->name);

			printf("请输入%s的语文成绩:",q->name);
			scanf("%f",&(q->Chinese));
			getchar();

			printf("请输入%s的数学成绩:",q->name);
		        scanf("%f",&(q->Math));
                        getchar();
	
			printf("请输入%s的英语成绩:",q->name);
                        scanf("%f",&(q->English));
                        getchar();

			q->Total == q->Chinese + q->Math + q->English;			

			
			q = q->next;
		
		}
	
		
		t = 0;
		p = p->next;

		if(p != NULL){

		q = p->head;
		
		}
	
	}



	return headA;
}


void data_operation(float *MaxTotal,float *MinTotal,float *Average,struct A *headA,int m,int n){

	struct A *p = headA;
	struct B *q = p->head;

	*MaxTotal = 0;
	*MinTotal = 9999 ;
	float sum = 0;
	int  a = m*n;

	while(p != NULL ){
	
		while(q != NULL){
		
			if(q->Total > *MaxTotal){
			
				*MaxTotal = q->Total;

			}


			if(q->Total < *MinTotal ){
			
				*MinTotal = q->Total;

			}


			sum = sum +q->Total;
		
			q = q->next;
		
		}
	
		p = p->next;

		if(p != NULL){

		q = p->head;

		}
	}

	*Average = sum/a;
	
}


void result(float *MaxTotal,float *MinTotal,float *Average){

	printf("MaxTotal = %0.2f\n",*MaxTotal);

	printf("MinTotal = %0.2f\n",*MinTotal);

	printf("Average = %0.2f\n",*Average);

}

int main(){

	struct A *headA = NULL;	//定义链表A的头节点
	int m =  2;	//链表A的节点个数		
	int n =  2;	//链表B的节点个数		

	float MaxTotal;	//最高分
	float MinTotal;	//最低分	
	float Average;	//平均分	 

	headA = CreatelinkA(headA,m);	//创建链表A

	headA = CreatelinkB(headA,n);	//创建链表B

	headA = data_input(headA);	//输入学生信息

	data_operation(&MaxTotal,&MinTotal,&Average,headA,m,n);	//数据分析处理

 	result(&MaxTotal,&MinTotal,&Average);	//结果打印输出						

	return 0;

}

 

你可以把出问题的代码简化成5行以内的代码来说明你不解的地方吗?