一元多项式加法和乘法-数据结构学习笔记2.3-2.4

/*
 1 一元多项式的用什么表示-----单链表,此处不带头结点的表示
 2创建一元多项式,输入3 5 6 1 5 2 3表示三项多项式,系数分别为5,1,2指数分别为6,5,3---程序要求自动按指数从大到小排序
 3完成一元多项式的加法
 4完成一元多项式的乘法
 5完成一元多项式的输出
*/
#include<stdio.h>
#include<stdlib.h>
/*结点,多项式中的一项*/
typedef struct Node 
{
	int x;//表示系数
	int z;//表示指数
	struct Node *next;
}*LNode;
typedef struct Node *Dxs;


Dxs CreateDxs(){
//创建临时头结点
LNode p,tmp,front=(LNode)malloc(sizeof(struct Node));
front->next=NULL;
//
int n,x,z;
scanf("%d",&n);
for(int i=0;i<n;i++){
p=front;//p开始指向头结点,用于遍历单链表
scanf("%d %d",&x,&z);
tmp=(LNode)malloc(sizeof(struct Node));
tmp->x=x;
tmp->z=z;
while(p->next&&p->next->z>z){//遍历单链表找到合适插入位置的前一个结点,即结点要插在此时p之后
p=p->next;

}//while end
tmp->next=p->next;
p->next=tmp;
}//for end
//删除头结点
tmp=front;
front=front->next;
free(tmp);
return front;
} 

void PrintDxs(Dxs dxs){
	LNode p=dxs;
while(p!=NULL){
	if(p->x>0)
	printf("+%dX^%d",p->x,p->z);
	else
	printf("%dX^%d",p->x,p->z);
	p=p->next;
}
printf("\n");
}
void Addnode(int x,int z,LNode *rearptr){
LNode tmp=(LNode)malloc(sizeof(struct Node));
tmp->x=x;
tmp->z=z;
(*rearptr)->next=tmp;
*rearptr=tmp;//rearptr指向的rear重新移到最后
}

int  SortAddNode(LNode dnx,Dxs *pdxs){//指针的指针
LNode tmp,p=*pdxs,pre=NULL;

while(p->next&&p->next->z>dnx->z)
{   pre=p;
	p=p->next;
}
if(p->z==dnx->z){//指数相等时,在原结点上操作就可以了,新结点可以不要,返回0用于通知
if(p->x+dnx->x==0){
if(pre==NULL){
	tmp=*pdxs;
*pdxs=(*pdxs)->next;
free(tmp);
}else{
tmp=pre->next;
pre->next=tmp->next;
free(tmp);
}
}else{
p->x= p->x+dnx->x; //p所zhi结点的系数改变
}
return 0;
}else{//插入新节点

dnx->next=p->next;
p->next=dnx;

}

return 1;
}


Dxs Add(Dxs a,Dxs b){
LNode A,B,front,rear,tmp;
A=a;
B=b;
front=rear=(LNode)malloc(sizeof(struct Node));
front->next=NULL;
while(A&&B){
  if(A->z>B->z){
     Addnode(A->x,A->z,&rear);
  	A=A->next;
  }else if(A->z<B->z){
     Addnode(B->x,B->z,&rear);
  	B=B->next;
  }else{
  	if(A->x+B->x==0){
     ;
  	}else{
      Addnode(A->x+B->x,A->z,&rear);
  	}
  	A=A->next;
  	B=B->next;
}



}	
while(A){
Addnode(A->x,A->z,&rear);
A=A->next;
}
while(B){
 Addnode(B->x,B->z,&rear);
B=B->next;
}
tmp=front;
front=front->next;
free(tmp);
return front;
}


LNode xmult(LNode A,LNode B){
LNode tmp=(LNode)malloc(sizeof(struct Node));
tmp->x=A->x*B->x;
tmp->z=A->z+B->z;
tmp->next=NULL;
return tmp;
}

Dxs mult(Dxs a,Dxs b){
LNode A,B,front,rear,tmp;
A=a;
B=b;
front=rear=(LNode)malloc(sizeof(struct Node));
front->next=NULL;
while(B){
tmp=xmult(A,B);
rear->next=tmp;
rear=tmp;
B=B->next;
}//A的第一项和B的每一项相乘,构造带头结点的初始化多项式
PrintDxs(front->next);
A=A->next;
B=b;
while(A){
	while(B){
		tmp=xmult(A,B);//两个单项相乘的结果,产生了新的乘积项结点
		if(!SortAddNode(tmp,&(front->next)))//直接在原结点上操作,可以释放乘积项结点结点
			free(tmp);
		B=B->next;
	}
	A=A->next;
	}
	//删除头结点
tmp=front;
front=front->next;
free(tmp);
return front;
}






int main(int argc, char const *argv[])
{Dxs dxsa=CreateDxs();
	PrintDxs(dxsa);
 Dxs dxsb=CreateDxs();
	PrintDxs(dxsb);
	printf("和为:");
PrintDxs(Add(dxsa,dxsb));
    printf("乘积为");
	/* code */
PrintDxs(mult(dxsa,dxsb));
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值