- #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;
- }
|