数据结构——c语言 一元稀疏多项式

戳这里还有其他数据结构的题目噢

https://blog.csdn.net/qq_45724947/article/details/115625130?spm=1001.2014.3001.5501


设计并验证以下算法:一元稀疏多项式计算器。
(1) 设Pn(x)和Qm(x)分别为两个-元稀疏多项式,利用单链表存储Pn(x)和Qm(x)。
(2) 从键盘输入一元多项式的信息,建立一元稀疏多项式Pn(x)和Qm(x),并输出。
(3) 实现Pn(x)和Qm(x)相加,并输出两者的和Pn(x)+Qm(x)。
(4) 实现Pn(x)和Qm(x)相减,并输出两者的差Pn(x)-Qm(x)。
(5) 就地逆置两者的差Pn(x)-Qm(x)。

 直接上代码:

#include <stdio.h>
#include<stdlib.h> 
#include <malloc.h>
typedef int ElemType;
typedef int Status;
typedef struct NList{//定义多项式的存储结构 
	int coef;  // 系数 
	int index;	//指数 
	struct NList *next;
}PolyNode,*PolyList;
PolyList p,q,r;
 
void initList(PolyList *L){//创建多项式 
	(*L) = (PolyList)malloc(sizeof(PolyNode));
	(*L)->next = NULL;
	r=(*L);
	int coef,index;
	printf("请输入多项式的系数coef和指数index:(系数coef为0结束!)\n");
	scanf("%d %d",&coef,&index);
	
	while(coef != 0){
        //生成新节点; 
 		p = (PolyList)malloc(sizeof(PolyNode));
		p->next = NULL;
		p->coef = coef;
		p->index = index; 
		//把 新节点 以  尾接法方式插入链表;
		r->next=p; r=p;
		scanf("%d %d",&coef,&index);
	}
}
 
void add(PolyList a,PolyList b,PolyList *c){//多项式加法 
	PolyList pa,pb,pc;
	
	(*c) = (PolyList)malloc(sizeof(PolyNode));
	(*c)->next = NULL; r=(*c);
	
	pa=a->next; pb=b->next;
	while((pa!=NULL)&&(pb!=NULL)){
		
		if(pa->index < pb->index){
			//复制a的当前元素节点
			    pc=(PolyList)malloc(sizeof(PolyNode));
				pc->next=NULL;
				 pc->index=pa->index;
				 pc->coef=pa->coef; 
			//把新节点加入c 
				r->next=pc; r=pc;
				pa=pa->next;
			
		}else if(pa->index == pb->index){
			//将两个系数相加和赋值给变量sum
			int sum;
			sum=pa->coef+pb->coef;
 
			if(sum!=0){
				//生成新节点并适当赋值;
				pc=(PolyList)malloc(sizeof(PolyNode));
				pc->next=NULL;
				pc->coef=sum; pc->index=pa->index;
				//把新节点加入c
				r->next=pc; r=pc;
			}
			pa=pa->next;pb=pb->next;
		}else if(pa->index > pb->index){
			//复制b的当前元素节点
			
			   pc=(PolyList)malloc(sizeof(PolyNode));
				pc->next=NULL;
				 pc->index=pb->index;
				 pc->coef=pb->coef;
			//把新节点加入c 
			
				r->next=pc; r=pc;
				pb=pb->next;
		}
	}
	if(pa){
			pc->next=pa; 
	}else if(pb){
			pc->next=pb;
	}
}
 
void printList(PolyList l){//打印多项式 
	p=l->next;
	int i = 0;//为了打印项之间的符号 
	while(p){
		if(i != 0)
			printf("+");
		if(p->coef < 0) 
			printf("(%d)X^%d",p->coef,p->index);
		if(p->coef > 0)
			printf("%dX^%d",p->coef,p->index);
		p=p->next;
		i++;
	}
	printf("\n"); 
}
void oppositeList(PolyList *l){//多项式的系数取相反数 
	PolyList p=(*l)->next;
	while(p){
		p->coef=-p->coef;
		p=p->next;
	}
}
void subtractionList(PolyList a,PolyList b,PolyList *c){//多项式减法 
	oppositeList(&b);
	add(a,b,c);
	oppositeList(&b);
}
void reverse (PolyList *l){//多项式逆置 
	PolyList p,q,r;
	p=*l;
	q=p->next;
	p->next=NULL; 
	while(q){
		r=q->next;
		q->next=p->next;
		p->next=q;
		q=r;
		if(r)
			r=r->next;
	}
}
int main(){
	PolyList a,b,c;
	initList(&a);//创建一元多项式 a 
 	initList(&b);//创建第二个多项式 b 
	
	
	printf("\na多项式: ");
	printList(a);
	
	printf("\nb多项式: ");
	printList(b);
	
	add(a,b,&c); //把a,b扔进去 得到c
	printf("\na+b得到新多项式: ");
	printList(c);
	subtractionList(a,b,&c); //同上 
	printf("\na-b得到新多项式: ");
	printList(c);
	
	printf("\n逆置后的多项式c: ");
	reverse(&c); 
	printList(c); 
	return 0;
}
/* 
样例输入 
7 0
3 1
9 8
5 17
0 0
8 1
22 7
-9 8
0 0
*/ 

(请不要直接复制使用。代码仅供参考,希望读者借此代码自身可以理解学习)

如果代码对您有帮助,不要忘记评论收藏噢~

  • 9
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起当风萧

如果喜欢请支持一下~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值