多项式加法
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:1458 测试通过:152
另外C++ 代码
总提交:1458 测试通过:152
描述
线性表是一种最简单、最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算。
现给两个一元整系数多项式,请求解两者之和。
输入
两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序,每一组结束行为
0 -1
输出
三组数据,前两组为一元整系数多项式,最后一组为两个多项式的和。
一元整系数多项式输出形式如下:
(1)多项式项4x输出为4X
(2)多项式项4x2输出为4X^2
(3)第一项系数为正数时,加号不要输出
(4)除常系数项外,项系数为1不显式输出,-1输出为-
例如,4x3- x2+x-1正确输出形式为4X^3-X^2+X-1,错误输出形式为 +4X^3-1X^2+1X-1样例输入
3 14
-8 8
6 2
2 0
0 -1
2 10
4 8
-6 2
0 -1
样例输出
3X^14-8X^8+6X^2+2
2X^10+4X^8-6X^2
3X^14+2X^10-4X^8+2
提示
该题属于南京邮电大学《数据结构A》实验一中的内容,验证的是课本代码,请慎重解答。
题目来源
CHENZ
注意点:输出格式,相加判断指数相不相同,特别注意如果相加为0的情况,否则会出现内存错误(坑!)
用的是C的单链表
贴上自己的代码
#include<stdio.h>
#include<stdlib.h>
//输入2组数据
#define LEN sizeof(struct node)
struct node
{
int a;
int b;
struct node *next;
};
// Input
struct node *Input()
{
struct node *head,*p,*tail;
head=NULL,tail=NULL;
int x,y;
while(scanf("%d %d",&x,&y) && (x != 0 || y != -1))
{
if(x == 0) continue; // 去除项数为0的
if(tail != NULL && y == tail->b) { // 相同指数
tail->a += x;
continue;
}
p=(struct node*)malloc(LEN);
p->a = x; p->b = y;
if(head==NULL) head=p;
else tail->next=p;
tail=p;
}
tail->next=NULL;
return head;
}
//Print
void Print(struct node *head)
{
struct node *p;
p=head;
if(head!=NULL)
{
do{
if(p == head)
{
if(p->b == 1) {
if(p->a >0) {
if(p->a == 1)
printf("X");
else
printf("%dX",p->a);
}
else {
if(p->a == -1)
printf("-X",p->b);
else
printf("%dX",p->a,p->b);
}
}
else { // head : p->b != 1
if(p->a >0) {
if(p->a == 1)
printf("X^%d",p->b);
else
printf("%dX^%d",p->a,p->b);
}
else {
if(p->a == -1)
printf("-X^%d",p->b);
else
printf("%dX^%d",p->a,p->b);
}
}
}
// not head
else if(p->b != 1 && p->b !=0) {
if(p->a > 0) {
if(p->a == 1)
printf("+X^%d",p->b);
else
printf("+%dX^%d",p->a,p->b);
}
else {
if(p->a == -1)
printf("-X^%d",p->b);
else
printf("%dX^%d",p->a,p->b);
}
}
else if(p->b == 1 ) {
if(p->a > 0) {
if(p->a == 1)
printf("+X");
else
printf("+%dX",p->a);
}
else {
if(p->a ==-1)
printf("-X");
else
printf("%dX",p->a);
}
}
else if(p->b == 0 ) {
if(p->a > 0)
printf("+%d",p->a);
else
printf("%d",p->a);
}
p=p->next;
}while(p!=NULL);
}
printf("\n");
}
int main()
{
bool tag = true; // x + -x = 0 !!!
struct node *head1,*head2;
head1 = Input();
Print(head1);
head2 = Input();
Print(head2);
//
struct node *head,*p,*tail; // 新建一个链表
head=NULL,tail=NULL;
struct node *p1,*p2;
p1 = head1; p2 = head2;
while(p1 != NULL && p2 != NULL) {
if(p1->b > p2->b) { //p1指数 >p2指数 添加p1
p=(struct node*)malloc(LEN); // !!!
tag = false;
p->a = p1->a; p->b = p1->b;
if(head==NULL) head=p;
else tail->next=p;
tail=p;
p1 = p1->next;
}
else if(p1->b == p2->b) {
int tmp = p1->a + p2->a; // 判断指数是否为0
if(tmp != 0) {
p=(struct node*)malloc(LEN); // !!!
tag = false;
p->a = p1->a + p2->a; p->b = p1->b;
if(head==NULL) head=p;
else tail->next=p;
tail=p;
}
p1 = p1->next;
p2 = p2->next;
}
else { //p2指数 > p1指数 插入p2
p=(struct node*)malloc(LEN); // !!!
tag = false;
p->a = p2->a; p->b = p2->b;
if(head==NULL) head=p;
else tail->next=p;
tail=p;
p2 = p2->next;
}
}
// 加上尾巴 p1 p2考虑全
if(p1 != NULL) {
tail->next = p1;
}
else if(p2 != NULL){
tail->next = p2;
}
else if(!tag)
tail->next = NULL;
if(!tag)
Print(head);
else
printf("0\n");
return 0;
}
另外C++ 代码
带一个空的表头结点,方便在最前面插入删除。
#include<iostream>
using namespace std;
typedef struct node{
int a;
int b;
struct node *next;
}Node;
int a,b;
bool tag=true;
void print(Node *head)
{
Node *p=head->next;
while(p!=NULL)
{
if(p==head->next)
{
if(p->a!=1)
{
if(p->a==-1)
{
cout<<"-";
}
else
{
cout<<p->a;
}
}
}
else
{
if(p->a>0)
{
cout<<"+";
if(p->a!=1)
{
cout<<p->a;
}
}
else
{
if(p->a!=-1)
{
cout<<p->a;
}
else
{
cout<<"-";
}
}
}
if(p->b!=0)
{
cout<<"X";
}
else
{
if(p->a==1||p->a==-1)
{
cout<<"1";
}
p=p->next;
continue;
}
if(p->b!=1)
{
cout<<"^"<<p->b;
}
p=p->next;
}
cout<<endl;
}
int main(){
Node *head[2],*head1,*p1,*p2,*k;
for(int i=0;i<2;i++){
head[i]=NULL;
}
head1=new Node();
for(int i=0;i<2;i++){
while(cin>>a>>b&&(a!=0||b!=-1)){
if(a==0)
{
continue;
}
if(head[i]==NULL)
{
Node *temp=new Node();
temp->a=a;
temp->b=b;
temp->next=NULL;
head[i]=new Node();
head[i]->next=temp;
}
else
{
Node *p,*q;
p=head[i]->next;
q=head[i];
while(p!=NULL&&p->b!=b)
{
q=p;
p=p->next;
}
if(p==NULL)
{
Node *temp=new Node();
temp->a=a;
temp->b=b;
temp->next=NULL;
q->next=temp;
}
else
{
p->a+=a;
if(p->a==0)
{
q->next=p->next;
}
}
}
}
print(head[i]);
}
p1=head[0]->next;
p2=head[1]->next;
k=head1;
while(p1!=NULL&&p2!=NULL)
{
Node *tempNode=new Node();
if(p1->b>p2->b)
{
tempNode->a=p1->a;
tempNode->b=p1->b;
p1=p1->next;
tag=false;
}
else if(p1->b<p2->b)
{
tempNode->a=p2->a;
tempNode->b=p2->b;
p2=p2->next;
tag=false;
}
else
{
if(p1->a+p2->a==0)
{
p1=p1->next;
p2=p2->next;
continue;
}
tempNode->a=p1->a+p2->a;
tempNode->b=p1->b;
p1=p1->next;
p2=p2->next;
tag=false;
}
k->next=tempNode;
k=tempNode;
}
while(p1!=NULL)
{
Node *tempNode=new Node();
tempNode->a=p1->a;
tempNode->b=p1->b;
k->next=tempNode;
k=tempNode;
p1=p1->next;
tag=false;
}
while(p2!=NULL)
{
Node *tempNode=new Node();
tempNode->a=p2->a;
tempNode->b=p2->b;
k->next=tempNode;
k=tempNode;
p2=p2->next;
tag=false;
}
if(!tag)
{
print(head1);
}
else
{
cout<<"0"<<endl;
}
return 0;
}