多项式的计算

			#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();
		


	
				}



			}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值