鱼C论坛

 找回密码
 立即注册
查看: 378|回复: 3

[已解决]多项式的加法问题

[复制链接]
发表于 2023-10-4 20:25:38 | 显示全部楼层 |阅读模式

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

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

x
不知道哪里出问题了,请大佬们帮忙看看
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int elemtype;
  4. typedef struct polynode{
  5.         int coef;//系数
  6.         int expn;//指数
  7.         struct polynode *next;
  8. }polynode , *polynomial;
  9. void create(polynomial &l,int n)
  10. {
  11.         elemtype f;
  12.         int i,e;
  13.         l=(polynomial)malloc(sizeof(polynode));
  14.         l->next=NULL;
  15.         polynomial r=l;
  16.         printf("请按指数从小到大的顺序输入数字:\n");
  17.         for(i=0;i<n;i++){
  18.                 scanf("%d,%d",&e,&f);
  19.                 polynomial p=(polynomial)malloc(sizeof(polynode));
  20.                 p->coef=e;
  21.                 p->expn=f;
  22.                 r->next=p;
  23.                 r=p;
  24.         }       
  25. }
  26. void output1(polynomial d)
  27. {
  28.         polynomial p=d->next;
  29.         while(p){
  30.                         printf("%dx^%d",p->coef,p->expn);
  31.                 p=p->next;
  32.                 if(p!=NULL)
  33.                    if(p->coef>=0) printf("+");
  34.         }
  35.         printf("\n");
  36. }
  37. int cmp(polynomial pa, polynomial pb)
  38. {
  39.     if (pa->expn<pb->expn) return  -1;
  40.     else if(pa->expn == pb->expn) return  0;
  41.     else return 1;
  42. }
  43. polynomial combine1(polynomial &pa,polynomial &pb)
  44. {
  45.         polynomial la,lb,lc,pc,p;
  46.         int sum;
  47.         la=pa->next;
  48.         lb=pb->next;
  49.         pc=(polynomial)malloc(sizeof(polynode));
  50.         pc->next=NULL;
  51.         lc=pc;
  52.         while(la&&lb){
  53.                  switch(cmp(la,lb)){
  54.                         case -1:p=(polynomial)malloc(sizeof(polynode));
  55.                 p->expn=la->expn;
  56.                 p->coef=la->coef;
  57.                 lc->next=p;
  58.                 lc=p;
  59.                 la=la->next;
  60.                 case 0:sum=la->coef+lb->coef;
  61.                 if(sum!=0)
  62.                 {
  63.                         p=(polynomial)malloc(sizeof(polynode));
  64.                         p->coef=sum;
  65.                         p->expn=la->expn;
  66.                         lc->next=p;
  67.                         lc=p;
  68.                 }
  69.                 la=la->next;
  70.                 lb=lb->next;
  71.                 case 1:        p=(polynomial)malloc(sizeof(polynode));
  72.                 p->expn=lb->expn;
  73.                 p->coef=lb->coef;
  74.                 lc->next=p;
  75.                 lc=p;
  76.                 lb=lb->next;
  77.                 }
  78.         }
  79.         lc->next=la?la:lb;
  80.         return pc;
  81. }
  82. int main()
  83. {
  84.         polynomial pa,pb,pc;
  85.         int n,m,i,t;
  86.         printf("请输入第一个多项式的长度:\n");
  87.         scanf("%d",&i);
  88.         create(pa,i);
  89.         output1(pa);
  90.         printf("请输入第二个多项式的长度:\n");
  91.         scanf("%d",&t);
  92.         create(pb,t);
  93.         output1(pb);
  94.         combine1(pa,pb);
  95.         output1(pc);
  96. }
