鱼C论坛

 找回密码
 立即注册
查看: 4085|回复: 21

有关一元多项式计算器的程序问题。大家帮忙修改一下哈!谢谢了!

[复制链接]
发表于 2013-6-26 17:05:33 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 第二个╮夏天 于 2013-6-26 17:11 编辑

//元素类型、结点类型和指针类型
//#include <iostream>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#include <math.h>
typedef int status;
typedef struct NodeType    //结点类型,指针类型
{
float coef;  //系数
int   expn;  //指数
    NodeType *next;
}*LinkType;        
typedef  LinkType  polynomail;  //用带头结点的有序链表表示多项式  
                                    
  
//函数声明
void InitPolyn( polynomail &P);                                  //构造一个多项式
status MakeNode( polynomail &p,float Ncoef,int Nexpn);          //创建一个结点
void CreatPolyn( polynomail &P,int m);                           //输入m项的系数和指数,建立表示一元多项式的有序链表P
void ClearPolyn( polynomail &P);                                 //将单链表清空,并释放原链表的结点空间
void DestroyPolyn( polynomail &P);                               //销毁一元多项式P
void PrintPolyn( polynomail P);                                  //打印输出一元多项式P
int  PolynLength( polynomail P);                                 //返回一元多项式P中的项数
void MergePolynCoef(polynomail &Pn);                             //在序链表中,合并同类项
void SortPolyn(polynomail &Pn);                                   //根据链表的expn指数域,对链表进行降序排序
void DelZeroNode(polynomail &Pn);                                //释放无用结点,即系数为0项
void AddPolyn( polynomail &Pa,polynomail &Pb,polynomail &Pc);      //完成多项式相加运算,即:Pc=Pa+Pb
void SubtractPolyn( polynomail Pa,polynomail Pb,polynomail &Pc); //完成多项式相减运算,即:Pc=Pa-Pb
void MultiplyPolyn( polynomail Pa,polynomail Pb,polynomail &Pc); //完成多项式相乘运算,即:Pc=Pa×Pb
void Difference( polynomail &pa);                                //求多项式的导函数
float Evaluate(polynomail pn, float x );                         //求多项式的值
//算法如下
//构造一个多项式
void InitPolyn( polynomail &P)
{  
P=(NodeType *)malloc(sizeof(NodeType));
    P->coef=0;
P->expn=0;
P->next=NULL; //初始化带头结点的单链表
}
//将单链表清空,并释放原链表的结点空间
void ClearPolyn( polynomail &P)
{
LinkType q;
q=P->next;
    while(q!=NULL) //释放原链表的结点空间
{
  P->next=q->next;
  free(q);
  q=P->next;
}
}
//销毁一元多项式P
void DestroyPolyn(polynomail &P)                           
{
LinkType q=P;
    while(q!=NULL)
{
  q=P->next;
  free(P);   //释放所有结点空间
  q=P;
}                        
} // DestroyPolyn
//根据链表的expn指数域,对链表进行降序排序
void SortPolyn(polynomail &Pn)                                
{
MergePolynCoef(Pn);      //先合并同类项
    LinkType p,q,r;
    q=Pn->next;
Pn->next=NULL;
  while(q!=NULL)         //插入法排序
  {  
   p=Pn;
  while(p->next!=NULL&&p->next->expn>q->expn)
   p=p->next;
  r=q->next;
  q->next=p->next;
  p->next=q;
  q=r;   
  }
}// SortPolyn
//在序链表中,合并同类项
void MergePolynCoef(polynomail &Pn)
{
LinkType p,p1,p2;
    p=Pn->next;
    while(p!=NULL)
{
   p1=p;p2=p->next;
         while(p2!=NULL)    //合并指数相同项
   {
   if(p->expn==p2->expn)
   {
    p->coef+=p2->coef;
    p1->next=p2->next;
    free(p2);  
          p2=p1->next;
   }
         else
   {
    p1=p2;
    p2=p1->next;
   }
   }
     p=p->next;
  }
DelZeroNode(Pn);   //删除合并后系数为0的结点
}
//创建一个结点
status MakeNode( polynomail &p,float Ncoef,int Nexpn)
{  
  if (!(p=(LinkType)malloc(sizeof(NodeType))))
   {
  printf("Error,the momery is overflow");
  return false;
   }
    p->coef=Ncoef;
p->expn=Nexpn;
p->next=NULL;
    return true;
}

