菜鸟问多项式的求和~~
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);
}
谁能帮我解释下这段代码,多项式的创建那里不是很懂`求和那里也是~望高人指点~~
[解决办法]
第二次回你的帖子,这么久都没人回你是因为你只有代码,很乱还没有注释,很少有人花时间给你看,
我最后还是痛苦的看下来了。
#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; }