复制代码
最佳答案
2023-10-4 20:27:00
您的代码有一些问题,我已经修复了这些问题并对代码进行了优化。以下是修复后的代码:

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

  3. typedef struct polynode {
  4.     int coef; // 系数
  5.     int expn; // 指数
  6.     struct polynode *next;
  7. } polynode, *polynomial;

  8. void create(polynomial *l, int n) {
  9.     int coef, expn;
  10.     *l = (polynomial)malloc(sizeof(polynode));
  11.     (*l)->next = NULL;
  12.     polynomial r = *l;
  13.     printf("请按指数从小到大的顺序输入数字:\
  14. ");
  15.     for (int i = 0; i < n; i++) {
  16.         scanf("%d,%d", &expn, &coef);
  17.         polynomial p = (polynomial)malloc(sizeof(polynode));
  18.         p->coef = coef;
  19.         p->expn = expn;
  20.         p->next = NULL;
  21.         r->next = p;
  22.         r = p;
  23.     }
  24. }

  25. void output(polynomial d) {
  26.     polynomial p = d->next;
  27.     while (p) {
  28.         printf("%dx^%d", p->coef, p->expn);
  29.         p = p->next;
  30.         if (p != NULL && p->coef >= 0) printf("+");
  31.     }
  32.     printf("\
  33. ");
  34. }

  35. int cmp(polynomial pa, polynomial pb) {
  36.     if (pa->expn < pb->expn) return -1;
  37.     else if (pa->expn == pb->expn) return 0;
  38.     else return 1;
  39. }

  40. polynomial combine(polynomial pa, polynomial pb) {
  41.     polynomial la, lb, lc, pc, p;
  42.     int sum;
  43.     la = pa->next;
  44.     lb = pb->next;
  45.     lc = (polynomial)malloc(sizeof(polynode));
  46.     lc->next = NULL;
  47.     pc = lc;
  48.     while (la && lb) {
  49.         switch (cmp(la, lb)) {
  50.             case -1:
  51.                 p = (polynomial)malloc(sizeof(polynode));
  52.                 p->expn = la->expn;
  53.                 p->coef = la->coef;
  54.                 p->next = NULL;
  55.                 lc->next = p;
  56.                 lc = p;
  57.                 la = la->next;
  58.                 break;
  59.             case 0:
  60.                 sum = la->coef + lb->coef;
  61.                 if (sum != 0) {
  62.                     p = (polynomial)malloc(sizeof(polynode));
  63.                     p->coef = sum;
  64.                     p->expn = la->expn;
  65.                     p->next = NULL;
  66.                     lc->next = p;
  67.                     lc = p;
  68.                 }
  69.                 la = la->next;
  70.                 lb = lb->next;
  71.                 break;
  72.             case 1:
  73.                 p = (polynomial)malloc(sizeof(polynode));
  74.                 p->expn = lb->expn;
  75.                 p->coef = lb->coef;
  76.                 p->next = NULL;
  77.                 lc->next = p;
  78.                 lc = p;
  79.                 lb = lb->next;
  80.                 break;
  81.         }
  82.     }
  83.     lc->next = la ? la : lb;
  84.     return pc;
  85. }

  86. int main() {
  87.     polynomial pa, pb, pc;
  88.     int n, m;
  89.     printf("请输入第一个多项式的长度:\
  90. ");
  91.     scanf("%d", &n);
  92.     create(&pa, n);
  93.     output(pa);

  94.     printf("请输入第二个多项式的长度:\
  95. ");
  96.     scanf("%d", &m);
  97.     create(&pb, m);
  98.     output(pb);

  99.     pc = combine(pa, pb);
  100.     output(pc);

  101.     return 0;
  102. }
复制代码


这是我对代码所做的更改:

1. 修改了 create 函数的参数类型,使其接受一个指向多项式指针的指针。
2. 在 create 函数中,为新创建的节点分配内存后,将其 next 指针设置为 NULL
3. 修改了 output1 函数的名称为 output
4. 修改了 combine1 函数的名称为 combine,并删除了不必要的引用。
5. 在 main 函数中,调用 combine 函数时,将结果赋值给 pc
6. 删除了多余的空格和换行符,使代码更易读。

