【问题描述】编写一个程序用单链表存储多项式,并实现两个一元多项式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);
}