0x00数据结构——C语言实现(多项式)

0x00数据结构——C语言实现(多项式)

/*filename:polynomial*/
#ifndef POLYNOMIAL
#define POLYNOMIAL
//一元多项式的表示
//Pn(x)=p0 + p1*x + p2*x^2 + ... + pn*x^n
/*
基本操作:
创建一个有m项系数和指数的一元多项式p
销毁一元多项式p
打印输出
返回项数
完成一元多项式的相加
完成一元多项式的相减
完成一元多项式的相乘
*/
struct term;
typedef struct term term;
typedef term *polyn;
typedef enum {
false = 0,
true
} BOOL;
//初始化一个一元多项式p
polyn init_polynomial(void);
//在多项式p中插入一个系数为c,指数为e的项
polyn insert_term(int c, int e, polyn p);
/*
//创建一个有m项系数和指数的一元多项式p
polyn creat_polynomial(int m);
*/
//销毁一元多项式p
BOOL destroy_polyn(polyn p);
//打印输出
void print_polyn(polyn p);
//返回项数
int polyn_length(polyn p);
//完成一元多项式的相加
polyn add_polyn(polyn p1, polyn p2);
//完成一元多项式的相减
polyn sub_polyn(polyn p1, polyn p2);
//完成一元多项式的相乘
polyn mutiply_polyn(polyn p1, polyn p2);
#endif
#include <stdio.h>
#include <stdlib.h>
#include "polynomial.h"
/*
typedef struct term{
float coef; //系数
int expn; //指数
struct term *next;
} term, *polyn;
*/
struct term {
float coef; //系数
int expn; //指数
struct term *next;
};
//初始化一个一元多项式p
polyn init_polynomial(void)
{
term *head = NULL;
head = (term*)malloc(sizeof(term));
if(head!=NULL){
head->coef = 0;
head->expn = -1;
head->next = NULL;
}
return head;
}
//在多项式p中加入一个系数为c,指数为e的项
polyn insert_term(int c, int e, polyn p)
{
if(c==0) {
return p;
} else {
term *tmp = p->next, *pre = p;
while(tmp != NULL && tmp->expn != e && tmp->expn < e) {
pre = tmp;
tmp = tmp->next;
}
if(tmp == NULL) {
pre->next = (term*)malloc(sizeof(term));
if(pre->next != NULL) {
pre->next->coef = c;
pre->next->expn = e;
pre->next->next = NULL;
}
} else if(tmp->expn == e) {
tmp->coef += c;
if(tmp->coef == 0) {
pre->next = tmp->next;
free(tmp);
}
} else if(tmp->expn > e) {
pre->next = (term*)malloc(sizeof(term));
if(pre->next != NULL) {
pre->next->coef = c;
pre->next->expn = e;
pre->next->next = tmp;
}
}
}
return p;
}
/*
//创建一个有m项系数和指数的一元多项式p,带头节点
polyn creat_polynomial(int m)
{
term *head = NULL, *tmp = NULL, *tmp_p = NULL;
tmp = (term*)malloc(sizeof(term));
tmp->coef = 0;
tmp->expn = -1;
tmp->next = NULL;
head = tmp;
while(m){
tmp_p = (term *)malloc(sizeof(term));
tmp_p->next = NULL;
tmp->next = tmp_p;
tmp = tmp_p;
m--;
}
return head;
}
*/
//销毁一元多项式p
BOOL destroy_polyn(polyn p)
{
term *tmp;
p = p->next;
while(p != NULL){
tmp = p;
p = p->next;
free(tmp);
tmp = NULL;
}
return true;
}
//打印输出
void print_polyn(polyn p)
{
p = p->next;
if(p!=NULL) {
if(p->expn == 0){//考虑第一项
printf("%g", p->coef);
p = p->next;
if(p!=NULL){
if(p->expn == 1){//考虑第二项
p->coef>0? printf("+%gX", p->coef):printf("%gX", p->coef);
} else {
p->coef>0?printf("+%gX^%d", p->coef, p->expn):printf("%gX^%d", p->coef, p->expn);
}
p = p->next;
}
} else if(p->expn == 1){//考虑第一项
if(p->coef != 1) {
printf("%gX", p->coef);
} else {
printf("X");
}
p = p->next;
} else if(p->expn > 1){
if(p->coef != 1) {
printf("%gX^%d", p->coef, p->expn);
} else {
printf("X^%d", p->expn);
}
p = p->next;
}
while(p!=NULL){
p->coef>0?printf("+%gX^%d", p->coef, p->expn):printf("%gX^%d", p->coef, p->expn);
p = p->next;
}
}
printf("\n");
}
//返回项数
int polyn_length(polyn p)
{
int n = 0;
while(p->next != NULL){
n++;
p = p->next;
}
return n;
}
//完成一元多项式的相加
polyn add_polyn(polyn p1, polyn p2)
{
term *tmp = p1, *tmp1 = p1->next, *tmp2 = p2->next;
while(tmp1!=NULL && tmp2!=NULL){
//指数相等的情况
if(tmp1->expn == tmp2->expn){
tmp1->coef += tmp2->coef;
if(tmp1->coef == 0){
p1->next = tmp1->next;
p2->next = tmp2->next;
free(tmp1);
free(tmp2);
//相加为0则物理删除该项;
} else {
p1 = p1->next;
p2 = p2->next;
}
tmp1 = p1->next;
tmp2 = p2->next;
} else if(tmp1->expn < tmp2->expn){
//指数1小于指数2,p1向后比较
p1 = p1->next;
tmp1 = p1->next;
} else if(tmp2->expn < tmp1->expn){
//指数1大于指数2,将指数2项插到指数1前面
//逻辑删除p2中指数2对应项
p2->next = tmp2->next;
//插出入到p1中指数1对应项前面
tmp2->next = tmp1;
p1->next = tmp2;
//指针移动
p1 = p1->next;
tmp2 = p2->next;
}
}
if(tmp1 == NULL){
p1->next = tmp2;
}
free(p2);
p2 = NULL;
return tmp;
}
//完成一元多项式的相减
polyn sub_polyn(polyn p1, polyn p2)
{
term *tmp = p1, *tmp1 = p1->next, *tmp2 = p2->next;
while(tmp1!=NULL && tmp2!=NULL){
//指数相等的情况
if(tmp1->expn == tmp2->expn){
tmp1->coef -= tmp2->coef;
if(tmp1->coef == 0){
p1->next = tmp1->next;
p2->next = tmp2->next;
free(tmp1);
free(tmp2);
//相减为0则物理删除该项;
} else {
p1 = p1->next;
p2 = p2->next;
}
tmp1 = p1->next;
tmp2 = p2->next;
} else if(tmp1->expn < tmp2->expn){
//指数1小于指数2,p1向后比较
p1 = p1->next;
tmp1 = p1->next;
} else if(tmp2->expn < tmp1->expn){
//指数1大于指数2,将指数2项插到指数1前面
//逻辑删除p2中指数2对应项
tmp2->coef *= -1;
p2->next = tmp2->next;
//插出入到p1中指数1对应项前面
tmp2->next = tmp1;
p1->next = tmp2;
//指针移动
p1 = p1->next;
tmp2 = p2->next;
}
}
if(tmp1 == NULL){
p1->next = tmp2;
}
free(p2);
p2 = NULL;
return tmp;
}
//完成一元多项式的相乘
polyn mutiply_polyn(polyn p1, polyn p2)
{
polyn tmp_res = (polyn)malloc(sizeof(term));
tmp_res->next = NULL;
term *cur1 = p1->next, *cur2 = p2->next;
while(cur1!=NULL){
polyn tmp_p2 = (polyn)malloc(sizeof(term));
term *cur_p2 = tmp_p2;
cur2 = p2->next;
while(cur2!=NULL){
cur_p2->next = (term *)malloc(sizeof(term));
cur_p2 = cur_p2->next;
cur_p2->coef = cur1->coef * cur2->coef;
cur_p2->expn = cur1->expn + cur2->expn;
cur2 = cur2->next;
}
cur_p2->next = NULL;
//print_polyn(tmp_p2);
if(tmp_res->next == NULL){
free(tmp_res);
tmp_res = tmp_p2;
} else{
add_polyn(tmp_res, tmp_p2);
}
//print_polyn(tmp_res);
cur1 = cur1->next;
//free(p1->next);
//p1->next = cur1;
}
destroy_polyn(p1);
destroy_polyn(p2);
p1->next = tmp_res->next;
return tmp_res;
}
posted @   main_c  阅读(397)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示