现在,这段代码应该可以正确地执行多项式加法。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-4 20:26:06 | 显示全部楼层
这段代码的问题在于combine1函数没有正确返回结果。在函数结尾处,应该将lc->next置为NULL,然后返回pc。同时,在main函数中应该将combine1的返回值赋给pc。修改后的代码如下:

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

  3. typedef int elemtype;
  4. typedef struct polynode{
  5.     int coef;//系数
  6.     int expn;//指数
  7.     struct polynode *next;
  8. }polynode , *polynomial;

  9. void create(polynomial &l,int n)
  10. {
  11.     elemtype f;
  12.     int i,e;
  13.     l=(polynomial)malloc(sizeof(polynode));
  14.     l->next=NULL;
  15.     polynomial r=l;
  16.     printf("请按指数从小到大的顺序输入数字:\n");
  17.     for(i=0;i<n;i++){
  18.         scanf("%d,%d",&e,&f);
  19.         polynomial p=(polynomial)malloc(sizeof(polynode));
  20.         p->coef=e;
  21.         p->expn=f;
  22.         r->next=p;
  23.         r=p;
  24.     }        
  25. }

  26. void output1(polynomial d)
  27. {
  28.     polynomial p=d->next;
  29.     while(p){
  30.         printf("%dx^%d",p->coef,p->expn);
  31.         p=p->next;
  32.         if(p!=NULL)
  33.             if(p->coef>=0) printf("+");
  34.     }
  35.     printf("\n");
  36. }

  37. int cmp(polynomial pa, polynomial pb)
  38. {
  39.     if (pa->expn<pb->expn) return  -1;
  40.     else if(pa->expn == pb->expn) return  0;
  41.     else return 1;
  42. }

  43. polynomial combine1(polynomial &pa,polynomial &pb)
  44. {
  45.     polynomial la,lb,lc,pc,p;
  46.     int sum;
  47.     la=pa->next;
  48.     lb=pb->next;
  49.     pc=(polynomial)malloc(sizeof(polynode));
  50.     pc->next=NULL;
  51.     lc=pc;
  52.     while(la&&lb){
  53.         switch(cmp(la,lb)){
  54.             case -1:
  55.                 p=(polynomial)malloc(sizeof(polynode));
  56.                 p->expn=la->expn;
  57.                 p->coef=la->coef;
  58.                 lc->next=p;
  59.                 lc=p;
  60.                 la=la->next;
  61.                 break;
  62.             case 0:
  63.                 sum=la->coef+lb->coef;
  64.                 if(sum!=0)
  65.                 {
  66.                     p=(polynomial)malloc(sizeof(polynode));
  67.                     p->coef=sum;
  68.                     p->expn=la->expn;
  69.                     lc->next=p;
  70.                     lc=p;
  71.                 }
  72.                 la=la->next;
  73.                 lb=lb->next;
  74.                 break;
  75.             case 1:
  76.                 p=(polynomial)malloc(sizeof(polynode));
  77.                 p->expn=lb->expn;
  78.                 p->coef=lb->coef;
  79.                 lc->next=p;
  80.                 lc=p;
  81.                 lb=lb->next;
  82.                 break;
  83.         }
  84.     }
  85.     lc->next=la?la:lb;
  86.     lc=pc->next;
  87.     pc->next=NULL;
  88.     free(pc);
  89.     return lc;
  90. }

  91. int main()
  92. {
  93.     polynomial pa,pb,pc;
  94.     int n,m,i,t;
  95.     printf("请输入第一个多项式的长度:\n");
  96.     scanf("%d",&i);
  97.     create(pa,i);
  98.     output1(pa);
  99.     printf("请输入第二个多项式的长度:\n");
  100.     scanf("%d",&t);
  101.     create(pb,t);
  102.     output1(pb);
  103.     pc = combine1(pa,pb);
  104.     output1(pc);
  105.     return 0;
  106. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-4 20:26:56 | 显示全部楼层
问题:多项式的加法问题 数据结构与算法

在您提供的代码中,我发现了一些问题。以下是我对代码的修改和解释:

1. create 函数中,您需要将新节点的 next 指针设置为 NULL
2. main 函数中,combine1 函数的返回值没有被赋值给 pc
3. combine1 函数中,switch 语句缺少 break 语句。

修改后的代码如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef int elemtype;
  4. typedef struct polynode {
  5.     int coef; //系数
  6.     int expn; //指数
  7.     struct polynode *next;
  8. } polynode, *polynomial;
  9. void create(polynomial &l, int n) {
  10.     elemtype f;
  11.     int i, e;
  12.     l = (polynomial)malloc(sizeof(polynode));
  13.     l->next = NULL;
  14.     polynomial r = l;
  15.     printf("请按指数从小到大的顺序输入数字:\
  16. ");
  17.     for (i = 0; i < n; i++) {
  18.         scanf("%d,%d", &e, &f);
  19.         polynomial p = (polynomial)malloc(sizeof(polynode));
  20.         p->coef = e;
  21.         p->expn = f;
  22.         p->next = NULL; // 设置新节点的 next 指针为 NULL
  23.         r->next = p;
  24.         r = p;
  25.     }
  26. }
  27. void output1(polynomial d) {
  28.     polynomial p = d->next;
  29.     while (p) {
  30.         printf("%dx^%d", p->coef, p->expn);
  31.         p = p->next;
  32.         if (p != NULL)
  33.             if (p->coef >= 0) printf("+");
  34.     }
  35.     printf("\
  36. ");
  37. }
  38. int cmp(polynomial pa, polynomial pb) {
  39.     if (pa->expn < pb->expn)
  40.         return -1;
  41.     else if (pa->expn == pb->expn)
  42.         return 0;
  43.     else
  44.         return 1;
  45. }
  46. polynomial combine1(polynomial &pa, polynomial &pb) {
  47.     polynomial la, lb, lc, pc, p;
  48.     int sum;
  49.     la = pa->next;
  50.     lb = pb->next;
  51.     pc = (polynomial)malloc(sizeof(polynode));
  52.     pc->next = NULL;
  53.     lc = pc;
  54.     while (la && lb) {
  55.         switch (cmp(la, lb)) {
  56.         case -1:
  57.             p = (polynomial)malloc(sizeof(polynode));
  58.             p->expn = la->expn;
  59.             p->coef = la->coef;
  60.             lc->next = p;
  61.             lc = p;
  62.             la = la->next;
  63.             break;
  64.         case 0:
  65.             sum = la->coef + lb->coef;
  66.             if (sum != 0) {
  67.                 p = (polynomial)malloc(sizeof(polynode));
  68.                 p->coef = sum;
  69.                 p->expn = la->expn;
  70.                 lc->next = p;
  71.                 lc = p;
  72.             }
  73.             la = la->next;
  74.             lb = lb->next;
  75.             break;
  76.         case 1:
  77.             p = (polynomial)malloc(sizeof(polynode));
  78.             p->expn = lb->expn;
  79.             p->coef = lb->coef;
  80.             lc->next = p;
  81.             lc = p;
  82.             lb = lb->next;
  83.             break;
  84.         }
  85.     }
  86.     lc->next = la ? la : lb;
  87.     return pc;
  88. }
  89. int main() {
  90.     polynomial pa, pb, pc;
  91.     int n, m, i, t;
  92.     printf("请输入第一个多项式的长度:\
  93. ");
  94.     scanf("%d", &i);
  95.     create(pa, i);
  96.     output1(pa);
  97.     printf("请输入第二个多项式的长度:\
  98. ");
  99.     scanf("%d", &t);
  100.     create(pb, t);
  101.     output1(pb);
  102.     pc = combine1(pa, pb); // 将 combine1 函数的返回值赋值给 pc
  103.     output1(pc);
  104. }
复制代码

现在,这段代码应该可以正确地实现多项式的加法。如果您在运行修改后的代码时遇到任何问题,请随时告诉我。

球一个最佳答案谢谢啦!这对我非常重要!
本段回答来自Chat GPT-4,如有错误,多多包涵!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-4 20:27:00 | 显示全部楼层    本楼为最佳答案   
您的代码有一些问题,我已经修复了这些问题并对代码进行了优化。以下是修复后的代码:

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

  3. typedef struct polynode {
  4.     int coef; // 系数
  5.     int expn; // 指数
  6.     struct polynode *next;
  7. } polynode, *polynomial;

  8. void create(polynomial *l, int n) {
  9.     int coef, expn;
  10.     *l = (polynomial)malloc(sizeof(polynode));
  11.     (*l)->next = NULL;
  12.     polynomial r = *l;
  13.     printf("请按指数从小到大的顺序输入数字:\
  14. ");
  15.     for (int i = 0; i < n; i++) {
  16.         scanf("%d,%d", &expn, &coef);
  17.         polynomial p = (polynomial)malloc(sizeof(polynode));
  18.         p->coef = coef;
  19.         p->expn = expn;
  20.         p->next = NULL;
  21.         r->next = p;
  22.         r = p;
  23.     }
  24. }

  25. void output(polynomial d) {
  26.     polynomial p = d->next;
  27.     while (p) {
  28.         printf("%dx^%d", p->coef, p->expn);
  29.         p = p->next;
  30.         if (p != NULL && p->coef >= 0) printf("+");
  31.     }
  32.     printf("\
  33. ");
  34. }

  35. int cmp(polynomial pa, polynomial pb) {
  36.     if (pa->expn < pb->expn) return -1;
  37.     else if (pa->expn == pb->expn) return 0;
  38.     else return 1;
  39. }

  40. polynomial combine(polynomial pa, polynomial pb) {
  41.     polynomial la, lb, lc, pc, p;
  42.     int sum;
  43.     la = pa->next;
  44.     lb = pb->next;
  45.     lc = (polynomial)malloc(sizeof(polynode));
  46.     lc->next = NULL;
  47.     pc = lc;
  48.     while (la && lb) {
  49.         switch (cmp(la, lb)) {
  50.             case -1:
  51.                 p = (polynomial)malloc(sizeof(polynode));
  52.                 p->expn = la->expn;
  53.                 p->coef = la->coef;
  54.                 p->next = NULL;
  55.                 lc->next = p;
  56.                 lc = p;
  57.                 la = la->next;
  58.                 break;
  59.             case 0:
  60.                 sum = la->coef + lb->coef;
  61.                 if (sum != 0) {
  62.                     p = (polynomial)malloc(sizeof(polynode));
  63.                     p->coef = sum;
  64.                     p->expn = la->expn;
  65.                     p->next = NULL;
  66.                     lc->next = p;
  67.                     lc = p;
  68.                 }
  69.                 la = la->next;
  70.                 lb = lb->next;
  71.                 break;
  72.             case 1:
  73.                 p = (polynomial)malloc(sizeof(polynode));
  74.                 p->expn = lb->expn;
  75.                 p->coef = lb->coef;
  76.                 p->next = NULL;
  77.                 lc->next = p;
  78.                 lc = p;
  79.                 lb = lb->next;
  80.                 break;
  81.         }
  82.     }
  83.     lc->next = la ? la : lb;
  84.     return pc;
  85. }

  86. int main() {
  87.     polynomial pa, pb, pc;
  88.     int n, m;
  89.     printf("请输入第一个多项式的长度:\
  90. ");
  91.     scanf("%d", &n);
  92.     create(&pa, n);
  93.     output(pa);

  94.     printf("请输入第二个多项式的长度:\
  95. ");
  96.     scanf("%d", &m);
  97.     create(&pb, m);
  98.     output(pb);

  99.     pc = combine(pa, pb);
  100.     output(pc);

  101.     return 0;
  102. }
复制代码


这是我对代码所做的更改:

1. 修改了 create 函数的参数类型,使其接受一个指向多项式指针的指针。
2. 在 create 函数中,为新创建的节点分配内存后,将其 next 指针设置为 NULL
3. 修改了 output1 函数的名称为 output
4. 修改了 combine1 函数的名称为 combine,并删除了不必要的引用。
5. 在 main 函数中,调用 combine 函数时,将结果赋值给 pc
6. 删除了多余的空格和换行符,使代码更易读。

现在,这段代码应该可以正确地执行多项式加法。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-2 15:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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