链表完成两个多项式的加减

内容:完成两个多项式的相加操作,已知有两个多项式Pm(x),Qm(x),设计算法实现Pm(x)+Qm(x)和Pm(x)-Qm(x)运算,而且对假发运算不重新开辟存储空间,要求用链式存储结构实现。

步骤:

  1. 算法分析

两个多项式相加算法的实现,首先是将两个多项式分别用链表进行存放。设置两个指针LAI和LBI分别式Pm(x)和Qm(x)的首结点移动,比较LAI和LBI所指结点的指数向,则可以分为下面三种情况进行处理:

  1. 若LAI->exp<LBI->exp,则LAI所指结点为多项式中的一项,LAI指针在原来的基础上向后移动一个位置。
  2. 若LAI->exp=LBI->exp,将对应项的系数相加,然后分两种情况处理:如果系数项的和为零,则释放LAI和LBI所指向的结点:如果系数项的和不为零,则修改LAI所指向结点的系数域,释放LBI结点。
  3. 若LAI->exp>LBI->exp,则LBI所指结点为多项式中的一项,LBI指针在原来的基础上向后移动一个位置。

两个多项式相减算法的实现,首先是将两个多项式分别用链表进行存放。设置两个指针LAI和LBI分别式Pm(x)和Qm(x)的首结点移动,比较LAI和LBI所指结点的指数向,则可以分为下面三种情况进行处理:

  1. 若LAI->exp<LBI->exp,则LAI所指结点为多项式中的一项,LAI指针在原来的基础上向后移动一个位置。
  2. 若LAI->exp=LBI->exp,将对应项的系数相减,然后分两种情况处理:如果系数项的和为零,则释放LAI和LBI所指向的结点:如果系数项的和不为零,则修改LAI所指向结点的系数域,释放LBI结点。
  3. 若LAI->exp>LBI->exp,则LBI所指结点为多项式中的一项,LBI指针在原来的基础上向后移动一个位置。
  1. 算法设计

程序中设计了五个函数:

  1. Init()用来初始化链表;
  2. CreatFromTail()用尾插法来创建链表;
  3. Polyadd()用来实现两个多项式相加算法;
  4. Polysub()用来实现两个多项式的相减;
  5. Print()用来输出多项式。
    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    typedef struct poly
    {
    	int exp; 	//指数 
    	int coef;	//系数 
    	struct poly *next;
    	
    }PNode,*PLinklist;
    /*链表初始化*/
    int Init(PLinklist *head)
    {
    	*head=(PLinklist)malloc(sizeof(PNode));
    	if(*head)
    	{
    		(*head)->next=NULL;
    		return 1;
    	}
    	else
    		return 0;		
    }
    /*尾插法创建链表*/ 
    int CreateFromTail(PLinklist*head)
    {
    	PNode *pTemp,*pHead;
    	int c;		//存放系数 
    	int exp;	//存放指数 
    	int i=1	;	//计数器 
    	pHead=*head;
    	scanf("%d,%d",&c,&exp);
    	while(c!=0)//系数为零的时候,结束输入
    	{
    		pTemp=(PLinklist)malloc(sizeof(PNode));
    		if(pTemp)
    		{
    			pTemp->exp=exp;		//接受指数 
    			pTemp->coef=c;		//接受系数 
    			pTemp->next=NULL;
    			pHead->next=pTemp;
    			pHead=pTemp;
    			scanf("%d,%d",&c,&exp);
    		 } 
    		 else
    		 return 0;
    	 } 
    	 return 1;
    }
    /*两个多项式相加*/ 
    void Polyadd(PLinklist LA,PLinklist LB)
    {
    	PNode*LAI=LA->next;		//指针LAI在多项式A中移动 
    	PNode*LBI=LB->next;		 
    	PNode*temp;				//指针temp保存要删除的结点 
    	int sum=0;				//保存系数的和 
    	/*比较LAI和LBI所指结点的指数项*/ 
    	while(LAI&&LBI)
    	{
    		if(LAI->exp<LBI->exp){		  
    			LA->next=LAI;
    			LA=LA->next;
    			LAI=LAI->next;
    		}
    		else if(LAI->exp==LBI->exp)
    		{
    			sum=LAI->coef+LBI->coef;
    			if(sum)
    			{
    				LAI->coef=sum;
    				LA->next=LAI;
    				LA=LA->next;
    				LAI=LAI->next;
    				temp=LBI;
    				LBI=LBI->next;
    				free(temp);
    				
    			}
    			else
    			{
    				temp=LAI;
    				LAI=LAI->next;
    				free(temp);
    				temp=LBI;
    				LBI=LBI->next;
    				free(temp);
    				
    			}
    		}
    		else
    		{
    			LA->next=LBI;
    			LA=LA->next;
    			LBI=LBI->next;
    		}
    		
    	}
    	if(LAI)
    		LA->next=LAI;
    	else
    		LA->next=LBI; 
    }
    /*两个多项式相减*/ 
    void Polysub(PLinklist LA,PLinklist LB)
    {
    	PNode*LAI=LA->next;		//指针LAI在多项式A中移动 
    	PNode*LBI=LB->next;		 
    	PNode*temp;				//指针temp保存要删除的结点 
    	int difference=0;				//保存系数的
    	/*比较LAI和LBI所指结点的指数项*/ 
    	while(LAI&&LBI)
    	{
    		if(LAI->exp<LBI->exp){		  
    			LA->next=LAI;
    			LA=LA->next;
    			LAI=LAI->next;
    		}
    		else if(LAI->exp==LBI->exp)
    		{
    			difference=LAI->coef-LBI->coef;
    			if(difference)
    			{
    				LAI->coef=difference;
    				LA->next=LAI;
    				LA=LA->next;
    				LAI=LAI->next;
    				temp=LBI;
    				LBI=LBI->next;
    				free(temp);
    				
    			}
    			else
    			{
    				temp=LAI;
    				LAI=LAI->next;
    				free(temp);
    				temp=LBI;
    				LBI=LBI->next;
    				free(temp);
    				
    			}
    		}
    		else
    		{
    			LA->next=LBI;
    			LA=LA->next;
    			LBI=LBI->next;
    		}
    		
    	}
    	if(LAI)
    		LA->next=LAI;
    	else
    		LA->next=LBI; 
    }
    void Print(PLinklist head)
    {
    	head=head->next;
    	while(head)
    	{
    		if(head->exp)
    			printf("(%dx^%d)",head->coef,head->exp);
    		else
    			printf("%d",head->coef);
    		if(head->next)
    			printf("+");
    		else
    			break;
    		head=head->next;
    	}
    }
    
    int main(void)
    {
    	PLinklist LA;
    	PLinklist LB;
    	Init(&LA);
    	Init(&LB);
    	printf("请输入第一个多项式的系数,指数,输入0,0结束输入\n");
    	CreateFromTail(&LA);
    	printf("请输入第二个多项式的系数,指数,输入0,0结束输入\n");
    	CreateFromTail(&LB);
    	Print(LA);
    	printf("\n");
    	Print(LB);
    	printf("\n");
    	
    	int i; 
    	
    	printf("(相加多项式请输入1、相减输入0)\n"); 
    	scanf("%d",&i);
    	
    	if(1==i){
    		Polyadd(LA,LB);
    		printf("两个多项式相加的结果:\n");
    		Print(LA);
    		printf("\n");
    	}
    	else if(0==i){
    		Polysub(LA,LB);
    		printf("两个多项式相减的结果:\n");
    		Print(LA);
    		printf("\n");
    	}
    	else 
    		printf("请输入正确的字符");
    	return 0;
    	
    }

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值