要求:
1? 輸入并建立多項式
2? 輸出多項式,輸出形式外為整數(shù)序列:c1,e1;c2,e2;.......cn,en;其中n為多項式的項數(shù),ci和ei分別為第i項的系數(shù)和指數(shù),序列按指數(shù)降序排列
3? 多項式a和b相加,建立多項式a+b
4? 多項式a和b相減,建立多項式a-b
代碼如下:
#include<stdio.h>
#include<malloc.h>
#define MAX 20? //多項式最多項數(shù)
typedef struct? //定義存放多項式的數(shù)組類型
{
? float coef;?? //系數(shù)
? int exp;????? //指數(shù)
}PolyArray[MAX];
typedef struct pnode? //定義單鏈表結(jié)點類型
{
? float coef;???????? //系數(shù)
? int exp;??????????? //指數(shù)
? struct pnode *next;
}PolyNode;
void DispPoly(PolyNode *L)? //輸出多項式
{
?PolyNode *p=L->next;
?while (p!=NULL)
?{
? printf("%g,%d;",p->coef,p->exp);
? p=p->next;
?}
?printf("\n");
}
void CreateListR(PolyNode * &L,PolyArray a,int n)??? //尾插入法建表
{
?PolyNode *s,*r;int i;
?L=(PolyNode *)malloc(sizeof(PolyNode));????????? //創(chuàng)建頭結(jié)點
?L->next=NULL;
//?L->exp=n;
// printf("%d\n",L->exp);
?r=L;??????????????????????????????????????????? //r始終指向終端結(jié)點,開始時指向頭結(jié)點
??for(i=0;i<n;i++)
??{
??? s=(PolyNode *)malloc(sizeof(PolyNode));?? //創(chuàng)建新結(jié)點
??? s->coef=a[i].coef;
??? s->exp=a[i].exp;
??? r->next=s;?????????????????????????????? //將*s插入*r之后
??? r=s;
??}
??r->next=NULL;?????????????????????????????? //將終端結(jié)點next域置為NULL
}
void Sort(PolyNode * &head)???????????????????????? //按exp域的值遞減排序
{
? PolyNode *p=head->next,*q,*r;
? if(p!=NULL)????????????????????????????????????? //當(dāng)原單鏈表不為空時
? {
?? r=p->next;???????????????????????????????????? //r保存*p結(jié)點后繼結(jié)點的指針
?? p->next=NULL;????????????????????????????????? //構(gòu)造只含一個數(shù)據(jù)結(jié)點的有序表
?? p=r;
?? while(p!=NULL)
?? {
???? r=p->next;?????????????????????????????????? //r保存*p結(jié)點后繼結(jié)點的指針
? q=head;
? while(q->next!=NULL && q->next->exp>p->exp)
?? q=q->next;?????????????????????????????? //在有序表中找插入*p的前驅(qū)結(jié)點*q
? p->next=q->next;???????????????????????????? //將*p插入到*q之后
? q->next=p;
? p=r;
?? }
? }
}
void Add(PolyNode *ha,PolyNode *hb,PolyNode *&hc)//求兩個有序表的并
{
? PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;
? float c;
? hc=(PolyNode *)malloc(sizeof(PolyNode));?????????? //創(chuàng)建頭結(jié)點
? tc=hc;
? while(pa!=NULL && pb!=NULL)
? {
??? if(pa->exp>pb->exp)
?{
?? s=(PolyNode *)malloc(sizeof(PolyNode));??????? //復(fù)制結(jié)點
?? s->exp=pa->exp;s->coef=pa->coef;
?? tc->next=s;tc=s;
?? pa=pa->next;
?}
?else if(pa->exp<pb->exp)
?{
? s=(PolyNode *)malloc(sizeof(PolyNode));?????????? //復(fù)制結(jié)點
? s->exp=pb->exp;s->coef=pb->coef;
? tc->next=s;tc=s;
? pb=pb->next;
?}
?else???????????????????????????????????????????? //pa->exp=pb->exp時
?{
?c=pa->coef+pb->coef;
?if(c!=0)????????????????????????????????????????? //系數(shù)之和不為0時創(chuàng)建新結(jié)點
?{
?? s=(PolyNode *)malloc(sizeof(PolyNode));???
?? s->exp=pa->exp;s->coef=c;
?? tc->next=s;tc=s;
?}
?pa=pa->next;
?pb=pb->next;
?}
? }
? if(pb!=NULL)???????????????????????????????????? //復(fù)制余下結(jié)點
?? pa=pb;
? while(pa!=NULL)
? {
??? s=(PolyNode *)malloc(sizeof(PolyNode));?????????? //復(fù)制結(jié)點
?s->exp=pa->exp;s->coef=pa->coef;
?tc->next=s;tc=s;
?pa=pa->next;
? }
? tc->next=NULL;
}
void Subs(PolyNode *ha,PolyNode *hb,PolyNode *&hc)?? //求兩個有序表的差
{
? PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;
? float c;
? hc=(PolyNode *)malloc(sizeof(PolyNode));?????????? //創(chuàng)建頭結(jié)點
? tc=hc;
? while(pa!=NULL && pb!=NULL)
? {
??? if(pa->exp>pb->exp)
?{
?? s=(PolyNode *)malloc(sizeof(PolyNode));??????? //復(fù)制結(jié)點
?? s->exp=pa->exp;s->coef=pa->coef;
?? tc->next=s;tc=s;
?? pa=pa->next;
?}
?else if(pa->exp<pb->exp)
?{
? s=(PolyNode *)malloc(sizeof(PolyNode));?????????? //復(fù)制結(jié)點
? s->exp=pb->exp;s->coef=-pb->coef;???????????????? //如果前個多項式中的指數(shù)小于后個多項式指數(shù)加上負號
? tc->next=s;tc=s;
? pb=pb->next;
?}
?else???????????????????????????????????????????? //pa->exp=pb->exp時
?{
?c=pa->coef-pb->coef;
?if(c!=0)????????????????????????????????????????? //系數(shù)之差不為0時創(chuàng)建新結(jié)點
?{
?? s=(PolyNode *)malloc(sizeof(PolyNode));???
?? s->exp=pa->exp;s->coef=c;
?? tc->next=s;tc=s;
?}
?pa=pa->next;
?pb=pb->next;
?}
? }
? if(pb!=NULL)???????????????????????????????????? //復(fù)制余下結(jié)點
?? pa=pb;
? while(pa!=NULL)
? {
??? s=(PolyNode *)malloc(sizeof(PolyNode));?????????? //復(fù)制結(jié)點
?s->exp=pa->exp;s->coef=pa->coef;
?tc->next=s;tc=s;
?pa=pa->next;
? }
? tc->next=NULL;
}
void main()
{
?? PolyNode *ha,*hb,*hc;
?? //PolyArray a={{1.2,0},{2.5,1},{3.2,3},{-2.5,5}};
?? //PolyArray b={{-1.2,0},{2.5,1},{3.2,3},{2.5,5},{5.4,10}};
?? int m=4,n=5;
?? PolyArray a,b;
?? for(int i=0;i<m;i++)
?? {
???? printf("請輸入A多項式中第%d項的系數(shù)和指數(shù)",i);
? scanf("%f%d",&a[i].coef,&a[i].exp);
?? }
?
??? for(int j=0;j<n;j++)
?? {
???? printf("請輸入B多項式中第%d項的系數(shù)和指數(shù)",j);
? scanf("%f%d",&b[j].coef,&b[j].exp);
?? }
?? CreateListR(ha,a,4);
?? CreateListR(hb,b,5);
?? printf("原來A:\n");DispPoly(ha);
?? printf("原來B:\n");DispPoly(hb);
?? Sort(ha);
?? Sort(hb);
?? printf("排序后A:\n");DispPoly(ha);
?? printf("排序后B:\n");DispPoly(hb);
?? Add(ha,hb,hc);
?? printf("相加后:\n");DispPoly(hc);
?? Subs(ha,hb,hc);
?? printf("相減后:\n");DispPoly(hc);
}