一元多项式存储与相加

【问题描述】编写一个程序用单链表存储多项式,并实现两个一元多项式A与B相加的函数。A,B刚开始是无序的,A与B之和按降序排列。例如:
多项式A: 1.2X^0 2.5X^1 3.2X^3 -2.5X^5
多项式B: -1.2X^0 2.5X^1 3.2X^3 2.5X^5 5.4X^10
多项式A与B之和:5.4X^10 6.4X^3 5X^1

【输入形式】任意两个多项式A和B的项数及对应的系数和指数,要查询的第几项
【输出形式】多项式中某一项的系数与指数,系数保留一位小数

【输入样例】
4 1.2 0 2.5 1 3.2 3 -2.5 5
5 -1.2 0 2.5 1 3.2 3 2.5 5 5.4 10
2

【输出样例】

6.4 3

【样例说明】
第一个多项式的系数与指数对,以空格隔开
第二个多项式的系数与指数对,以空格隔开
输出第2项的系数与指数,系数与指数间用空格隔开,系数保留一位小数

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<iostream>
#include<iomanip>
using namespace std;
#define OK 1
#define ERROR 0
#include<string.h>
/*1.多项式存储,系数、指数、指针域
2. 建表,边插边排 
3.数学比较,指数相同系数相加,系数为0不加入新链表,系数不为0,加入新链表,指数不同比较大小放入新链表
4.加入新链表时为尾插法见表,一定要传进尾指针!!!*/
struct Node{
	double coef;
	int exp;
	struct Node *next;
};
typedef Node* point;

Node* Init(Node* &L)
{  /*创建链表或初始化时一定要为头结点申请空间!*/
    L=(Node*)malloc(sizeof(Node));
	L->next=NULL;
	return L;
}


Node* Create(Node* &L,int n)
{   double c;
    int e;
    Node *s,*h;
    int i;
    L=(Node*)malloc(sizeof(Node));
    L->next=NULL;
  for(i=1;i<=n;i++)//边插边排 
  {
       cin>>c>>e;
	   s=(Node*)malloc(sizeof(Node));
       s->coef=c;
       s->exp=e;
       h=L;//每回输入,h指向头开始 ,比h小就插在h的后面 
	   while(h->next!=NULL&&h->next->exp>e)
	   {
	   	h=h->next;
	   }
	   s->next=h->next;//第一次先把s为第一个节点插入(跳过循环)
	   h->next=s;
  }

	return L;
}


Node* Insert(Node* &L,double c,int e,point *r)
{   Node *s;

	s=(Node*)malloc(sizeof(Node));
	s->coef=c;
	s->exp=e;
	(*r)->next=s;
	*r=s;
    (*r)->next=NULL;
	return L;
}

Node* Add(Node* &L1,Node* &L2,Node* &L3)
{
	Node *p=L1->next,*q=L2->next;
	Node* r=L3;
	double nc;
	while(p!=NULL&&q!=NULL)
	{
		if(p->exp>q->exp)
		  {
			L3=Insert(L3,p->coef,p->exp,&r);
			p=p->next;
		  }
		else if(p->exp<q->exp)
		  {
			L3=Insert(L3,q->coef,q->exp,&r);
			q=q->next;
		  }
		else if(p->exp==q->exp)
		{
			nc=p->coef+q->coef;
			if(nc!=0)
			  {
			     L3=Insert(L3,nc,p->exp,&r);
			  }
			  p=p->next;
			  q=q->next;
		}
	}
	while(p!=NULL)
	{
		L3=Insert(L3,p->coef,p->exp,&r);
		p=p->next;
	 }
	while(q!=NULL)
	{
		L3=Insert(L3,q->coef,q->exp,&r);
		q=q->next;
	 }
	return L3;
}

void Show(Node* &L)
{
	Node* p=L->next;
	while(p!=NULL)
	{
		cout<<p->coef<<' '<<p->exp<<' ';
		p=p->next;
	 }
	cout<<endl;
}
void Locate(Node* &L,int pos)
{
	int i=0;
	Node* p=L;
	while(p!=NULL&&i<pos)
	{
		p=p->next;
		i++;
	}
cout<<setiosflags(ios::fixed)<<setprecision(1)<<p->coef;
		//printf("%.1lf",p->coef);
	cout<<' '<<p->exp<<endl;
}
int main()
{
	Node *L1,*L2,*L3;
	int a,b,c;
	cin>>a;
	L1=Create(L1,a);
	//Show(L1);
	cin>>b;
	L2=Create(L2,b);
	//Show(L2);
	L3=Init(L3);
	L3=Add(L1,L2,L3);
	cin>>c;
	Locate(L3,c);
	//Show(L3);
}

猜你喜欢

转载自blog.csdn.net/weixin_43913556/article/details/88775774