鱼C论坛

 找回密码
 立即注册
查看: 1207|回复: 6

[作品展示] 多项式计算【C】

[复制链接]
发表于 2023-11-24 08:37:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  数据结构课的作业,昨晚写完的,说是小组作业实则基本上就是我自己一个人写……其他人根本就不会啥


  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>

  4. typedef struct Node{
  5.     float coef;   // 系数
  6.     int exp;      // 指数
  7.     struct Node *next;
  8. }Node, *Polynomial;

  9. // 创建新节点
  10. Node* createNode(float coef, int exp){
  11.     Node *node = (Node*)malloc(sizeof(Node));
  12.     node->coef = coef;
  13.     node->exp = exp;
  14.     node->next = NULL;
  15.     return node;
  16. }

  17. // 创建多项式
  18. void createPolynomial(Polynomial *p){
  19.     int n;
  20.     float coef;
  21.     int exp;

  22.     printf("请输入待插入多项式的项数:");
  23.     scanf("%d", &n);

  24.     for(int i=0; i<n; i++){
  25.         printf("请插入新第%d项的系数和指数:(按降幂输入)", i+1);
  26.         scanf("%f %d", &coef, &exp);
  27.         if(coef != 0){
  28.             Node *node = createNode(coef, exp);
  29.             if(*p == NULL){
  30.                 *p = node;
  31.             }else{
  32.                 Node *last = *p;
  33.                 while(last->next != NULL){
  34.                     last = last->next;
  35.                 }
  36.                 last->next = node;
  37.             }
  38.         }
  39.         else
  40.         {
  41.                 printf("系数不应为0!\n");
  42.                 }
  43.     }
  44. }

  45. // 输出多项式
  46. void printPolynomial(Polynomial p){
  47.     if(p == NULL){
  48.         printf("0\n");
  49.     }else{
  50.         while(p != NULL){
  51.             printf("%.2f", p->coef);
  52.             if(p->exp != 0){
  53.                 printf("x^%d", p->exp);
  54.             }
  55.             if(p->next != NULL && p->next->coef > 0){
  56.                 printf("+");
  57.             }
  58.             p = p->next;
  59.         }
  60.         printf("\n");
  61.     }
  62. }

  63. //多项式赋值
  64. void assignPolynomial(Polynomial *a, Polynomial b){
  65.     Node *p = NULL;
  66.     Node *q = b;
  67.     //int k;

  68.     // 如果b为空链表,直接返回
  69.     if (q == NULL) {
  70.             printf("赋值多项式为空!\n");
  71.         return;
  72.     }

  73.     // 如果a不为空链表,先删除a的所有节点
  74.     while(*a != NULL){
  75.         Node *temp = *a;
  76.         *a = (*a)->next;
  77.             free(temp);
  78.     }
  79.     /*k = (p == NULL);
  80.     printf("%d\n",k);*/
  81.    
  82.     // 复制b的所有节点到a
  83.     while(q != NULL){
  84.         Node *node = createNode(q->coef, q->exp);
  85.         if(p == NULL){
  86.                 //printf("成功");
  87.             *a = node;
  88.             p = *a;
  89.         }else{
  90.             p->next = node;
  91.             p = p->next;
  92.         }
  93.         q = q->next;
  94.     }
  95.    
  96. }


  97. // 多项式相加
  98. Polynomial addPolynomial(Polynomial a, Polynomial b){
  99.     Node *pa = a;
  100.     Node *pb = b;
  101.     Polynomial c = NULL, pc = NULL;

  102.     while(pa != NULL && pb != NULL){
  103.         if(pa->exp > pb->exp){
  104.             if(pa->coef != 0){
  105.                 Node *node = createNode(pa->coef, pa->exp);
  106.                 if(c == NULL){
  107.                     c = node;
  108.                     pc = c;
  109.                 }else{
  110.                     pc->next = node;
  111.                     pc = pc->next;
  112.                 }
  113.             }
  114.             pa = pa->next;
  115.         }else if(pa->exp < pb->exp){
  116.             if(pb->coef != 0){
  117.                 Node *node = createNode(pb->coef, pb->exp);
  118.                 if(c == NULL){
  119.                     c = node;
  120.                     pc = c;
  121.                 }else{
  122.                     pc->next = node;
  123.                     pc = pc->next;
  124.                 }
  125.             }
  126.             pb = pb->next;
  127.         }else{
  128.             float coef_sum = pa->coef + pb->coef;
  129.             if(coef_sum != 0){
  130.                 Node *node = createNode(coef_sum, pa->exp);
  131.                 if(c == NULL){
  132.                     c = node;
  133.                     pc = c;
  134.                 }else{
  135.                     pc->next = node;
  136.                     pc = pc->next;
  137.                 }
  138.             }
  139.             pa = pa->next;
  140.             pb = pb->next;
  141.         }
  142.     }

  143.     while(pa != NULL){
  144.         if(pa->coef != 0){
  145.             Node *node = createNode(pa->coef, pa->exp);
  146.             pc->next = node;
  147.             pc = pc->next;
  148.         }
  149.         pa = pa->next;
  150.     }

  151.     while(pb != NULL){
  152.         if(pb->coef != 0){
  153.             Node *node = createNode(pb->coef, pb->exp);
  154.             pc->next = node;
  155.             pc = pc->next;
  156.         }
  157.         pb = pb->next;
  158.     }

  159.     return c;
  160. }

  161. // 多项式相减
  162. Polynomial subPolynomial(Polynomial a, Polynomial b){
  163.     Node *pa = a;
  164.     Node *pb = b;
  165.     Polynomial c = NULL, pc = NULL;

  166.     while(pa != NULL && pb != NULL){
  167.         if(pa->exp > pb->exp){
  168.             if(pa->coef != 0){
  169.                 Node *node = createNode(pa->coef, pa->exp);
  170.                 if(c == NULL){
  171.                     c = node;
  172.                     pc = c;
  173.                 }else{
  174.                     pc->next = node;
  175.                     pc = pc->next;
  176.                 }
  177.             }
  178.             pa = pa->next;
  179.         }else if(pa->exp < pb->exp){
  180.             if(-pb->coef != 0){
  181.                 Node *node = createNode(-pb->coef, pb->exp);
  182.                 if(c == NULL){
  183.                     c = node;
  184.                     pc = c;
  185.                 }else{
  186.                     pc->next = node;
  187.                     pc = pc->next;
  188.                 }
  189.             }
  190.             pb = pb->next;
  191.         }else{
  192.             float coef_diff = pa->coef - pb->coef;
  193.             if(coef_diff != 0){
  194.                 Node *node = createNode(coef_diff, pa->exp);
  195.                 if(c == NULL){
  196.                     c = node;
  197.                     pc = c;
  198.                 }else{
  199.                     pc->next = node;
  200.                     pc = pc->next;
  201.                 }
  202.             }
  203.             pa = pa->next;
  204.             pb = pb->next;
  205.         }
  206.     }

  207.     while(pa != NULL){
  208.         if(pa->coef != 0){
  209.             Node *node = createNode(pa->coef, pa->exp);
  210.             pc->next = node;
  211.             pc = pc->next;
  212.         }
  213.         pa = pa->next;
  214.     }

  215.     while(pb != NULL){
  216.         if(-pb->coef != 0){
  217.             Node *node = createNode(-pb->coef, pb->exp);
  218.             pc->next = node;
  219.             pc = pc->next;
  220.         }
  221.         pb = pb->next;
  222.     }

  223.     return c;
  224. }


  225. // 多项式求值
  226. float evalPolynomial(Polynomial p, float x){
  227.     float sum = 0;

  228.     while(p != NULL){
  229.         float term = p->coef * pow(x, p->exp);
  230.         sum += term;
  231.         p = p->next;
  232.     }

  233.     return sum;
  234. }


  235. // 多项式求导
  236. Polynomial derPolynomial(Polynomial p){
  237.     Node *q = NULL, *last = NULL;

  238.     while(p != NULL){
  239.         if(p->exp > 0){
  240.             float coef_der = p->coef * p->exp;
  241.             Node *node = createNode(coef_der, p->exp-1);
  242.             if(q == NULL){
  243.                 q = node;
  244.                 last = q;
  245.             }else{
  246.                 last->next = node;
  247.                 last = last->next;
  248.             }
  249.         }
  250.         p = p->next;
  251.     }

  252.     return q;
  253. }

  254. //更新多项式
  255. void updatePolynomial(Polynomial *p)
  256. {
  257.         while(*p != NULL){
  258.         Node *temp = *p;
  259.         *p = (*p)->next;
  260.         free(temp);
  261.     }
  262.    
  263.     int n;
  264.     float coef;
  265.     int exp;

  266.     printf("请输入待插入多项式的项数:");
  267.     scanf("%d", &n);

  268.     for(int i=0; i<n; i++){
  269.         printf("请插入新第%d项的系数和指数:(按降幂输入)", i+1);
  270.         scanf("%f %d", &coef, &exp);
  271.         if(coef != 0){
  272.             Node *node = createNode(coef, exp);
  273.             if(*p == NULL){
  274.                 *p = node;
  275.             }else{
  276.                 Node *last = *p;
  277.                 while(last->next != NULL){
  278.                     last = last->next;
  279.                 }
  280.                 last->next = node;
  281.             }
  282.         }
  283.         else
  284.         {
  285.                 printf("系数不应为0!\n");
  286.                 }
  287.     }
  288. }

  289. int main(){
  290.     Polynomial A = NULL, B = NULL;
  291.     int choice;
  292.     float x;

  293.     while(1){
  294.         printf("请选择操作:\n");
  295.         printf("1.向多项式A插入\t\t");
  296.         printf("2.向多项式B插入\n");
  297.         printf("3.输出多项式A\t\t");
  298.         printf("4.输出多项式B\n");
  299.         printf("5.将A赋值给B\t\t");
  300.         printf("6.将B赋值给A\n");
  301.         printf("7.计算A+B\t\t");
  302.         printf("8.计算A-B\n");
  303.         printf("9.计算多项式的值\n");
  304.         printf("10.求多项式的导数\n");
  305.         printf("11.更新多项式A\t\t");
  306.         printf("12.更新多项式B\n");
  307.         printf("13.退出\n");
  308.         scanf("%d", &choice);

  309.         switch(choice){
  310.             case 1:
  311.                 createPolynomial(&A);
  312.                 break;
  313.             case 2:
  314.                 createPolynomial(&B);
  315.                 break;
  316.             case 3:
  317.                 printf("A = ");
  318.                 printPolynomial(A);
  319.                 break;
  320.             case 4:
  321.                 printf("B = ");
  322.                 printPolynomial(B);
  323.                 break;
  324.             case 5:
  325.                 assignPolynomial(&B, A);
  326.                 /*if (B==NULL){
  327.                         assignPolynomial(&B,A);
  328.                                 }*/
  329.                 break;
  330.             case 6:
  331.                 assignPolynomial(&A, B);
  332.                 /*if (A==NULL){
  333.                         assignPolynomial(&A,B);
  334.                                 }*/
  335.                 break;
  336.             case 7:
  337.                 printf("A + B = ");
  338.                 printPolynomial(addPolynomial(A, B));
  339.                 break;
  340.             case 8:
  341.                 printf("A - B = ");
  342.                 printPolynomial(subPolynomial(A, B));
  343.                 break;
  344.             case 9:
  345.                 printf("请输入x的值:");
  346.                 scanf("%f", &x);
  347.                 printf("A(%g) = %g\n", x, evalPolynomial(A, x));
  348.                 printf("B(%g) = %g\n", x, evalPolynomial(B, x));
  349.                 break;
  350.             case 10:
  351.                 printf("A' = ");
  352.                 printPolynomial(derPolynomial(A));
  353.                 printf("B' = ");
  354.                 printPolynomial(derPolynomial(B));
  355.                 break;
  356.             case 11:
  357.                                  updatePolynomial(&A);
  358.                                  break;
  359.                         case 12:
  360.                                  updatePolynomial(&B);
  361.                                  break;
  362.             case 13:
  363.                 return 0;
  364.             default:
  365.                 printf("无效操作,请重新选择。\n");
  366.         }
  367.     }

  368.     return 0;
  369. }
