C编程哈夫曼树的建立和运动会分数统计 求高手啊 发到563437701@qq.com

2024-12-03 00:14:36
推荐回答(2个)
回答1:

运动会分数统计

一、 任务
参加运动会有n个学校,学校编号为1……n。比赛分成m个项目,项目编号为1……m。项目取前五名积分;积分分别为:7、5、3、2、1;(m<=20,n<=20)
功能要求:
1).可以输入各个项目的前五名的学校编号;
2).能统计各学校总分;
3).可以按学校编号输出、学校总分排序输出,输出内容包括学校编号,总分和名次。
规定:输入数据形式和范围:20以内的整数(如果做得更好可以输入学校的名称,运动项目的名称);各学校分数为整形。
界面要求:有合理的提示,根据提示,可以完成相关的功能要求。

二、 存储分析
由于学校个数、项目个数是确定的,并不会随时需要增加或减少,所以采用顺序存储结构较好,并且能随机存取。即采用数组作为存储结构。
学校个数为数组长度,每个数组元素必须包含如下信息:学校编号,项目1成绩,项目2成绩,……,项目m成绩,总分,名次。(方便完成功能1,2,4和3部分)
由于功能3要求能按学校总分排序输出,宜另外按总分顺序存储学校的总分信息。
综合前面分析,需要两个数组,数组1按学校编号顺序存放学校编号,项目1成绩,项目2成绩,……,项目m成绩,总分,名次。数组2按学校总分存放学校编号,总分,名次。

三、 程序结构安排
1、 输入各个项目的前五名的学校编号,填写数组1;
2、 计算数组1的学校总分;
3、 对数组1按总分排序,结果存放在数组2。填写数组2的名次。
4、 将数组2的名次信息填回数组1。

四、 输出
1、 按学校编号输出:即输出数组1相关信息;
2、 按学校总分排序:即输出数组2相关信息;
3、 按学校编号查询学校各个项目的情况:即输出数组1相应学校信息。

五、 举例
有10个学校,5个项目。
数组1:
数组下标 学校编号 项目1 项目2 项目3 项目4 项目5 总分 名次
0 1 7 3 2 12 3
1 2 1 7 2 10 4
2 3 5 3 8 6
3 4 5 1 7 3 16 1
4 5 1 1 7
5 6 2 7 9 5
6 7 5 2 5 1 13 2
7 8 3 2 5 10 4
8 9 1 1 7
9 10 3 7 10 4

数组2:
数组下标 学校编号 总分 名次
0 4 16 1
1 7 13 2
2 1 12 3
3 2 10 4
4 8 10 4
5 10 10 4
6 6 9 5
7 3 8 6
8 5 1 7
9 9 1 7

回答2:

#include
#include
#include

typedef struct node{
int data;
struct node *lchild,*rchild,*next;
}Hufnode;

/*创建不带头结点的单链表*/
Hufnode *creat(Hufnode *head) /*尾插法创建单链表*/
{
int x;
Hufnode *p,*s;
head=(Hufnode *)malloc(sizeof(Hufnode)); /*此句不可以删除*/
head->next=NULL;
head->lchild=NULL;
head->rchild=NULL;

s=head;
scanf("%d",&x);
while(x!=0)
{
p=(Hufnode *)malloc(sizeof(Hufnode)); /*此句不可以删除*/
p->data=x;
p->next=NULL;
p->lchild=NULL;
p->rchild=NULL;
s->next=p;
s=p;
scanf("%d",&x);
}
head=head->next;
return head;
}

int IsEmpty(Hufnode *head) /*判断链表是否为空*/
{
Hufnode *p=NULL;
p=head->next;
if(!p)
return 1;
return 0;
}

void Display(Hufnode *head) /*打印链表*/
{
Hufnode *p;
p=head;
if(IsEmpty(head))
{
printf("The node is empty!");
}
while(p)
{
printf("%-5d",p->data);
p=p->next;
}
}
Hufnode *Insert(Hufnode *head,Hufnode *s)
{
Hufnode *p,*pre;
if(head==NULL)
head=s;
else
{
pre=NULL;
p=head;
while(p && p->data data) /*从当前的head开始,如果不为空,找到指定位置插入*/
{
pre=p;
pre=p->next;
}
s->next=p; /*如果s是最后一个结点,那么p=NULL,s->next=NULL*/
if(pre==NULL)
head=s;
else
pre->next=s;
}
return head;
}

/*创建Huffman树*/
Hufnode *CreatHuffman(Hufnode *head)
{
Hufnode *s,*rl,*rr;
while(head && head->next)
{
rl=head;
rr=head->next;
head=rr->next; /*head为第三个结点*/
s=(Hufnode *)malloc(sizeof(Hufnode));/*生成结点*/
s->next=NULL;
s->data=rl->data+rr->data;
s->lchild=rl; /*左孩子*/
s->rchild=rr; /*右孩子*/
rl->next=rr->next=NULL;
head=Insert(head,s);
}
return head;
}

/*二叉树的前序遍历,递归方式*/
void Preorder(Hufnode *t)
{
if(t)
{
printf("%3d",t->data);
Preorder(t->lchild);
Preorder(t->rchild);
}
}

main()
{
Hufnode *head;
printf("\n请输入结点创建Huffman树(以0结束):");
head=creat(head);

Display(head);
head=CreatHuffman(head);
printf("\n\n前序遍历Huffman树的结果为:");
Preorder(head);

}