ACM 多项式加法

本文介绍了如何使用单链表解决一元整系数多项式加法问题。通过读取输入的多项式数据,按照指数递减排序,使用C语言实现相加操作。文章提供了一个示例输入和输出,强调了输出格式和处理特殊情况(如指数相同或相加为0)的重要性,并提及这是南京邮电大学《数据结构A》实验的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多项式加法

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交: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;   
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值