复制代码


评分

参与人数 2荣誉 +8 鱼币 +8 贡献 +6 收起 理由
中英文泡椒 + 3 + 3 + 3 鱼C有你更精彩^_^
tommyyu + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-24 08:38:15 | 显示全部楼层
这段代码是一个多项式计算器,可以实现多项式的创建、输出、赋值、相加、相减、求值、求导等功能。主要使用了链表来存储多项式的每一项。

首先,定义了一个结构体Node表示多项式中的每一项,包含系数和指数两个成员变量,同时声明了typedef别名Polynomial表示指向Node结构体的指针。

然后,实现了一些基本的操作函数,如createNode用于创建一个新节点,createPolynomial用于创建多项式,printPolynomial用于输出多项式,assignPolynomial用于将一个多项式赋值给另一个多项式,addPolynomial和subPolynomial分别用于多项式的相加和相减,evalPolynomial用于求多项式在某个特定值下的值,derPolynomial用于求多项式的导数,updatePolynomial用于更新多项式。

最后,在main函数中实现了一个简单的交互界面,通过输入选择操作,调用相应的函数进行处理。

这段代码中的注释已经很详细了,如果你有具体的问题,可以提出来让我帮你解答。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

点评

也行吧,就当是AI总结了  发表于 2023-11-24 08:55
作品展示也会回答嘛  发表于 2023-11-24 08:54
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 09:23:49 | 显示全部楼层
我记得我之前用了 Python 写了一个类似的丐版
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-24 11:10:59 | 显示全部楼层
这个你写了多久?
熟练度多少?
自学还是有人教?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-26 14:39:13 | 显示全部楼层
六翻了 发表于 2023-11-24 11:10
这个你写了多久?
熟练度多少?
自学还是有人教?

一个礼拜断断续续,熟练度,其实没有什么高级东西,就是简单的代码堆起来的,至于你最后那个问题,这是我们的作业……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-19 23:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表