//输入m项的系数和指数,建立表示一元多项式的有序链表P
void CreatPolyn( polynomail &P,int m)                  
{
float fcoef;
    int fexpn;
    NodeType *s,*q;
    q=P;
for(int i=1;i<=m;i++)    //if(m==0) 为"空表!";
   {
  printf("第i项式:");
     printf("系数,指数:");
  scanf("%d,%d",&fcoef,&fexpn);
     s=(NodeType *)malloc(sizeof(NodeType));
  s->coef=fcoef;
  s->expn=fexpn;
  s->next=NULL;
  q->next=s;
  q=s;
  q->next=NULL;
   }
MergePolynCoef(P);    //合并指数相同项
DelZeroNode(P);       //删除系数为0的结点
SortPolyn(P);        //按指数域,对链表进行升序排序
}
/*
// 稀疏多项式pa以链表作存储结构,将此链表修改成它的导函数,并释放无用结点
void Difference(polynomail &pa)                                                              
{  
LinkType p,q;
p=pa->next;
q=pa;
   while(p!=NULL)
   {
    if(p->expn==0)
    {
       q->next=p->next;
       free(p);
       p=q->next;
    }   //常数项,导数为零,释放结点
       else
    {
     p->coef=p->coef*p->expn; //系数=原系数* 指数
           (p->expn )--;            //指数减1
     q=q->next;
     p=p->next;     
    }
   }  
}
                                                          */

