单链表的应用:多项式的相加相减

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

             2.完成两个多项式相减的操作。已知有两个多项式P(x)和Q(x),设计算法实现P(x)-Q(x)运算,而且对减法运算不重新开辟空间,要求用链式存储结构实现。

算法分析:

两个多项式相加的算法:首先将两个多项式分别用链表存放。设置两个指针A1和B1分别从多项式P(x)和Q(x)的首结点移动,比较A1和B1所指结点的指数项exp,分以下三种情况处理:

①若A1->exp < B1->exp,则A1所指结点为为多项式的一项,A1指针在原来基础上向后移动一个位置。

②若A1->exp = B1->exp,则将对应的系数相加,如果系数和为零,则释放A1和B1所指向的结点;如果系数和不为零,则修改A1所指向结点的系数域,释放B1所指向的结点。

③若A1->exp > B1->exp,则B1所指结点为多项式的一项,B1指针在原来的基础上向后移动一个位置。

       结点类型:

coef

exp

next

两个多项式相减的算法与之相同。

概要设计(使用的函数)

函数Init()

初始化空链表

函数CreatFromTail()

尾插法创建链表

函数Add() ,Sub()

实现多项式相加,相减

函数Print()

输出多项式

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
 typedef struct node
 {
 	int exp;
 	int coef;
 	struct node *next;
 }LNode,*LinkList;
 int Init(LinkList *head)//链表初始化 
 {
 	*head=(LinkList)malloc(sizeof(LNode));
 	if(*head)
 	{
 		(*head)->next=NULL;
 		return 1;
	 }
	else
	  return 0;
 }
 int CreatFromTail(LinkList *head)//尾插法创建链表 
 {
 	LNode *Temp,*Head;
 	int c;
 	int exp;
 	int i=1;
 	Head=*head;
 	scanf("%d,%d",&c,&exp);
 	while(c!=0)
 	{
 		Temp=(LinkList)malloc(sizeof(LNode));
 		if(Temp)
 		{
 			Temp->exp=exp;
 			Temp->coef=c;
 			Temp->next=NULL;
 			Head->next=Temp;
 			Head=Temp;
 			scanf("%d,%d",&c,&exp);
		 }
		 else
		   return 0;
	 }
	 return 1;
 }
 void Add(LinkList A,LinkList B)//加法 
 {
 	LNode *A1=A->next;
 	LNode *B1=B->next;
 	LNode *temp;
 	int sum=0;
 	while(A1&&B1)
 	{
 		if(A1->exp<B1->exp)//A1所指结点指数小于B1所指结点,将A1所指结点存入A并向后移动 
 		{
 			A->next=A1;
 			A=A->next;
 			A1=A1->next;
		 }
		else 
	if(A1->exp==B1->exp)//指数相同系数相加 
		 {
		 	sum=A1->coef+B1->coef;
		 	if(sum)//系数不为零,将结果存入A中,删除结点B1 
		 	{
		 		A1->coef=sum;
		 		A->next=A1;
		 		A=A->next;
		 		A1=A1->next;
		 		temp=B1;
				B1=B1->next;
				free(temp); 
			 }
			 else//系数为零,删除两个结点 
			 {
			 	temp=A1;
			 	A1=A1->next;
			 	free(temp);
			 	temp=B1;
			 	B1=B1->next;
			 	free(temp);
			 }
		 }
	else //A1所指结点指数大于B1所指结点,将B1所指结点存入A并B1向后移动 
		 {
		 	A->next=B1;
		 	A=A->next;
		 	B1=B1->next;
		 }
	 }
	 if(A1)//将剩余结点存入A中 
	   A->next=A1;
	 else
	   A->next=B1;
  } 
  
  void print(LinkList 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;
	  }
   } 
   void main()
   {
   	LinkList A;
   	LinkList B;
   	Init(&A);
   	Init(&B);
   	printf("输入第一个多项式的系数,指数例如(10,2) 输入0,0结束输入");
	CreatFromTail(&A);
	printf("输入第二个多项式的系数,指数例如(10,2) 输入0,0结束输入"); 
	CreatFromTail(&B);
	print(A);
	printf("\n");
	print(B);
	printf("\n");
	Add(A,B);
	printf("两个多项式相加的结果为:\n");
	print(A);
	printf("\n"); 
	Sub(A,B);
	printf("两个多项式相减的结果为:\n");
	print(A);
	printf("\n"); 
   }

减法的操作:

void Sub(LinkList A,LinkList B)//减法
  {
  	LNode *A1=A->next;
  	LNode *B1=B->next;
  	LNode *temp;
  	int sum=0;
  	while(A1&&B1)
  	{
  		if(A1->exp<B1->exp)
  		{
  			A->next=A1;
  			A=A->next;
  			A1=A1->next;
		  }
		  else if(A1->exp==B1->exp)
		  {
		  	sum=A1->coef-B1->coef;
		  	if(sum)
		  	{
		  		A1->coef=sum;
			  	A->next=A1;
			  	A=A->next;
			  	A1=A1->next;
			  	temp=B1;
			  	B1=B1->next;
			  	free(temp);
		  		
			  }
			  else
			  {
			    temp=A1;
		  		A1=A1->next;
		  		free(temp);
		  		temp=B1;
		  		B1=B1->next;
		  		free(temp);
			  }
		  }
		  else
		  {
		  	A->next=B1;
		  	A=A->next;
		  	B1=B1->next;
		  }
	  }
  	if(A1)
  	A->next=A1;
  	else
  	A->next=B1;
   } 

加法的输出结果:

 减法的输出结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值