/*
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;
}
一元多项式加法和乘法-数据结构学习笔记2.3-2.4
最新推荐文章于 2023-03-31 09:27:42 发布