zoukankan      html  css  js  c++  java
  • 求两个多项式相加运算

    #include<iostream>
    #include<malloc.h>
    using namespace std;
    #define MAX 20            //多项式最多项数
    
    typedef struct               //定义存放多项式的数组类型
    {
    	float coef;              //系数
    	int exp;				 //指数
    }PolyArray[MAX];
    
    typedef struct pNode         //定义单链表结点类型
    {
    	float coef;
    	int exp;
    	struct pNode *next;
    }PolyNode;
    
    void DispPoly(PolyNode * L)   //输出多项式
    {
    	PolyNode *p=L->next;
    	while(p!=NULL)
    	{
    		printf("%gX^%d",p->coef,p->exp);
    		p=p->next;
    	}
    	printf("
    ");
    }
    
    void CreateListR(PolyNode * &L,PolyArray a,int n)     //尾插法建表
    {
    	PolyNode *s,*r;
    	int i;
    	L=(PolyNode *)malloc(sizeof(PolyNode));           //创建头结点
    	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->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;
    	float 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 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}};
    	CreateListR(ha,a,4);
    	CreateListR(hb,b,5);
    	printf("原多项式A:");
    	DispPoly(ha);
    	printf("原多项式B:");
    	DispPoly(hb);
    	Sort(ha);
    	Sort(hb);
    	printf("排序后多项式A:");
    	DispPoly(ha);
    	printf("排序后多项式B:");
    	DispPoly(hb);
    
    	Add(ha,hb,hc);
    	printf("多项式相加:");
    	DispPoly(hc);
    
    }


  • 相关阅读:
    CSS3 target伪类简介
    不用position,让div垂直居中
    css3 在线编辑工具 连兼容都写好了
    a标签伪类的顺序
    oncopy和onpaste
    【leetcode】1523. Count Odd Numbers in an Interval Range
    【leetcode】1518. Water Bottles
    【leetcode】1514. Path with Maximum Probability
    【leetcode】1513. Number of Substrings With Only 1s
    【leetcode】1512. Number of Good Pairs
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3228551.html
Copyright © 2011-2022 走看看