一元多项式相加的链式实现

本文介绍了如何使用链式结构动态创建并管理一元多项式,包括创建有序多项式、合并同类项、输出显示、相加及销毁多项式等操作。通过示例代码展示了具体的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include"PLOY.h"


#include<stdio.h>
#include<stdlib.h>
#include<assert.h>


//动态申请结点


NODE * alloc_node(int coef,int exp)
{
NODE * tmp = (NODE *)malloc(sizeof(NODE));
assert(tmp);
tmp ->coef = coef;
tmp ->exp = exp;
tmp->next = NULL;
return tmp;
}




//创建有序一元多项式


NODE *create_ploy()
{
NODE *phead = alloc_node(0,0);


int coef;
int exp;


NODE *tmp;
NODE *s;
NODE *p;


while(1)//同指数合并(未考虑)
{
printf("请输入多项式(输入0,0表示停止输入)\n");
scanf("%d,%d",&coef,&exp);
if (coef == 0 && exp == 0)
{
break;
}
if (coef == 0)
{
continue;
}


tmp = alloc_node(coef,exp);
p = phead;
s = phead;
while(p != NULL && p->exp <= tmp->exp)
{
s = p;
p = p->next;
}
tmp->next = p;
s->next = tmp;
}
return phead;
}


//一元多项式判空
bool is_empty(NODE *phead)
{
if (phead == NULL)
{
return false;
}
return phead->next == NULL;
}




//一元多项式合并同类项
bool create_final_ploy(NODE *phead)
{
if (phead == NULL || is_empty(phead))
{
return false;
}
NODE *r = phead;
NODE *p = phead->next;
NODE *s = phead->next;


while (p->next != NULL)
{
p = p->next;
if (p->exp == s->exp)
{
p->coef = p->coef + s->coef;
r->next = p;
free(s);
}
s = p;
}
return true;
}


//输出显示一元多项式
void show_ploy(NODE *phead)
{
NODE *p = phead->next;
while(p != NULL)
{
if (p->coef > 0)
{
printf(" +%dx^%d ",p->coef,p->exp);
}
else
{
printf(" %dx^%d ",p->coef,p->exp);
}
p = p->next;
}
printf("\n");
}




//一元多项式合并
NODE *add_ploy(NODE *pa, NODE *pb)
{
NODE *pc = alloc_node(0,0);


NODE *p = pa->next;
NODE *s = pb->next;
NODE *r = pc;


NODE *tmp;


while(p != NULL && s != NULL)
{
if (p->exp < s->exp)
{
tmp = alloc_node(p->coef,p->exp);
r->next = tmp;
r= tmp;
p = p->next;
}
else if(p->exp > s->exp)
{
tmp = alloc_node(s->coef,s->exp);
r->next = tmp;
r= tmp;
s = s->next;
}
else
{
tmp = alloc_node(p->coef+s->coef,p->exp);
r->next = tmp;
r= tmp;
p = p->next;
s = s->next;
}
}




while(p != NULL)
{
tmp = alloc_node(p->coef,p->exp);
r->next = tmp;
r= tmp;
p = p->next;
}


while(s != NULL)
{
tmp = alloc_node(s->coef,s->exp);
r->next = tmp;
r= tmp;
s = s->next;
}


return pc;
}




//销毁一元多项式
bool destory_ploy(NODE *phead,elem_type *coef,elem_type *exp)
{
if (phead == NULL)
{
return false;
}
NODE *p = phead;
while (p->next != NULL)
{
del_tail_ploy(phead,coef,exp);
}
free(phead);
return true;
}




//尾删一元多项式
bool del_tail_ploy(NODE *phead,elem_type *coef,elem_type *exp)
{
if (phead == NULL || is_empty(phead))
{
return false;
}
NODE *p = phead;
while (p->next->next != NULL)
{
p = p->next;
}
*coef = p->next->coef;
*exp = p->next->exp;
free(p->next);
p->next = NULL;
return true;
}
一元多项式相加通常是指在计算机科学中处理数学表达式时,将两个只有一个变量的一次或常数项组成的多项式相加的操作。在C语言中,可以使用链表作为数据结构来存储多项式的系数和指数,因为链表能够动态地添加、删除和访问元素。 首先,定义一个结构体`Term`表示一项(包括系数和指数),以及一个结构体`Polynomial`表示多项式,它包含一个指向`Term`头结点的指针: ```c typedef struct { int coefficient; int exponent; } Term; typedef struct { Term* head; int degree; // 最高指数 } Polynomial; ``` 接下来,你可以创建函数来操作多项式,例如合并两个多项式: ```c void addTerms(Term** terms1, int n1, Term** terms2, int n2, Polynomial* result) { if (n1 == 0) return memcpy(&result->head, terms2, sizeof(Term*) * n2); if (n2 == 0) return memcpy(&result->head, terms1, sizeof(Term*) * n1); Term* newHead = malloc(sizeof(Term)); newHead->coefficient = terms1[0]->coefficient + terms2[0]->coefficient; newHead->exponent = terms1[0]->exponent < terms2[0]->exponent ? terms1[0]->exponent : terms2[0]->exponent; result->head = newHead; for (int i = 1; i < n1 || i < n2; ++i) { if (i < n1 && (i >= n2 || terms1[i]->exponent > terms2[i]->exponent)) { newHead->next = terms1[i]; terms1[i] = NULL; } else if (i < n2 && terms2[i]->exponent > terms1[i]->exponent) { newHead->next = terms2[i]; terms2[i] = NULL; } } result->degree = newHead->exponent; } ``` 这个函数会遍历两个链表,找到当前最高指数,并更新结果多项式的头结点。如果遇到相同的指数,则取它们的系数之和。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值