实现两个一元多项式加法

实现两个多项式加法

题目计算两个一元多项式之和

例子:

f ( x ) = 2 x 3 + 9 x 6 + 2 x 8 f(x)= 2x^3 + 9 x^6+2x^8 f(x)=2x3+9x6+2x8

+
f ( x ) = 7 x 3 − 3 x 6 − 2 x 8 f(x)= 7x^3 - 3 x^6-2x^8 f(x)=7x33x62x8

=

f ( x ) = 9 x 3 − 6 x 6 f(x)= 9x^3 - 6 x^6 f(x)=9x36x6

代码逻辑

  1. 收集两个链表的次方和系数
  2. 依据次方来合并两个链表
  3. 遍历输出合并结果

数据结构

数据结构是线性表的链表

typedef struct{
    
    
	int cifang;//次方 
	float xishu;//系数 
} Elemtype;
typedef struct LNode{
    
    
	Elemtype data;
	struct LNode *next;
}LNode;//定义链表结点
 
typedef int Statu;

typedef struct {
    
    
	LNode  *head;
	int lenth;//记录几个元素 
}LinkList;//定义链序表类型

链表结构:

在这里插入图片描述

合并同类项

按照次方从小到大的顺序插入项
插入项后,多项式仍然是按照次方从小到大排列,特别处理,合并同类项

把新来的元素找到合适的位置,如果有同类项,则直接合并;如果没有就把他作为新元素插入已经找到的合适位置

Statu PolyInsert_Link(LinkList *mylist, Elemtype elem){
    
    //按照次方从小到大的顺序插入项
	//插入项后,多项式仍然是按照次方从小到大排列,特别处理,合并同类项
	int i = 1;
	Statu flag;
	LNode *pre = mylist->head, *cur = pre->next;
	for(; cur != NULL && cur->data.cifang < elem.cifang;){
    
    
		i++;
		pre = pre->next;
		cur = cur->next;
	}	
	if(cur != NULL&&cur->data.cifang == elem.cifang){
    
    
		cur->data.xishu += elem.xishu;
		return OK;
	}
	else{
    
    
		flag=Insert_LinkList(mylist, i, elem);//把elem插入到mylist 
		return flag;
	}
}

这是插入函数,需要合适的位置即(int i)和要插入的元素(Elemtype elem)

 Statu Insert_LinkList(LinkList *mylist, int i, Elemtype elem){
    
    //在顺序表第i个位置(从1开始数)插入元素
	//请填入代码。
	int j;
	LNode *pre = mylist->head, *cur = NULL;
	cur = (LNode *)malloc(sizeof(LNode));
	if(!cur){
    
    
		return ERROR;
	}
	cur->data.cifang = elem.cifang;
	cur->data.xishu = elem.xishu;
	if(i<0 || i>mylist->lenth+1){
    
    
		return ERROR;
	}
	for(j = 1; j<i; j++){
    
    
		pre = pre->next;
	}
	cur->next = pre->next;
	pre->next = cur;
	mylist->lenth++;
	return OK;
 
}

合并两个式子

使用GetElem_LinkList(mypoly2, i, &elem)函数从另一个多项式B中获得一个元素
再将获得的元素使用合并同类项的方法PolyInsert_Link(mypoly1, elem);将元素按照从小到大的顺序插入到多项式A中

void Add_Poly_Link(LinkList *mypoly1,LinkList mypoly2){
    
    
	//将多项式2中的项依次插入多项式1中
	int i;
	Elemtype elem;
	for(i = 1; i <= mypoly2.lenth; i++){
    
    
		GetElem_LinkList(mypoly2, i, &elem);
		PolyInsert_Link(mypoly1, elem);
	}	
}

遍历B中每一个元素,将其合并到A中

主函数逻辑

  1. 创建两个空链表,用户输入信息后打印两个链表
  2. 将两个链表相加合并为一个链表
  3. 打印合并后的链表
  4. 销毁两个链表
int main() {
    
    
	LinkList polyA, polyB;
 
	Create_Poly_LinkList(&polyA);
	Create_Poly_LinkList(&polyB);
	
	Show_Poly_Link(polyA);
	printf("\n+\n");
	Show_Poly_Link(polyB);
	Add_Poly_Link(&polyA,polyB);
	printf("\n=\n");
	Show_Poly_Link(polyA);
	
	Destroy_LinkList(&polyA);
	Destroy_LinkList(&polyB);
	
	return 0;
}

运行结果

在这里插入图片描述

代码

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef struct{
    
    
	int cifang;//次方 
	float xishu;//系数 
} Elemtype;
typedef struct LNode{
    
    
	Elemtype data;
	struct LNode *next;
}LNode;//定义链表结点
 
typedef int Statu;

typedef struct {
    
    
	LNode  *head;
	int lenth;//记录几个元素 
}LinkList;//定义链序表类型
 
Statu Init_LinkList(LinkList * mylist){
    
    //顺序表初始化
 	mylist->head = (LNode  *)malloc(sizeof(LNode));//头结点
 
	if(!mylist->head){
    
    
		return ERROR;
	}
	mylist->head->next = NULL;
	mylist->lenth = 0; 
	return OK;
}
 
