C语言 多项式相加
发布网友
发布时间:2022-05-27 16:00
我来回答
共2个回答
热心网友
时间:2023-11-01 14:36
/*为了一元多项式相加能够使用效率更高的算发,应该在多项式的排序操作中加入合并同类项,除非你可以保证输入不含有同类项*/
/*今天就这些吧,明天争取写出来,走了!*/
#include<stdio.h>
#include<stdlib.h>
typedef struct DXS{
float xs;
int zs;
struct DXS *next;
} multinomial;
//输入函数
multinomial *input(void)
{
multinomial *p,*h;
h=NULL;
printf("please input the xs and zs of the DXS:\n");
for(;;)
{
p=(multinomial *)malloc(sizeof(multinomial));
scanf("%f %d",&p->xs,&p->zs);
if(p->xs==0 && p->zs==0){free(p);break;}
p->next=h;
h=p;//从头部插入,没有问题
}
return(h);
}
//将多项式排序
multinomial *inorder(multinomial *h)
{
multinomial *s,*t,*m,*h3;
h3=h->next;//指向第二个结点
h->next=NULL;//拆下第一个结点,为什么?
while(h3!=NULL)
{
s=h3;
h3=h3->next;
t=h;
m=h;
while(s->zs<t->zs&&t!=NULL)
{
m=t;
t=t->next;
}
if(m=t)
{s->next=t;
h=s;
}
else
{
s->next=t;
m->next=s;
}
}
return(h);
}
//两个多项式相加
multinomial *add(multinomial *h1,multinomial *h2)
{
multinomial *u,*v,*w,*j;
w=h2;j=h2;
while(j!=NULL)
{
u=v=h1;w=j;
while(u->zs>w->zs&&u!=NULL)
{v=u;
u=u->next;
}
if(u->zs==w->zs) //指数相同,则系数相加
{
u->xs=u->xs+w->xs;
if(u->xs==0) //如果系数为0,则做删除操作
{
if(u=v) //删除表头
h1=h1->next;
}
else if(u->next==NULL) // 删除表尾
v=NULL;
else //删除表中
{
u=u->next;
}
}
else if(u=v) //待插入点在在表头
{
w->next=u;
h1->next=w;
}
else //待插入点不是在表头
{
w->next=u;
v->next=w;
}
j=j->next;
}
return(h1);
}
void print(multinomial *h1)
{
printf("f(x)=");
while(h1!=NULL)
{
printf("%f",h1->xs);
if(h1->zs!=0)
printf("x^%f",h1->xs);
else printf("%f",h1->xs);
h1=h1->next;
if(h1!=NULL&&h1->xs>0)
printf("+");
}
}
void main()
{multinomial *h1,*h2;
printf("输入第一个多项式的系数和指数(系数与指数之间用空格号隔开)");
h1=input();
printf("输入第二个多项式的系数和指数(系数与指数之间用空格号隔开");
h2=input();
h1=inorder(h1);
h2=inorder(h2);
h1=add(h1,h2);
print(h1);
}
热心网友
时间:2023-11-01 14:37
发现第一个问题:
input()函数的
p->next=h;
h=p;
有问题, 链表没有连上