用单向链表计算多项式的加法

如果用数列表示多项式,可能会造成很大的空间浪费,我们这里利用单向链表表示多项式,并进行加法运算,其中多项式采用不带头结点的单向链表,按照指数递减的顺序排列各项,定义的链表结构是

struct PolyNode{
	int coef;
	int expon;
	struct PolyNode *link;
};

typedef struct PolyNode *Polynomial;
算法思路:

1.P1->expon==P2->expon:系数相加,若结果不为0,则作为结果多项式对应项的系数。同事,P1和P2都分别指向下一项;

2.P1->expon>P2->expon:将P1的当前项存入结果多项式,并使P1指向下一项

3..P1->expon<P2->expon:将P2的当前项存入结果多项式,并使P2指向下一项

当某一多项式处理完时,将另一个多项式的所有节点依次复制到结果多项式中去


具体流程如图上所示

其中最主要的函数如下图



值得注意的是Attach函数,传递的是指针


完整的代码

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

struct PolyNode{
	int coef;
	int expon;
	struct PolyNode *link;
};

typedef struct PolyNode *Polynomial;

//读入多项式
Polynomial Read();
//输出多项式
void Print(Polynomial P);
//多项式相加
Polynomial PolyAdd(Polynomial P1,Polynomial P2);
void Attach(int c,int e,Polynomial *pRear);
int Compare(int a, int b);
    
int main()    
{    
    Polynomial P1=Read();
	Polynomial P2=Read();
	Print(P1);
    Print(P2);
	Polynomial P=PolyAdd(P1,P2);
	Print(P);
    
    return 0;    
}


//读入多项式
Polynomial Read()    
{    
  int coef = 0;  
  int expon = 0;  
  Polynomial P = NULL;  
  PolyNode *last = NULL;
  PolyNode *temp=NULL;
    
  P = ( Polynomial )malloc( sizeof( struct PolyNode ) );//建立头结点  
  P->link = NULL;  
  last = P;  
    
  scanf( "%d",&coef );
  scanf( "%d",&expon );
  while(expon>=0){    
    PolyNode *node = ( PolyNode *)malloc( sizeof( struct PolyNode ) );  
	node->coef=coef; 
    node->expon = expon;  
    last->link = node;  
    last = node;  
	scanf( "%d",&coef );  
	scanf( "%d",&expon );
  }

  last->link=NULL;

  temp=P;
  P=P->link;
  free(temp);
  return P;  
}

//输出多项式
void Print(Polynomial P){
	Polynomial Q=P;
	while(Q){
		printf("系数%d 指数%d   ",Q->coef,Q->expon);
		Q=Q->link;
	}
	printf("\n");
}

//多项式相加
Polynomial PolyAdd(Polynomial P1,Polynomial P2){
	Polynomial front,rear,temp;
	int sum;
	rear=(Polynomial)malloc(sizeof(struct PolyNode));
	front=rear;
	while(P1&&P2){
		switch(Compare(P1->expon,P2->expon)){
		case 1:
			Attach(P1->coef,P1->expon,&rear);
			P1=P1->link;
			break;
		case -1:
		    Attach(P2->coef,P2->expon,&rear);
		    P2=P2->link;
			break;
		case 0:
			sum=P1->coef+P2->coef;
			if(sum)Attach(sum,P1->expon,&rear);
			P1=P1->link;
			P2=P2->link;
			break;
		}
	}

	for(;P1;P1=P1->link)Attach(P1->coef,P1->expon,&rear);
	for(;P2;P2=P2->link)Attach(P2->coef,P2->expon,&rear);
	rear->link=NULL;
	temp=front;
	front=front->link;
	free(temp);
	return front;
}

void Attach(int c,int e,Polynomial *pRear){
	Polynomial P;
	P=(Polynomial)malloc(sizeof(struct PolyNode));
	P->coef=c;
	P->expon=e;
	P->link=NULL;
	(*pRear)->link=P;
	*pRear=P;
}

int Compare(int a, int b){
	if(a>b)return 1;
	else if(a<b) return -1;
	else return 0;
}
运行的结果是

看起来是没错的,嘿嘿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

拉风小宇

请我喝个咖啡呗

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

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

打赏作者

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

抵扣说明:

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

余额充值