//释放无用结点,即系数为0项
void DelZeroNode(polynomail &Pn)                              
{
LinkType p,q;
p=Pn->next;
q=Pn;
while(p!=NULL)
{
  if(p->expn==0)
  {
   q->next=p->next;
   free(p);
   p=q->next;
  }   
}
}
//求多项式的值
float Evaluate(polynomail pn, float x)                        
{

LinkType p;
p=pn->next;  
    float result=0;
    while(p!=NULL)
{
  result+=(p->coef)*(float)pow(x,p->expn);  //pow函数求x的n次方
        p=p->next;
}
    return result;
}
//完成多项式相加运算,即:Pc=Pa+Pb
void AddPolyn(polynomail &Pa,polynomail &Pb,polynomail &Pc)   
{  
float x;
int m;
    //LinkType p,q,r;
NodeType *p,*q,*r;
    NodeType *s;
CreatPolyn(Pa,1);
    p=Pb->next;
    q=Pa->next;
    r=Pc;
  while(p!=NULL&&q!=NULL)
  {
   if(p->expn==q->expn) //指数相同
   {
    x=p->coef+q->coef ;
       if(x!=0)         //指数相同,若系数相加不等于0,插入表中
    {
     s=(NodeType *)malloc(sizeof(NodeType));
        s->coef=x;
     s->expn=q->expn;
     s->next=NULL;
              r->next=s;
     r=r->next;
    }
      p=p->next;
      q=q->next;
   }
   else if(q->expn<p->expn)  //指数小的插入表中
   {
  s=(NodeType *)malloc(sizeof(NodeType));
  s->coef=q->coef;
  s->expn=q->expn;
  s->next=NULL;
        r->next=s;r=r->next;
     q=q->next;
   }
     else
  {
    s=(NodeType *)malloc(sizeof(NodeType));
    s->coef=p->coef;
    s->expn=p->expn;
    s->next=NULL;
          r->next=s;
    r=r->next;
    p=p->next;
  }
  }
//加入余下的多项式
while(p!=NULL)
  {
  s=(NodeType *)malloc(sizeof(NodeType));
     s->coef=p->coef;
  s->expn=p->expn;
  s->next=NULL;
     r->next=s;
  r=r->next;
  p=p->next;
  }
while(q!=NULL)
{
  s=(NodeType *)malloc(sizeof(NodeType));
     s->coef=q->coef;
  s->expn=q->expn;
  s->next=NULL;
     r->next=s;
  r=r->next;
  q=q->next;
}
}// AddPoly
//完成多项式相减运算,即:Pc=Pa-Pb   
void SubtractPolyn( polynomail Pa,polynomail Pb,polynomail &Pc)      
{
float x;
    LinkType p,q,r;
    NodeType *s;
    p=Pa->next;
    q=Pb->next;
    r=Pc;
while(p!=NULL&&q!=NULL)
  {  
  if(p->expn==q->expn)    //指数相同
  {
   x=p->coef-q->coef;
      if(x!=0)       //指数相同,若系数相减不等于0,插入表中
   {
    s=(NodeType *)malloc(sizeof(NodeType));
       s->coef=x;
    s->expn=q->expn;
    s->next=NULL;
             r->next=s;
    r=r->next;
   }
     p=p->next;
  q=q->next;
  }
  else if(q->expn<p->expn)   //指数小的插入表中
  {   
   s=(NodeType *)malloc(sizeof(NodeType));
   s->coef=-q->coef;    //减数的系数变为相反数
   s->expn=q->expn;
   s->next=NULL;
         r->next=s;
   r=r->next;
   q=q->next;
  }
     else  
  {  
   s=(NodeType *)malloc(sizeof(NodeType));
   s->coef=p->coef;
   s->expn=p->expn;
   s->next=NULL;
         r->next=s;
   r=r->next;
   p=p->next;
  }
}
//加入余下的多项式,减数的系数变为相反数
  while(p!=NULL)
  {
   s=(NodeType *)malloc(sizeof(NodeType));
   s->coef=p->coef;
   s->expn=p->expn;
   s->next=NULL;
      r->next=s;
   r=r->next;
   p=p->next;
  }
   while(q!=NULL)
   {
    s=(NodeType *)malloc(sizeof(NodeType));
       s->coef=-q->coef;
    s->expn=q->expn;
    s->next=NULL;
       r->next=s;
    r=r->next;
    q=q->next;
   }
}// SubtractPolyn
//完成多项式相乘运算,即:Pc=Pa×Pb
void MultiplyPolyn( polynomail Pa,polynomail Pb,polynomail &Pc)  
{  

LinkType p,q,r;
    NodeType *s;
p=Pa->next;
r=Pc;
while(p!=NULL)
{
  q=Pb->next;
        while(q!=NULL)
  {
   s=(NodeType *)malloc(sizeof(NodeType));
         s->coef=p->coef*q->coef;
         s->expn=p->expn+q->expn;
            s->next=NULL;      
            r->next=s;
         r=r->next;
         q=q->next;
  }
    p=p->next;
   }
MergePolynCoef(Pc);  //合并指数相同项
DelZeroNode(Pc);     //删除系数为0的结点
SortPolyn(Pc);      //按指数域,对链表进行升序排序
}// MultiplyPolyn
//主函数
void main()
{
    polynomail Pa,Pb,Pc;
float x;
printf("        **********************************************************\n");
printf("        ****************欢迎使用一元多项式计算器******************\n");
printf("        **********************************************************\n");
    loop:while(1)
{   
      
       int choice;
    printf("        **********************************************************\n");
    printf("        *******************   1.多项式加法       *****************\n");
    printf("        *******************   2.多项式减法       *****************\n");
    printf("        *******************   3.多项式乘法       *****************\n");
    printf("        *******************   4.求多项式A的导数  *****************\n");
    printf("        *******************   5.求多项式A的值    *****************\n");
    printf("        *******************   6.谢谢使用!再见!   *****************\n");
    printf("        **********************************************************\n");
    printf("测试数据: A1=x+x^2+x^3                        B1=1+x+x^2 \n");
    printf("          A2=9+x+x^4+2x^6                     B2=6x^(-3)-x+4.4x^2-1.2x^9 \n");
    printf("          A3=-6x^(-3)+5.4x^2-x^2+7.8x^10      B3=7-5x^8+11x^9 \n\n");
       printf("请输入操作(1-6):\n");
       scanf("%d",&choice);
    printf("\n");
       switch(choice)
    {  
          case 1:
     {
           printf("多项式加法C=A+B\n");  
           AddPolyn(Pa,Pb,Pc);  
     }
     /*  case 2:
           printf("多项式减法C=A-B:\n");
        SubtractPolyn(Pa,Pb,Pc);   
       case 3:
           printf("多项式乘法C=A*B:\n");
        MultiplyPolyn(Pa,Pb,Pc);   
       case 4:
        printf("求多项式A的导数:\n");
        Difference(Pa);                 
    case 5:
              printf("求多项式A的值:\n");
                 Evaluate(Pa, x);                */
       case 6:
           printf("谢谢使用!再见!\n");
           return ;
          default:
           printf("错误命令!\n");  
          getchar();
       goto loop;  
    }
};
}


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-26 22:05:15 | 显示全部楼层
本帖最后由 故乡的风 于 2013-6-27 09:32 编辑

