• 求两个多项式相加运算


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


  • 相关阅读:
    sudo命令 sudoers文件
    sscanf函数
    printf格式化输出
    c文件操作
    string和char*
    c去除空格 小写转大写
    主机序和网络序转换
    ulimit用法
    mysql基础(附具体操作代码)
    ES6 class
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3228551.html
Copyright © 2020-2023  润新知