内容: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;
}
加法的输出结果:
减法的输出结果: