数据结构经典算法题目:单链表保存的两个多项式相加

数据结构

用单链表ha 存储多项式A(x )=a0+a1x1+a2x2+…+anxn(其中aI为非零系数),用单链表hb 存储多项式B(x )=b0+b1x1+b2x2+…+bmxm(其中bj为非零系数),要求计算C(x )= A(x )+B(x ),结果存到单链表hc中。试写出程序。

思路:获取A,B 两个多项式,每获取一个就建立一个结点插入到头结点之后。形成一个多项式单链表。
创建头结点 C 将A,B 多项式 串联起来。 在操作过程中,一定要 将头结点C 赋值给 pc ,通过pc连接多项式。因为最后要返回 头结点C。
A,B多项式比较指数的大小,小项直接接在pc的后面,若相等,计算系数之和,不为零,保存下来。为零,跳过这个多项式。
最后,将A,B多余的多项式,直接串联在pc后就完成了。
返回头结点 C。

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

typedef struct list{
	int c;//系数 
	int e;//指数 
	struct list *next; 
}list,*Linklist; 

//创建多项式 
Linklist creatPolyn(){
	Linklist  head,p,q;
	int m;
	head = (Linklist)malloc(sizeof(list));
	head->next= NULL;
	q = head;
	printf("请输入多项式的项数:");
	scanf("%d",&m);
	for(int i=0;i<m;i++){
		p = (Linklist)malloc(sizeof(list));
		printf("输入第%d项的系数:",i+1);
		scanf("%d",&p->c);
		printf("输入第%d项的指数:",i+1);
		scanf("%d",&p->e);
		p->next = q->next;
		q->next = p;
		q = q->next;
	}
	return head;
}
//多项式相加 
Linklist AddPolyn(Linklist pa,Linklist pb){
	Linklist a,b,pc,c;
	a = pa;//保存pa的头结点 
	//printf("pa->c = %d pa->e = %d\n",pa->c,pa->e);
	b = pb;//保存pb的头结点 
	//将pa,pb多项式相加的结果保存在c中
	c = (Linklist)malloc(sizeof(list)); //给 C 申请一个空间 
	c->next = NULL; // 生成头结点 
	pc = c;//把头结点 给pc  方便之后操作!如果没有pc这个变量,直接操作c的话,return c 的结果只有最后一项,因为在过程中,c的地址已经发生了变化 
	while(a&&b){
		int m,n,sum;
		m=a->e; n=b->e; // m,n分别保存 a,b的 指数 
		if(m>n){
			pc->next = b;
			pc = pc->next;
			b = b->next;
			//printf("b多项式指数小  %d*X^%d\n",pc->c,pc->e);
		}
		else if(m == n){
			sum = a->c + b->c;
			if(sum!=0){
				a->c = sum;
				pc->next = a;
				pc=pc->next;
				//printf("多项式指数一样大  %d*X^%d\n",pc->c,pc->e);
			}
			//在这里有个 小bug  我不会修改了!bug是: 当两个多项式的最有一项和为0时,计算结果却是,项数多的那个多项式的最后一项 
			//a,b 已经处理完毕,同时后移一位。 
			a = a->next;
			b = b->next;
		}
		else{
			pc->next = a;
			pc = pc->next;
			a = a->next;
			//printf("a多项式指数小  %d*X^%d\n",pc->c,pc->e);
		}
		
	}
	// 判断那个多项式没有走到 NULL  然后将pc->next 直接指向剩余的多项式 
	if(a!=NULL){
		pc->next = a;
	}
	if(b!=NULL){
		pc->next = b;
	}
	return c;
}
void printList(Linklist L){
	while(L != NULL){
		printf("%d*X^%d ",L->c,L->e);
		L = L->next;
	}
	printf("\n"); 
}
int main(){
	Linklist pa,pb,pc;
	printf("请输入第一个多项式的系数和指数\n");
	pa = creatPolyn();
	printf("请输入第二个多项式的系数和指数\n");
	pb = creatPolyn();
	printf("输入的第一个多项式是:\n");
	printList(pa->next);
	printf("输入的第二个多项式是:\n");
	printList(pb->next);
	pc = AddPolyn(pa->next,pb->next);
	printf("两个多项式的和为:");
	printList(pc->next);
	return 0;
}
运行结果:

请输入第一个多项式的系数和指数
请输入多项式的项数:3
输入第1项的系数:1
输入第1项的指数:1
输入第2项的系数:-5
输入第2项的指数:5
输入第3项的系数:7
输入第3项的指数:7
请输入第二个多项式的系数和指数
请输入多项式的项数:4
输入第1项的系数:1
输入第1项的指数:1
输入第2项的系数:4
输入第2项的指数:4
输入第3项的系数:8
输入第3项的指数:8
输入第4项的系数:9
输入第4项的指数:9
输入的第一个多项式是:
1*X^1 -5*X^5 7*X^7
输入的第二个多项式是:
1*X^1 4*X^4 8*X^8 9*X^9
两个多项式的和为:2*X^1 4*X^4 -5*X^5 7*X^7 8*X^8 9*X^9

--------------------------------
Process exited after 20.26 seconds with return value 0
请按任意键继续. . .

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值