假设某专业有若干个班,每个班有若干学生,每个学生包含姓名和分数,这样构成一棵树,如图1所示。假设树中每个结点的name域均不相同,该树采用孩子兄弟链存储结构,其结点类型定义如下:

假设某专业有若干个班,每个班有若干学生,每个学生包含姓名和分数,这样构成一棵树,如图1所示。假设树中每个结点的name域均不相同,该树采用孩子兄弟链存储结构,其结点类型定义如下:
typedef struct node
{ char name[50]; //专业、班号或姓名
float score; //分数
struct node *child; //指向最左边的孩子结点
struct node *brother; //指向下一个兄弟结点
} TNode;
完成以下算法:
(1)设计一个算法求所有的学生人数。
(2)求指定某班的平均分。
假设某专业有若干个班,每个班有若干学生,每个学生包含姓名和分数,这样构成一棵树,如图1所示。假设树中每个结点的name域均不相同,该树采用孩子兄弟链存储结构,其结点类型定义如下:_第1张图片
解:(1)算法如下:

int Count(TNode *b)
{
     
	if (b==NULL) return 0;
	if (b->child==NULL) return 1;
	return count(b->child)+count(b->brother);
}

说明:本题可以从链表的角度求解。
(2)算法如下:

int Average(TNode *b,char class[],float &avg)
{
     
	int n=0;
	float sum=0;
	TNode *p=b->child;		//p指向班号结点
	while (p!=NULL && strcmp(p->name,class)!=0)
		p=p->brother;
	if (p==NULL) return 0;	//没找到该班号,返回0
	p=p->child;				//p指向该班的第一个学生
	while (p!=NULL)
	{
     
		n++;				//累计人数
		sum+=p->score;		//累计分数
		p=p->brother;
	}
	avg=sum/n;				//求平均分
	return 1;
}

你可能感兴趣的:(数据结构,JAVA编程,链表,数据结构,算法)