#include <stdio.h>
#include <malloc.h>
#define MAX 20 //多项式最多项数
#define MMAX MAX*MAX
typedef struct //定义存放多项式的数组类型
{
double coef; //系数
int exp; //指数
} PolyArray;
typedef struct pnode //定义单链表结点类型,保存多项式中的一项,链表构成多项式
{
double coef; //系数
int exp; //指数
struct pnode *next;
} PolyNode;
int input(PolyArray *a){
int i,n;
printf("请输入多项式的项数:(项数大于0小于20)\n");
scanf("%d",&n);
while(n<0||n>20){
printf("请输入多项式的项数:(项数大于0小于20)\n");
scanf("%d",&n);
}
for(i=0;i<n;i++){
printf("请输入多项式的每一项(例如4x^3应该输入4 3):\n");
scanf("%lf %d",&a[i].coef,&a[i].exp);
}
return n;
}
void DispPoly(PolyNode *L) //输出多项式
{
bool first=true; //first为true表示是第一项
PolyNode *p=L->next;
while (p!=NULL)
{
if (first)
first=false;
else if (p->coef==0){
p=p->next;
printf("+");
}
else if (p->coef>0)
printf("+");
if (p->exp==0)
printf("%g",p->coef);
else if (p->exp==1)
printf("%gx",p->coef);
else
printf("%gx^%d",p->coef,p->exp);
p=p->next;
}
printf("\n");
}
void DestroyList(PolyNode *&L) //销毁单链表
{
PolyNode *p=L,*q=p->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
void CreateListR(PolyNode *&L, PolyArray a[], int n) //尾插法建表
{
PolyNode *s,*r;
int i;
L=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点(maloc函数:在内存中分配一段连续的内存。返回值是指针,指向被分配内存的首地址)
L->next=NULL;
r=L; //r始终指向终端结点,开始时指向头结点。
for (i=0; i<n; i++)
{
s=(PolyNode *)malloc(sizeof(PolyNode));//创建新结点
s->coef=a[i].coef;
s->exp=a[i].exp;
r->next=s; //将*s插入*r之后
r=s; //r总是指向终端
}
r->next=NULL; //终端结点next域置为NULL
}
void Sort(PolyNode *&head) //按exp域递减排序(直接插入法排序)
{
PolyNode *p=head->next,*q,*r;
if (p!=NULL) //若原单链表中有一个或以上的数据结点
{
r=p->next; //r保存*p结点后继结点的指针
p->next=NULL; //构造只含一个数据结点的有序表
p=r;
while (p!=NULL)
{
r=p->next; //r保存*p结点后继结点的指针
q=head;
while (q->next!=NULL && q->next->exp>p->exp)
q=q->next; //在有序表中找插入*p的前驱结点*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;
double c;
hc=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点
tc=hc;
while (pa!=NULL && pb!=NULL)
{
if (pa->exp>pb->exp)
{
s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点
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)); //复制结点
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) //系数之和不为0时创建新结点
{
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) pa=pb; //复制余下的结点
while (pa!=NULL)
{
s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点
s->exp=pa->exp;
s->coef=pa->coef;
tc->next=s;
tc=s;
pa=pa->next;
}
tc->next=NULL;
}
void Sub(PolyNode *ha,PolyNode *hb,PolyNode *&hc) //求两有序集合的差,完成减法
{
PolyNode *pa=ha->next,*pb=hb->next,*s,*tc;
double c;
hc=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点
tc=hc;
while (pa!=NULL && pb!=NULL)
{
if (pa->exp>pb->exp)
{
s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点
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)); //复制结点
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) //系数之和不为0时创建新结点
{
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) pa=pb; //复制余下的结点
while (pa!=NULL && pb!=NULL)
{
s=(PolyNode *)malloc(sizeof(PolyNode)); //复制结点
s->exp=-pa->exp;
s->coef=-pa->coef;
tc->next=s;
tc=s;
pa=pa->next;
}
tc->next=NULL;
}
void Muli(PolyNode *ha,PolyNode *hb,PolyNode *&hc) //求两有序集合的积
{
PolyNode *pa=ha->next,*pb,*s,*tc,*head,*m,*n;
hc=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点
tc=hc;
while (pa!=NULL)
{
pb=hb->next;
while(pb!=NULL ){
s=(PolyNode *)malloc(sizeof(PolyNode)); //插入节点
s->exp=(pa->exp)+(pb->exp);
s->coef=(pa->coef)*(pb->coef);
tc->next=s;
tc=s;
pb=pb->next;
}
pa=pa->next;
}
tc->next=NULL;
m=hc->next;
while(m!=NULL){
n=m->next;
while(n!=NULL){
if(n->exp==m->exp){
m->coef+=n->coef;
n->coef=0;
}
n=n->next;
}
m=m->next;
}
}
void Menu()
{
printf("\n 两个多项式的运算");
printf("\n===================================");
printf("\n| 1-输入多项式A |");
printf("\n| 2-输入多项式B |");
printf("\n| 3-两个多项式的加法 |");
printf("\n| 4-两个多项式的减法 |");
printf("\n| 5-两个多项式的乘法 |");
printf("\n================================== ");
printf("\n 温馨提示:只有进行了前两步,才能进行后三步");
printf("\n请输入你要选择的序号:");
}
int main()
{
int i,n;
char ch1='y',ch2;
PolyNode *ha,*hb,*hc,*hd;
PolyArray a[MAX];
PolyArray b[MAX];
PolyArray c[MMAX];
PolyArray d[MMAX];
while(ch1=='y'||ch1=='Y')
{ Menu();
scanf("%c",&ch2);
switch(ch2)
{
case '1':
n=input(a);
CreateListR(ha,a,n);
printf("您输入的多项式a(请进行核对): ");
DispPoly(ha);
break;
case '2':
n=input(b);
CreateListR(hb,b,n);
printf("您输入的多项式b(请进行核对): ");
DispPoly(hb);
break;
case '3':
Sort(ha);
Sort(hb);
Add(ha,hb,hc);
printf("多项式相加: ");
DispPoly(hc);
break;
case '4':
Sort(ha);
Sort(hb);
Sub(ha,hb,hc);
printf("多项式相减: ");
DispPoly(hc);
break;
case '5':
Sort(ha);
Sort(hb);
Muli(ha,hb,hc);
printf("多项式相乘: ");
DispPoly(hc);
break;
default:
printf("指令有误\n");
}
getchar();
printf("按y或Y键返回主菜单,按其他任何键退出程序:");
scanf("%c",&ch1);
getchar();
}
}
多项式的计算
最新推荐文章于 2024-01-22 17:49:30 发布