鱼C论坛

 找回密码
 立即注册
查看: 2913|回复: 7

为什么我的多项式不能相加

[复制链接]
发表于 2014-4-15 12:36:51 | 显示全部楼层 |阅读模式
30鱼币
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct Polynomial
{
        float coef;
        int expn;
        struct Polynomial *next;
}*Polyn;

void InitPolyn(Polyn *P);
void CreatPolyn(Polyn *P,int m);//创建一个多项式
void ShowPolyn(Polyn P);//打印出多项式
void SortPolyn(Polyn P);//按指数降序排列
void AddPolyn(Polyn Pa,Polyn Pb,Polyn Pc);//Pc = Pa + Pb
void SubPolyn(Polyn Pa,Polyn Pb,Polyn Pc);//Pc = Pa - Pb
void valPolyn(Polyn *P,int x);//求多项式当X为多少的值

void InitPolyn(Polyn *P)
{
        *P = (Polyn )malloc(sizeof(Polyn));
        (*P)->coef = 0.0;
        (*P)->expn = 0;
        (*P)->next = NULL;//初始化
}
void CreatPolyn(Polyn *P,int m)
{
        float c;
        int e,i;
        Polyn s,q;
        q = *P;
        printf("请输入%d个项数\n",m);
        for(i = 1;i<=m;i++)
        {
                printf("请输入第%d项的系数和指数:  ",i);
                scanf("%f %d",&c,&e);
                s = (Polyn )malloc(sizeof(Polyn));
                s->coef = c;
                s->expn = e;
                s->next = NULL;
                q->next = s;
                q = s;
                q->next = NULL;
        }
        SortPolyn(*P);
}

void SortPolyn(Polyn P)                                
{
        Polyn p,q,r;
        q=P->next;
        P->next=NULL;
      while(q!=NULL)         //插入法排序
        {
                p=P;
                while(p->next!=NULL&&p->next->expn>q->expn)
                p=p->next;
                r=q->next;
                q->next=p->next;
                p->next=q;
                q=r;   
        }
}

void ShowPolyn(Polyn P)
{
        Polyn pchar;
        pchar = P->next;
        while(pchar)
        {
                printf("%fX^%d ",pchar->coef,pchar->expn);
                pchar = pchar->next;
        }
        printf("\n");
}

void AddPolyn(Polyn Pa,Polyn Pb,Polyn Pc)
{
        float x;
        Polyn anext,bnext,q,s;
        anext = Pa->next;
        bnext = Pb->next;
        q = Pc;
        while(anext&&bnext)
        {
                if(anext->expn == bnext->expn)//指数相同
                {
                        x = anext->coef+bnext->coef;
                        if(x!=0)//系数相加不等于0,插入表中
                        {
                                s = (Polyn)malloc(sizeof(Polyn));
                                s->coef = x;
                                s->expn = anext->expn;
                                s->next = NULL;
                                q->next = s;
                                q = q->next;
                        }
                        else//系数等于0
                        {
                                anext = anext->next;
                                bnext = bnext->next;
                        }
                }
                else if(anext->expn < bnext->expn)//指数小的插入表中
                {
                        s = (Polyn)malloc(sizeof(Polyn));
                        s->coef = anext->coef;
                        s->expn = anext->expn;
                        s->next = NULL;
                        q->next = s;
                        q = q->next;
                        anext = anext->next;
                }
                else
                {
                        s = (Polyn)malloc(sizeof(Polyn));
                        s->coef = bnext->coef;
                        s->expn = bnext->expn;
                        s->next = NULL;
                        q->next = s;
                        q = q->next;
                        bnext = bnext->next;
                }
        }
        while(anext == NULL&&bnext!=NULL)
        {
                s = (Polyn)malloc(sizeof(Polyn));
                s->coef = bnext->coef;
                s->expn = bnext->expn;
                s->next = NULL;
                q->next = s;
                q = q->next;
                bnext = bnext->next;
        }
        while(bnext == NULL&&bnext!=NULL)
        {
                s = (Polyn)malloc(sizeof(Polyn));
                s->coef = anext->coef;
                s->expn = anext->expn;
                s->next = NULL;
                q->next = s;
                q = q->next;
                anext = anext->next;
        }
        if(anext == NULL&&bnext == NULL)
        {
                printf("完成\n");
        }
        SortPolyn(q);
}

int main()
{
        Polyn Pa,Pb,Pc;
        InitPolyn(&Pa);
        CreatPolyn(&Pa,3);
        ShowPolyn(Pa);
        InitPolyn(&Pb);
        CreatPolyn(&Pb,2);
        ShowPolyn(Pb);
        InitPolyn(&Pc);
        AddPolyn(Pa,Pb,Pc);
        ShowPolyn(Pc);
}

