链表应用之多项式相加

131 篇文章 0 订阅
3 篇文章 0 订阅

题目来源:Wejudge#3988

题目

首先输入2个整数m和n(0<m, n<=1000000000)分别代表2个多项式的项数。

然后,输入m+n行数据,前m行表示第一个多项式,后n行表示第二个多项式

每行1个整数c和一个非负整数e(e>=0),分别表示多项式每一项的系数和指数(指数按升序排列)。

样例
输入

3 4
1 1
2 3
3 5
1 0
-6 1
1 2
-3 5

输出

x+2x3+3x5
1-6x+x2-3x5
1-5x+x2+2x3

代码
#include<stdio.h>
#include<stdlib.h>

typedef struct LNode{
    int   coef,index;       //数据域
    struct LNode  *next;   //指针域
}LNode,*LinkList;   

void create(LinkList &ll,int n);
void add(LinkList l1,LinkList l2,LinkList &L);
void print(LinkList L);

int main(){
	int n,m;
	while(~scanf("%d %d", &n , &m)){
		LinkList l1,l2,l3;
		create(l1, n);
		create(l2, m);
		add(l1,l2,l3);
		print(l1);
		print(l2);
		print(l3);
	}
	return 0;
}

void create(LinkList &ll,int n)
{
	ll=new LNode;
	LNode *l=ll;
	int a,b;
	while(n--)
	{
		scanf("%d %d",&a,&b);
		if(a==0)continue;
		l->next=new LNode;
		l=l->next;
		l->coef=a,l->index=b;
		l->next=NULL;
	}
}
void add(LinkList l1,LinkList l2,LinkList &L)
{
	int cc=0;
	L=new LNode;
	LNode *p=L;
	l1=l1->next,l2=l2->next;
	while(l1&&l2){
		p->next=new LNode;
		if(l1->index<l2->index){//指数比较,小的先进行 ,l1小 
			p->next->coef=l1->coef;
			p->next->index=l1->index;
			l1=l1->next;
		} else if(l1->index==l2->index){//指数相同的相加 
			int u=l1->coef+l2->coef;
			if(u==0){//为0 
				p->next->coef=0;
				p->next->index=0;
			}else{//不为0 
				p->next->coef=u;
				p->next->index=l1->index;
			}
			l1=l1->next;
			l2=l2->next;
		}else{//l2小 
			p->next->coef=l2->coef;
			p->next->index=l2->index;
			l2=l2->next;
		}
		p=p->next;
	}
	while(l1){
		p->coef=l1->coef;
		p->index=l1->index;
		l1=l1->next;
		p->next=new LNode;
		p=p->next;
	}
	while(l2){
		p->coef=l2->coef;
		p->index=l2->index;
		l2=l2->next;
		p->next=new LNode;
		p=p->next;
	}
	p->next=NULL;
}
void print(LinkList L)
{
	int kk=0;
	while(L->next!=NULL){
		kk++;
		L=L->next;
		if(kk==1){//第一个数 
				if(L->coef==0){//a=0
					continue;
				}else if(L->coef==1){//a=1      剩下都有b是0  1  其他的情况 
					if(L->index==0){
						printf("%d",L->coef);//就是1 
					}else if(L->index==1){
						printf("x");
					}else{
						printf("x^%d",L->index);
					}
				}else{//a是其他情况 
					if(L->index==0){
						printf("%d",L->coef);
					}else if(L->index==1){
						printf("%dx",L->coef);
					}else{
						printf("%dx^%d",L->coef,L->index);
					}
				}
		} else{//不是第一个 
		
				if(L->coef>=0){//正数和0 
					if(L->coef==0){//a=0
						continue;
					}else if(L->coef==1){//a=1      剩下都有b是0  1  其他的情况 
						if(L->index==0){
							printf("+%d",L->coef);//就是1 
						}else if(L->index==1){
							printf("+x");
						}else{
							printf("+x^%d",L->index);
						}
					}else{//a是其他情况 
						if(L->index==0){
							printf("+%d",L->coef);
						}else if(L->index==1){
							printf("+%dx",L->coef);
						}else{
							printf("+%dx^%d",L->coef,L->index);
						}
					}
				}else{
					{ 
						if(L->index==0){
							printf("%d",L->coef);
						}else if(L->index==1){
							printf("%dx",L->coef);
						}else{
							printf("%dx^%d",L->coef,L->index);
						}
					}
				}
		}
	}
	printf("\n");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链表是一种常用的数据结构,可以用来实现稀疏多项式的相加。在C语言中,可以通过定义一个结构体来表示多项式的每一,然后使用链表将这些连接起来。 首先,我们可以定义一个结构体来表示多项式的每一,包括系数指数: ```c typedef struct Node { int coefficient; // 系数 int exponent; // 指数 struct Node* next; // 指向下一个节点的指针 } Node; ``` 然后,我们可以定义一个函数来创建一个新的节点: ```c Node* createNode(int coefficient, int exponent) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->coefficient = coefficient; newNode->exponent = exponent; newNode->next = NULL; return newNode; } ``` 接下来,我们可以定义一个函数来将节点插入到链表中的正确位置: ```c void insertNode(Node** head, Node* newNode) { if (*head == NULL || (*head)->exponent < newNode->exponent) { newNode->next = *head; *head = newNode; } else { Node* current = *head; while (current->next != NULL && current->next->exponent > newNode->exponent) { current = current->next; } newNode->next = current->next; current->next = newNode; } } ``` 最后,我们可以定义一个函数来实现两个多项式的相加: ```c Node* addPolynomials(Node* poly1, Node* poly2) { Node* result = NULL; while (poly1 != NULL && poly2 != NULL) { if (poly1->exponent > poly2->exponent) { insertNode(&result, createNode(poly1->coefficient, poly1->exponent)); poly1 = poly1->next; } else if (poly1->exponent < poly2->exponent) { insertNode(&result, createNode(poly2->coefficient, poly2->exponent)); poly2 = poly2->next; } else { int sum = poly1->coefficient + poly2->coefficient; if (sum != 0) { insertNode(&result, createNode(sum, poly1->exponent)); } poly1 = poly1->next; poly2 = poly2->next; } } while (poly1 != NULL) { insertNode(&result, createNode(poly1->coefficient, poly1->exponent)); poly1 = poly1->next; } while (poly2 != NULL) { insertNode(&result, createNode(poly2->coefficient, poly2->exponent)); poly2 = poly2->next; } return result; } ``` 这样,我们就可以通过调用上述函数来实现稀疏多项式的相加了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值