修改的你的代码,有些你的可能是对的,但是我开始没搞清楚,就改了。整体来说的,你的算法没问题,可能有些小问题,我大体改过来了。而且,我也测试了一组数据,没有问题。你自己测测看看。
  1. //元素类型、结点类型和指针类型
  2. //#include <iostream>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <malloc.h>
  6. #include <string.h>
  7. #include <MATH.H>

  8. typedef int status;
  9. typedef struct NodeType    //结点类型,指针类型
  10. {
  11.         float coef;  //系数
  12.         int   expn;  //指数
  13.     NodeType *next;
  14. }*LinkType;
  15. typedef  LinkType  Polynomial;  //用带头结点的有序链表表示多项式

  16. //函数声明
  17. void InitPolyn( Polynomial &P);                                  //构造一个多项式
  18. status MakeNode( Polynomial &p,float Ncoef,int Nexpn);           //创建一个结点
  19. void CreatPolyn( Polynomial &P,int m);                           //输入m项的系数和指数,建立表示一元多项式的有序链表P
  20. void ClearPolyn( Polynomial &P);                                 //将单链表清空,并释放原链表的结点空间
  21. void DestroyPolyn( Polynomial &P);                               //销毁一元多项式P
  22. void PrintPolyn( Polynomial P);                                  //打印输出一元多项式P
  23. int  PolynLength( Polynomial P);                                 //返回一元多项式P中的项数
  24. void MergePolynCoef(Polynomial &Pn);                             //在序链表中,合并同类项
  25. void SortPolyn(Polynomial &Pn);                                  //根据链表的expn指数域,对链表进行降序排序
  26. void DelZeroNode(Polynomial &Pn);                                //释放无用结点,即系数为0项
  27. void AddPolyn( Polynomial Pa,Polynomial Pb,Polynomial &Pc);      //完成多项式相加运算,即:Pc=Pa+Pb
  28. void SubtractPolyn( Polynomial Pa,Polynomial Pb,Polynomial &Pc); //完成多项式相减运算,即:Pc=Pa-Pb
  29. void MultiplyPolyn( Polynomial Pa,Polynomial Pb,Polynomial &Pc); //完成多项式相乘运算,即:Pc=Pa×Pb
  30. void Difference(Polynomial Pa, Polynomial &Pb);                  //求多项式的导函数
  31. float Evaluate(Polynomial pn, float x );                         //求多项式的值

  32. //算法如下

  33. //构造一个多项式
  34. void InitPolyn( Polynomial &P)
  35. {
  36.         P=(NodeType *)malloc(sizeof(NodeType));
  37.     P->coef=0;
  38.         P->expn=0;
  39.         P->next=NULL; //初始化带头结点的单链表
  40. }

  41. //将单链表清空,并释放原链表的结点空间
  42. void ClearPolyn( Polynomial &P)
  43. {
  44.         LinkType p1, p2;
  45.         p1 = P;
  46.         p2 = p1->next;
  47.     while(p2!=NULL) //释放原链表的结点空间
  48.         {
  49.                 p1->next=p2->next;
  50.                 free(p2);
  51.                 p2=p1->next;
  52.         }
  53. }

  54. //销毁一元多项式P
  55. void DestroyPolyn(Polynomial &P)
  56. {
  57.         LinkType q=P;
  58.     while(q!=NULL)
  59.         {
  60.                 q=P->next;
  61.                 free(P);   //释放所有结点空间
  62.                 q=P;
  63.         }
  64. } // DestroyPolyn

  65. //根据链表的expn指数域,对链表进行降序排序
  66. void SortPolyn(Polynomial &Pn)
  67. {
  68.         MergePolynCoef(Pn);      //先合并同类项
  69.     LinkType p,q,r;
  70.     q=Pn->next;
  71.         Pn->next=NULL;
  72.   while(q!=NULL)         //插入法排序
  73.   {
  74.           p=Pn;
  75.          while(p->next!=NULL&&p->next->expn > q->expn)
  76.                  p=p->next;
  77.          r=q->next;
  78.          q->next=p->next;
  79.          p->next=q;
  80.          q=r;
  81.   }
  82. }// SortPolyn

  83. //在序链表中,合并同类项
  84. void MergePolynCoef(Polynomial &Pn)
  85. {
  86.         LinkType p,p1,p2;
  87.     p=Pn->next;
  88.     while(p!=NULL)
  89.         {
  90.                  p1=p;p2=p->next;
  91.          while(p2!=NULL)    //合并指数相同项
  92.                  {
  93.                         if(p->expn==p2->expn)
  94.                         {
  95.                                 p->coef+=p2->coef;
  96.                                 p1->next=p2->next;
  97.                                 free(p2);
  98.                         p2=p1->next;
  99.                         }
  100.                 else
  101.                         {
  102.                                 p1=p2;
  103.                                 p2=p1->next;
  104.                         }
  105.                  }
  106.             p=p->next;
  107.   }
  108. DelZeroNode(Pn);   //删除合并后系数为0的结点
  109. }

  110. //创建一个结点
  111. status MakeNode( Polynomial &p,float Ncoef,int Nexpn)
  112. {
  113.   if (!(p=(LinkType)malloc(sizeof(NodeType))))
  114.    {
  115.                 printf("Error,the momery is overflow");
  116.                 return false;
  117.    }
  118.     p->coef=Ncoef;
  119.         p->expn=Nexpn;
  120.         p->next=NULL;
  121.     return true;
  122. }


  123. //输入m项的系数和指数,建立表示一元多项式的有序链表P
  124. void CreatPolyn(Polynomial &P,int m)
  125. {
  126.         float fcoef;
  127.     int fexpn;
  128.     NodeType *s,*q;
  129.     q=P;
  130.     printf("项数:%d\n", m);
  131. for(int i=1;i<=m;i++)    //if(m==0) 为"空表!";
  132.    {
  133.          printf("第%d项式:", i);
  134.      printf("系数,指数:");
  135.          scanf("%f %d",&fcoef, &fexpn);
  136.      s=(NodeType *)malloc(sizeof(NodeType));
  137.          s->coef=fcoef;
  138.          s->expn=fexpn;
  139.          s->next=NULL;
  140.          q->next=s;
  141.          q=s;
  142.    }

  143. MergePolynCoef(P);    //合并指数相同项
  144. // DelZeroNode(P);       //删除系数为0的结点
  145. SortPolyn(P);        //按指数域,对链表进行升序排序
  146. }

  147. // 稀疏多项式pa以链表作存储结构,将此链表修改成它的导函数,并释放无用结点
  148. void Difference(Polynomial Pa, Polynomial &Pb)
  149. {
  150.         LinkType p,q;
  151.         NodeType *s;
  152.         p=Pa->next;
  153.         q=Pb;
  154.    while(p!=NULL)
  155.    {
  156.            if(p->expn==0)
  157.            {
  158.               p=p->next;
  159.            }   //常数项,导数为零,释放结点
  160.        else
  161.            {
  162.                    s = (NodeType *)malloc(sizeof(NodeType));
  163.                    s->coef = p->coef * p->expn;
  164.                    s->expn = p->expn - 1;
  165.                    s->next = NULL;

  166.                    p = p->next;
  167.                    q->next = s;
  168.                    q = q->next;
  169.            }
  170.    }
  171. }

  172. //释放无用结点,即系数为0项
  173. void DelZeroNode(Polynomial &Pn)
  174. {
  175.         LinkType p,q;
  176.         q=Pn;
  177.         p = q->next;
  178.         while(p!=NULL)
  179.         {
  180.                 if(p->coef==0)
  181.                 {
  182.                         q->next=p->next;
  183.                         free(p);
  184.                         p=q->next;
  185.                 }
  186.                 q = p;
  187.                 p = q->next;
  188.         }
  189. }

  190. //求多项式的值
  191. float Evaluate(Polynomial pn, float x)
  192. {

  193.         LinkType p;
  194.         p=pn->next;
  195.     float result=0;
  196.     while(p!=NULL)
  197.         {
  198.                 result+=(p->coef)*(float)pow(x,p->expn);  //pow函数求x的n次方
  199.         p=p->next;
  200.         }
  201.     return result;
  202. }

  203. //完成多项式相加运算,即:Pc=Pa+Pb
  204. void AddPolyn(Polynomial Pa,Polynomial Pb,Polynomial &Pc)
  205. {
  206.         float x;
  207.     //LinkType p,q,r;
  208.         NodeType *p,*q,*r;
  209.     NodeType *s;
  210.     p=Pa->next;
  211.     q=Pb->next;
  212.     r=Pc;
  213.   while(p!=NULL&&q!=NULL)
  214.   {
  215.           if(p->expn==q->expn) //指数相同
  216.           {
  217.                   x=p->coef+q->coef ;
  218.               if(x!=0)         //指数相同,若系数相加不等于0,插入表中
  219.                   {
  220.                           s=(NodeType *)malloc(sizeof(NodeType));
  221.                       s->coef=x;
  222.                           s->expn=q->expn;
  223.                           s->next=NULL;
  224.               r->next=s;
  225.                           r=r->next;
  226.                   }
  227.              p=p->next;
  228.              q=q->next;
  229.           }
  230.           else if(q->expn > p->expn)  //指数大的插入表中
  231.           {
  232.                 s=(NodeType *)malloc(sizeof(NodeType));
  233.                 s->coef=q->coef;
  234.                 s->expn=q->expn;
  235.                 s->next=NULL;
  236.         r->next=s;r=r->next;
  237.             q=q->next;
  238.           }
  239.      else
  240.          {
  241.                   s=(NodeType *)malloc(sizeof(NodeType));
  242.                   s->coef=p->coef;
  243.                   s->expn=p->expn;
  244.                   s->next=NULL;
  245.           r->next=s;
  246.                   r=r->next;
  247.                   p=p->next;
  248.          }
  249.   }
  250. //加入余下的多项式
  251. while(p!=NULL)
  252.   {
  253.          s=(NodeType *)malloc(sizeof(NodeType));
  254.             s->coef=p->coef;
  255.          s->expn=p->expn;
  256.          s->next=NULL;
  257.      r->next=s;
  258.          r=r->next;
  259.          p=p->next;
  260.   }
  261. while(q!=NULL)
  262. {
  263.          s=(NodeType *)malloc(sizeof(NodeType));
  264.      s->coef=q->coef;
  265.          s->expn=q->expn;
  266.          s->next=NULL;
  267.      r->next=s;
  268.          r=r->next;
  269.          q=q->next;
  270. }
  271. }// AddPoly

  272. //完成多项式相减运算,即:Pc=Pa-Pb
  273. void SubtractPolyn( Polynomial Pa,Polynomial Pb,Polynomial &Pc)
  274. {
  275.         float x;
  276.     LinkType p,q,r;
  277.     NodeType *s;
  278.     p=Pa->next;
  279.     q=Pb->next;
  280.     r=Pc;
  281. while(p!=NULL&&q!=NULL)
  282.   {
  283.          if(p->expn==q->expn)    //指数相同
  284.          {
  285.                  x=p->coef-q->coef;
  286.              if(x!=0)       //指数相同,若系数相减不等于0,插入表中
  287.                  {
  288.                          s=(NodeType *)malloc(sizeof(NodeType));
  289.                      s->coef=x;
  290.                          s->expn=q->expn;
  291.                          s->next=NULL;
  292.              r->next=s;
  293.                          r=r->next;
  294.                  }
  295.             p=p->next;
  296.                 q=q->next;
  297.          }
  298.          else if(q->expn > p->expn)   //指数大的插入表中
  299.          {
  300.                  s=(NodeType *)malloc(sizeof(NodeType));
  301.                  s->coef=-q->coef;    //减数的系数变为相反数
  302.                  s->expn=q->expn;
  303.                  s->next=NULL;
  304.          r->next=s;
  305.                  r=r->next;
  306.                  q=q->next;
  307.          }
  308.      else
  309.          {
  310.                  s=(NodeType *)malloc(sizeof(NodeType));
  311.                  s->coef=p->coef;
  312.                  s->expn=p->expn;
  313.                  s->next=NULL;
  314.          r->next=s;
  315.                  r=r->next;
  316.                  p=p->next;
  317.          }
  318. }
  319. //加入余下的多项式,减数的系数变为相反数
  320.   while(p!=NULL)
  321.   {
  322.           s=(NodeType *)malloc(sizeof(NodeType));
  323.           s->coef=p->coef;
  324.           s->expn=p->expn;
  325.           s->next=NULL;
  326.       r->next=s;
  327.           r=r->next;
  328.           p=p->next;
  329.   }
  330.    while(q!=NULL)
  331.    {
  332.            s=(NodeType *)malloc(sizeof(NodeType));
  333.        s->coef=-q->coef;
  334.            s->expn=q->expn;
  335.            s->next=NULL;
  336.        r->next=s;
  337.            r=r->next;
  338.            q=q->next;
  339.    }
  340. }// SubtractPolyn

  341. //完成多项式相乘运算,即:Pc=Pa×Pb
  342. void MultiplyPolyn( Polynomial Pa,Polynomial Pb,Polynomial &Pc)
  343. {

  344.         LinkType p,q,r;
  345.     NodeType *s;
  346.         p=Pa->next;
  347.         r=Pc;
  348.         while(p!=NULL)
  349.         {
  350.                 q=Pb->next;
  351.         while(q!=NULL)
  352.                 {
  353.                         s=(NodeType *)malloc(sizeof(NodeType));
  354.                 s->coef=p->coef*q->coef;
  355.                 s->expn=p->expn+q->expn;
  356.             s->next=NULL;
  357.             r->next=s;
  358.                 r=r->next;
  359.                 q=q->next;
  360.                 }
  361.            p=p->next;
  362.    }
  363.    MergePolynCoef(Pc);  //合并指数相同项
  364.    DelZeroNode(Pc);     //删除系数为0的结点
  365.    SortPolyn(Pc);      //按指数域,对链表进行降序排序
  366. }// MultiplyPolyn

  367. void PrintPolyn(Polynomial P) {
  368.     Polynomial pCur;
  369.     pCur = P->next;
  370.     while (pCur) {
  371.         printf("%.0fX^%d  ", pCur->coef, pCur->expn);
  372.         pCur = pCur->next;
  373.     }
  374.     printf("\n");
  375. }


  376. //主函数
  377. int main()
  378. {
  379.     Polynomial Pa,Pb,Pc;
  380.         float x = 2;

  381.         InitPolyn(Pa);
  382.         CreatPolyn(Pa, 3);
  383.         PrintPolyn(Pa);
  384.         InitPolyn(Pb);
  385.         CreatPolyn(Pb, 2);
  386.         PrintPolyn(Pb);
  387.         InitPolyn(Pc);

  388.         printf("        ****************欢迎使用一元多项式计算器******************\n");
  389.         printf("        **********************************************************\n");
  390.     while(1)
  391.         {

  392.        int choice;
  393.            printf("        **********************************************************\n");
  394.            printf("        *******************   1.多项式加法       *****************\n");
  395.            printf("        *******************   2.多项式减法       *****************\n");
  396.            printf("        *******************   3.多项式乘法       *****************\n");
  397.            printf("        *******************   4.求多项式A的导数  *****************\n");
  398.            printf("        *******************   5.求多项式A的值    *****************\n");
  399.            printf("        *******************   6.谢谢使用!再见!   *****************\n");
  400.            printf("        **********************************************************\n");
  401.            printf("测试数据: A1=x+x^2+x^3                        B1=1+x+x^2 \n");
  402.            printf("          A2=9+x+x^4+2x^6                     B2=6x^(-3)-x+4.4x^2-1.2x^9 \n");
  403.            printf("          A3=-6x^(-3)+5.4x^2-x^2+7.8x^10      B3=7-5x^8+11x^9 \n\n");
  404.        printf("请输入操作(1-6):\n");
  405.        scanf("%d",&choice);
  406.            printf("\n");
  407.            getchar();

  408.        switch(choice)
  409.            {
  410.           case 1:
  411.                           {
  412.                          printf("多项式加法C=A+B\n");
  413.                          AddPolyn(Pa,Pb,Pc);
  414.                          PrintPolyn(Pc);
  415.                          ClearPolyn(Pc);
  416.                           }
  417.                           break;

  418.               case 2:
  419.                   {
  420.                          printf("多项式减法C=A-B:\n");
  421.                              SubtractPolyn(Pa,Pb,Pc);
  422.                              PrintPolyn(Pc);
  423.                              ClearPolyn(Pc);
  424.                   }
  425.                   break;

  426.               case 3:
  427.                   {
  428.                          printf("多项式乘法C=A*B:\n");
  429.                              MultiplyPolyn(Pa,Pb,Pc);
  430.                              PrintPolyn(Pc);
  431.                              ClearPolyn(Pc);
  432.                   }
  433.                           break;

  434.               case 4:
  435.                   {
  436.                              printf("求多项式A的导数:\n");
  437.                              Difference(Pa, Pc);
  438.                              PrintPolyn(Pc);
  439.                              ClearPolyn(Pc);
  440.                   }
  441.                   break;

  442.                   case 5:
  443.                       {
  444.                      printf("求多项式A的值:\n");
  445.                      x = 2;
  446.                  float value = Evaluate(Pa, x);
  447.                  printf("%f\n", value);
  448.                       }
  449.               break;
  450.               case 6:
  451.                   {
  452.                          printf("谢谢使用!再见!\n");
  453.                          exit(0);
  454.                   }
  455.                   break;

  456.           default:
  457.               {
  458.                          printf("错误命令!\n");
  459.               }
  460.               break;
  461.            }
  462.         };

  463.         return 0;
  464. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2013-6-26 22:23:22 | 显示全部楼层

嗯嗯。一开始出现的问题都解决了,不会再一执行就报错了。亲,谢谢哈!辛苦了!:handshake
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-9 03:17:54 | 显示全部楼层
转发微博


                               
登录/注册后可看大图
来自 回推 的新浪微博
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-10 09:04:56 | 显示全部楼层
转发微博


                               
登录/注册后可看大图
来自 鞠金桓1999 的新浪微博
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-10 12:05:29 | 显示全部楼层
转发微博


                               
登录/注册后可看大图
来自 回推 的新浪微博
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-15 12:45:54 | 显示全部楼层
转发微博


                               
登录/注册后可看大图
来自 柳荣1 的新浪微博
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-15 16:03:50 | 显示全部楼层
转发微博


                               
登录/注册后可看大图
来自 回推 的新浪微博
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-22 23:43:48 | 显示全部楼层
转发微博


                               
登录/注册后可看大图
来自 傻乎乎宏逸 的新浪微博
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-22 23:43:48 | 显示全部楼层
转发微博


                               
登录/注册后可看大图
来自 傻乎乎宏逸 的新浪微博
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-23 12:36:19 | 显示全部楼层
转发微博


                               
登录/注册后可看大图
来自 出世秀雅 的新浪微博
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-23 12:36:19 | 显示全部楼层
转发微博


                               
登录/注册后可看大图
来自 公寓草间野分 的新浪微博
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-14 21:59:34 | 显示全部楼层
这么长
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 18:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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