实现两个多项式加法
题目计算两个一元多项式之和
例子:
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)=7x3−3x6−2x8
=
f ( x ) = 9 x 3 − 6 x 6 f(x)= 9x^3 - 6 x^6 f(x)=9x3−6x6
代码逻辑
- 收集两个链表的次方和系数
- 依据次方来合并两个链表
- 遍历输出合并结果
数据结构
数据结构是线性表的链表
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中
主函数逻辑
- 创建两个空链表,用户输入信息后打印两个链表
- 将两个链表相加合并为一个链表
- 打印合并后的链表
- 销毁两个链表
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;
}