void Destroy_LinkList(LinkList * mylist){
    
    //销毁顺序表
	LNode * p = NULL;
	while(mylist->head != NULL){
    
    
		p = mylist->head;
		mylist->head = p->next;
		free(p);
	}
	mylist->lenth = 0;
}
 Statu Insert_LinkList(LinkList *mylist, int i, Elemtype elem){
    
    //在顺序表第i个位置(从1开始数)插入元素
	//请填入代码。
	int j;
	LNode *pre = mylist->head, *cur = NULL;
	cur = (LNode *)malloc(sizeof(LNode));
	if(!cur){
    
    
		return ERROR;
	}
	cur->data.cifang = elem.cifang;
	cur->data.xishu = elem.xishu;
	if(i<0 || i>mylist->lenth+1){
    
    
		return ERROR;
	}
	for(j = 1; j<i; j++){
    
    
		pre = pre->next;
	}
	cur->next = pre->next;
	pre->next = cur;
	mylist->lenth++;
	return OK;
 
}
Statu Delete_LlinkList(LinkList *mylist, int i, Elemtype *elem){
    
    //删除链表第i个结点,并把值传给elem
	//请填入代码
	int j;
	LNode *pre = mylist->head, *cur = NULL;
	if(i < 0 || i>mylist->lenth){
    
    
		return ERROR;
	}
	for(j = 1; j<i; j++){
    
    
		pre = pre->next;
	}
	cur = pre->next;
	pre->next = cur->next;
	elem->cifang = cur->data.cifang;
	elem->xishu = cur->data.xishu;
	free(cur);
	mylist->lenth--;
	return OK;
}
 
Statu GetElem_LinkList(LinkList mylist, int i, Elemtype * elem){
    
    
	int j;
	LNode *cur = mylist.head;
	if(i>0&&i<=mylist.lenth){
    
    
 
		for(j = 1; j<=i; j++){
    
     
			cur = cur->next;
		}
 
		(*elem).cifang = cur->data.cifang;
		(*elem).xishu  = cur->data.xishu;
		return OK;
	}
	else {
    
    
		return ERROR;
	}
}
Statu Init_Poly_LinkList(LinkList *mylist){
    
    
	if(!Init_LinkList(mylist)){
    
    
		return ERROR;
	}
	return OK;
}
 
Statu PolyInsert_Link(LinkList *mylist, Elemtype elem){
    
    //按照次方从小到大的顺序插入项
	//插入项后,多项式仍然是按照次方从小到大排列,特别处理,合并同类项
	int i = 1;
	Statu flag;
	LNode *pre = mylist->head, *cur = pre->next;
	for(; cur != NULL && cur->data.cifang < elem.cifang;){
    
    
		i++;
		pre = pre->next;
		cur = cur->next;
	}	
	if(cur != NULL&&cur->data.cifang == elem.cifang){
    
    
		cur->data.xishu += elem.xishu;
		return OK;
	}
	else{
    
    
		flag=Insert_LinkList(mylist, i, elem);//把elem插入到mylist 
		return flag;
	}
}
 
Statu Create_Poly_LinkList(LinkList *mylist){
    
    
	int n = 0, i;
	int cifang;
	float xishu;
	Statu flag;
	Elemtype e;
	flag = Init_Poly_LinkList(mylist);
	if(flag){
    
    
		printf("请输入多项式的项数n = ");
		scanf("%d", &n);
		for(i = 0; i < n; i++){
    
    
			printf("第%5d项的幂次是", i+1);
			scanf("%d", &cifang);
			printf("第%5d项的系数是", i+1);
			scanf("%f", &xishu);
			e.cifang = cifang;
			e.xishu = xishu;
			PolyInsert_Link(mylist, e);
		}
		return OK;
	}
	return ERROR;
}
 
void Add_Poly_Link(LinkList *mypoly1,LinkList mypoly2){
    
    
	//请填入代码。提示,将多项式2中的项依次插入多项式1中
	int i;
	Elemtype elem;
	for(i = 1; i <= mypoly2.lenth; i++){
    
    
		GetElem_LinkList(mypoly2, i, &elem);
		PolyInsert_Link(mypoly1, elem);
	}	
}
void Show_Poly_Link(LinkList mypoly){
    
    //打印多项式
	int flag = 0;
	LNode * cur = mypoly.head->next;
	printf("f(x) = ");
	if(mypoly.lenth == 0){
    
    
		printf("0");
	}
	else{
    
    
		while(cur){
    
    
			if(flag != 0){
    
    
				printf(" + ");
			}
			else{
    
    
				flag++;
			}
			printf("%0.2fx^%d", cur->data.xishu,cur->data.cifang);
			cur = cur->next;}}
				printf("\n");
}
int main() {
    
    
	LinkList polyA, polyB;
 
	Create_Poly_LinkList(&polyA);
	Create_Poly_LinkList(&polyB);
	
	Show_Poly_Link(polyA);
	printf("\n+\n");
	Show_Poly_Link(polyB);
	Add_Poly_Link(&polyA,polyB);
	printf("\n=\n");
	Show_Poly_Link(polyA);
	
	Destroy_LinkList(&polyA);
	Destroy_LinkList(&polyB);
	
	return 0;
}

おすすめ

転載: blog.csdn.net/Lazy_Goat/article/details/117440953