首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

初学者问多项式的求和~

2012-02-09 
菜鸟问多项式的求和~~typedef structLnode{float coef//系数int exp//指数struct Lnode*next} LNode,*L

菜鸟问多项式的求和~~
typedef struct Lnode
{  
 float coef; //系数
  int exp; //指数
  struct Lnode *next;
} LNode,*LinkList;


LinkList input()//建立一元多项式
{
LinkList h,r,s;
int a,b;
h=(LinkList)malloc(sizeof(LNode));
r=h;
  cout<<"系数: ";
cin>>a;
cout<<"指数: ";
cin>>b;

while(a!=0)
{
s=(LinkList)malloc(sizeof(LNode));//尾插入法建立链表
  s->coef=a;
s->exp=b;
  r->next=s;
r=s;
  cout<<"系数: ";
  cin>>a;
  cout<<"指数: ";
  cin>>b;
}
r->next=NULL;
return(h);

}


LinkList add(LinkList a, LinkList b)//加法函数
{
LinkList p,q,r,t;
int s;
p=a->next;
q=b->next;
  r=a;
while(p!=NULL && q!=NULL)
{
if (p->exp<q->exp)
{  
r->next=p;
  r=r->next;
p=p->next;
}
else if (p->exp>q->exp)
{  
   
  r->next=q;
r=r->next;
q=q->next;
}
else
{
s=p->coef+q->coef;
if (s!=0)
{
p->coef=s;
  r->next=p;r=r->next;p=p->next;
  t=q;q=q->next;free(t);
}
else
{
t=p;p=p->next;free(t);
t=q;q=q->next;free(t);
}
}
}

if (p!=NULL)
r->next=p;
else r->next=q;
return(a);


}


谁能帮我解释下这段代码,多项式的创建那里不是很懂`求和那里也是~望高人指点~~

[解决办法]
第二次回你的帖子,这么久都没人回你是因为你只有代码,很乱还没有注释,很少有人花时间给你看,
我最后还是痛苦的看下来了。

C/C++ code
#include <stdio.h>#include <malloc.h>#include <iostream>using namespace std;typedef struct  Lnode {        float coef;   //系数      int exp;   //指数      struct Lnode  *next; } LNode,*LinkList; //建立的过程你应该很清楚了,我就不说了 LinkList input()//建立一元多项式 {     LinkList h,r,s;     int a,b;     h=(LinkList)malloc(sizeof(LNode));     r=h;     cout <<"系数: ";     cin >>a;     cout <<"指数: ";     cin >>b;     while(a!=0)     {         s=(LinkList)malloc(sizeof(LNode));//尾插入法建立链表         s->coef=a;         s->exp=b;         r->next=s;         r=s;         cout <<"系数: ";         cin >>a;         cout <<"指数: ";         cin >>b;     }     r->next=NULL;     return(h); } LinkList add(LinkList a, LinkList b)//加法函数 {     LinkList p,q,r,t; //用r指示合并后的那个链表的当前节点,我们以后称生成的链表为目的链表     float s;     p=a->next;       q=b->next;     r=a;     while(p!=NULL && q!=NULL) //有一个链表结束了就要退出循环     {         /*               看你的代码是生成一个按指数递增的多项式,但是我们一般是件多项式按指数下降写下去,               所以我就把你的程序小小的改动了,当让你也可以改回去。下面的注释是按我的习惯写的,               即指数下降的多项式。               加法的过程是这个样子的,首先过来两个链表中的各一个节点,              比较这两个节点,如果指数不相等,找出指数较大的那个节点,然后把目的链表的当前节点r              节点的next指针指向这个较大指数节点,并且r后移到那个节点(r=r->next),同时那个指数较大的节点已经              完成了他的任务,所以指向它的指针后移(p=p->next or q=q->next);当两个指数相等时,还要判断系数是否互为相反数,如果是的话那么就没有这个指数的节点了,              因为系数为零,所以直接释放掉两个节点 ,如果系数不为零,那么就随便找一个节点(你找的是p),              然后把p的系数修改为p->coef+q->coef,同时把目的链表的当前节点的next指针指向p(r->next=p),              同时把r修改为这个节点(r=r->next,因为它才是当前节点),同时两个链表同时后移,并且释放掉指针         */         if (p->exp>q->exp) //你的原程序是<,我改成>了         {                r->next=p;             r=r->next;             p=p->next;         }         else if(p->exp<q->exp)         {               r->next=q;            r=r->next;            q=q->next;         }         else         {                     s=p->coef+q->coef;             if(s!=0)             {                             p->coef=s;                 r->next=p;r=r->next;p=p->next;                 t=q;q=q->next;free(t);             }             else             {                 t=p;p=p->next;free(t);                 t=q;q=q->next;free(t);             }        }     }     /*        这个地方你写错了,不是if,应该是个循环,因为这个链表后面可能不只剩下一个节点         要把所有的剩下节点连到目的链表的后面!!     */     while(p!=NULL)     {        r->next=p;        p=p->next;    }     while(q!=NULL)     {        r->next=q;        q=q->next;        }     return(a); } int main(){      LinkList h,r,s;      h=input();      r=input();      s=add(h,r);      s=s->next;      while(s!=NULL)      {          printf("%f %d\n",s->coef,s->exp);          s=s->next;          }      getchar();      getchar();      return 0;  } 

热点排行