#include <stdio.h>
#include <stdlib.h>
struct TriAngle{
int a ; //直角三角形的勾
int b ; //直角三角形的股
int c ; //直角三角形的弦
int score ; //累计得分
struct TriAngle *next ; //下一个
} ;
//计算得分
int getScore(unsigned char x,
unsigned char y,
unsigned char z)
{
//得分 = x平方 + y平方 - z平方
int iret = x * x + y * y - z * z ;
//如果三个数是勾股弦,则得2000分
if (iret==0) {
iret = 2000;
}
return iret ;
}
//动态分配一个新节点
struct TriAngle *newNode(void)
{
return malloc(sizeof(struct TriAngle));
}
//输出历次结果,并释放内存
void output(struct TriAngle *node, int no)
{
//显示当前节点的情况
printf("%2d %2d,%2d,%2d %4d\n", no, node->a, node->b, node->c, node->score);
//如果下一个节点不为空
if (node->next != NULL) {
//递归调用下一个节点的输出并释放内存
output(node->next, no+1);
}
//如果不是“头”结点,释放当前节点的内存
if (no != 1) {
free(node);
}
}
int main(void)
{
struct TriAngle head; //头部地址固定,这很重要
struct TriAngle *p = &head ; //p为当前节点,从头部开始
//初始化
head.score = 0;
head.next = NULL;
//循环输入数据
while (1) {
printf("请输入三个小于20的数:");
scanf("%d,%d,%d", &p->a, &p->b, &p->c);
//检查输入的数据合法性
if (p->a > 20 || p->b > 20 || p->c > 20) {
printf("三个数不能大于20,请重试。\n");
} else {
//当前分数进行累加
p->score += getScore(p->a, p->b, p->c);
//如果超过正负1000
if (p->score < -1000 || p->score > 1000) {
//设置最终结点并退出循环
p->next = NULL;
break;
} else {
//动态请示下一个节点,并初始化累加分数,然后当前指针移向下一个
p->next = newNode();
p->next->score = p->score ;
p = p->next ;
}
}
}
//打印输出头部,调用输出并释放内存函数
printf("No a b c 得分\n");
output(&head, 1);
return 0;
}
|