为什么相加不了?  出现不了“完成”这两个字

最佳答案

查看完整内容

修正一点儿粗心小错误:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-15 12:36:52 | 显示全部楼层
修正一点儿粗心小错误:
  1. #include<stdio.h>
  2. #include<malloc.h>
  3. #include<stdlib.h>

  4. typedef struct Polynomial
  5. {
  6.         float coef;
  7.         int expn; //指数
  8.         struct Polynomial *next;
  9. }*Polyn;

  10. void InitPolyn(Polyn *P);
  11. void CreatPolyn(Polyn *P,int m);//创建一个多项式
  12. void ShowPolyn(Polyn P);//打印出多项式
  13. void SortPolyn(Polyn P);//按指数降序排列
  14. void AddPolyn(Polyn Pa,Polyn Pb,Polyn Pc);//Pc = Pa + Pb
  15. void SubPolyn(Polyn Pa,Polyn Pb,Polyn Pc);//Pc = Pa - Pb
  16. void valPolyn(Polyn *P,int x);//求多项式当X为多少的值

  17. void InitPolyn(Polyn *P)
  18. {
  19.         *P = (Polyn )malloc(sizeof(Polyn));
  20.         (*P)->coef = 0.0;
  21.         (*P)->expn = 0;
  22.         (*P)->next = NULL;//初始化
  23. }
  24. void CreatPolyn(Polyn *P,int m)
  25. {
  26.         float c;
  27.         int e,i;
  28.         Polyn s,q;
  29.         q = *P;
  30.         printf("请输入%d个项数\n",m);
  31.         for(i = 1;i<=m;i++)
  32.         {
  33.                 printf("请输入第%d项的系数和指数:  ",i);
  34.                 scanf("%f %d",&c,&e);
  35.                 s = (Polyn )malloc(sizeof(Polyn));
  36.                 s->coef = c;
  37.                 s->expn = e;
  38.                 s->next = NULL;
  39.                 q->next = s;
  40.                 q = s;
  41.                 q->next = NULL;
  42.         }
  43.         SortPolyn(*P);
  44. }

  45. void SortPolyn(Polyn P)                                
  46. {
  47.         Polyn p,q,r;
  48.         q=P->next;
  49.         P->next=NULL;
  50.                 while(q!=NULL)         //插入法排序
  51.         {
  52.                 p=P;
  53.                 while(p->next!=NULL&&p->next->expn>q->expn)
  54.                 p=p->next;
  55.                 r=q->next;
  56.                 q->next=p->next;
  57.                 p->next=q;
  58.                 q=r;   
  59.         }
  60. }

  61. void ShowPolyn(Polyn P)
  62. {
  63.         Polyn pchar;
  64.         pchar = P->next;
  65.         while(pchar)
  66.         {
  67.                 printf("%fX^%d ",pchar->coef,pchar->expn);
  68.                 pchar = pchar->next;
  69.         }
  70.         printf("\n");
  71. }

  72. void AddPolyn(Polyn Pa,Polyn Pb,Polyn Pc)
  73. {
  74.         float x;
  75.         Polyn anext,bnext,q,s;
  76.         anext = Pa->next;
  77.         bnext = Pb->next;
  78.         q = Pc;
  79.         while(anext&&bnext)
  80.         {
  81.                 if(anext->expn == bnext->expn)//指数相同
  82.                 {
  83.                         x = anext->coef+bnext->coef;
  84.                         if(x!=0)//系数相加不等于0,插入表中
  85.                         {
  86.                                 s = (Polyn)malloc(sizeof(Polyn));
  87.                                 s->coef = x;
  88.                                 s->expn = anext->expn;
  89.                                 s->next = NULL;
  90.                                 q->next = s;
  91.                                 q = q->next;
  92.                         }
  93.                         else//系数等于0
  94.                         {
  95.                                 anext = anext->next;
  96.                                 bnext = bnext->next;
  97.                         }
  98.                 }
  99.                 else if(anext->expn < bnext->expn)//指数小的插入表中
  100.                 {
  101.                         s = (Polyn)malloc(sizeof(Polyn));
  102.                         s->coef = anext->coef;
  103.                         s->expn = anext->expn;
  104.                         s->next = NULL;
  105.                         q->next = s;
  106.                         q = q->next;
  107.                         anext = anext->next;
  108.                 }
  109.                 else
  110.                 {
  111.                         s = (Polyn)malloc(sizeof(Polyn));
  112.                         s->coef = bnext->coef;
  113.                         s->expn = bnext->expn;
  114.                         s->next = NULL;
  115.                         q->next = s;
  116.                         q = q->next;
  117.                         bnext = bnext->next;
  118.                 }
  119.         }
  120.         while(anext == NULL&&bnext!=NULL)
  121.         {
  122.                 s = (Polyn)malloc(sizeof(Polyn));
  123.                 s->coef = bnext->coef;
  124.                 s->expn = bnext->expn;
  125.                 s->next = NULL;
  126.                 q->next = s;
  127.                 q = q->next;
  128.                 bnext = bnext->next;
  129.         }
  130.         while(bnext == NULL&&anext!=NULL)
  131.         {
  132.                 s = (Polyn)malloc(sizeof(Polyn));
  133.                 s->coef = anext->coef;
  134.                 s->expn = anext->expn;
  135.                 s->next = NULL;
  136.                 q->next = s;
  137.                 q = q->next;
  138.                 anext = anext->next;
  139.         }
  140.         if(anext == NULL&&bnext == NULL)
  141.         {
  142.                 printf("完成\n");
  143.         }
  144.         SortPolyn(q);
  145. }

  146. int main()
  147. {
  148.         Polyn Pa,Pb,Pc;
  149.         InitPolyn(&Pa);
  150.         CreatPolyn(&Pa,3);
  151.         ShowPolyn(Pa);
  152.         InitPolyn(&Pb);
  153.         CreatPolyn(&Pb,2);
  154.         ShowPolyn(Pb);
  155.         InitPolyn(&Pc);
  156.         AddPolyn(Pa,Pb,Pc);
  157.         ShowPolyn(Pc);
  158. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-16 23:04:15 | 显示全部楼层

甲鱼哥,我仔细对照你改过的代码,功力不深,未发现改在哪。。 还有为什么我这个AddPolyn函数相加不了呢?C:\Users\HP\Desktop\1.jpg不知道图片出来没,,函数出来的不是相加的样子。  感谢甲鱼哥百忙之中改错{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-16 23:06:37 | 显示全部楼层
第二个:while(bnext == NULL&&anext!=NULL)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-16 23:16:10 | 显示全部楼层
小甲鱼 发表于 2014-4-16 23:06
第二个:while(bnext == NULL&&anext!=NULL)

:dizzy: 看到了,,,甲鱼哥当真好眼力。 不过看来相加的这个函数还是要自己去琢磨了。。:mad:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-16 23:17:49 | 显示全部楼层
a372187663 发表于 2014-4-16 23:16
看到了,,,甲鱼哥当真好眼力。 不过看来相加的这个函数还是要自己去琢磨了。。

嗯,具体的逻辑你最好是用张纸分开写一下,这样不容易出错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-16 23:20:03 | 显示全部楼层
小甲鱼 发表于 2014-4-16 23:17
嗯,具体的逻辑你最好是用张纸分开写一下,这样不容易出错。

好的,谢谢哈!{:1_1:}{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-19 15:00:32 | 显示全部楼层
小甲鱼 发表于 2014-4-16 23:06
第二个:while(bnext == NULL&&anext!=NULL)

void AddPolyn(Polyn Pa,Polyn Pb)
{
        Polyn ahead,bhead,qa,qb;
        float sum;
        Polyn temp,temp1;
        qa = Pa->next;
        qb = Pb->next;
        ahead = Pa;
        bhead = Pb;
       
       
        while(ahead->next&&bhead->next)
        {
                switch(cmp(ahead->expn,bhead->expn))//比较系数大小, <  =  >  返回 -1, 0, 1。
                {
                case -1:
                        ahead = qa;
                        qa = qa->next;
                        break;
                case 0:
                        sum = ahead->coef + bhead->coef;
                        if(sum!=0)
                        {
                                ahead->coef = sum;
                                temp = bhead;
                                bhead = qb;
                                qb = qb->next;
                                free(temp);
                        }
                        else
                        {       
                                temp = ahead;
                                ahead = qa;
                                qa = qa->next;
                                free(temp);
                                temp1 = bhead;
                                bhead = qb;
                                qb = qb->next;
                                free(temp1);

                        }
                        break;
                case 1:
                        temp = bhead;
                        bhead = qb;
                        qb = qb->next;
                        ahead = temp;
                        temp->next = qa;
                        qa = ahead;
                        ahead->next = qa;

                }
        }
        if(bhead->next)
        {
                ahead->next = bhead;
                free(bhead);
        }
}

甲鱼哥,这是我在纸上画图想出来的算法。但是出现了下面这个问题。
Debug Error!
Program:...\myProgram.exe
DAMAGE:after Normal block(#76)at 0x004F2A70.
(Press Retry to debug the application)
终止 重试  忽略

不知道怎么回事,还请帮忙解释一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 16:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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