线性表的应用——多项式的计算
来源:互联网 发布:matlab微电网优化调度 编辑:程序博客网 时间:2024/04/28 07:22
应用顺序表计算多项式,把多项式存储在顺序表里,顺序表的下标对应多项式的系数
#include <stdio.h>#include <stdlib.h>#define MAX_SIZE 100#define OK 1#define ERROR -1typedef int Status;typedef int Elemtype;
多项式的结构体
typedef struct polynomial{ float coef;//系数 int expn;//指数}Polyn;
顺序表的的结构体
typedef struct SqList{ Polyn *array; int length;}SqList;
顺序线性表初始化
Status Init_SqList(SqList *L){ L->array=(Polyn *)malloc(MAX_SIZE * sizeof(Polyn)) ; if(!L->array) return ERROR; else { L->length = 0; return OK; }}
创建一个多项式
void CreatPolyn(SqList *L){ int i;//循环变量 int m;//多项式的项数 SqList *q; q = L; printf("请输入多项式数:"); scanf("%d", &m); if(m <= 0 || m > MAX_SIZE) { printf("Item unsecification!\n"); } for(i = 0; i < m; i++) { float c;//多项式的系数 printf("请输入%d次项的系数:", i); scanf("%f", &c); q->array[i].coef = c; q->array[i].expn = i;//顺序表达下表和指数是相同的,所以把下标赋给指数 q->length++; } if(q->length == m) printf("创建成功\n");}
求多项式的项数
Status PolynLength(SqList *L){ int length = 0; int i; SqList *p; p = L; for(i = 0; i < p->length; i++) { length++; } return length;}
多项式相加
Status AddPolyn(SqList *L1, SqList *L2, SqList *L3){ //L1+L2=L3 int i;//循环变量 SqList *p; SqList *q; SqList *r; p = L1; q = L2; r = L3; //若L1和L2不一样长,先把前面的部分相加 for(i = 0; i < p->length && i < q->length; i++) { r->array[i].coef = p->array[i].coef + q->array[i].coef; r->array[i].expn = p->array[i].expn; r->length++; } //把长的直接加在L3后面 if((i == p->length) && (i != q->length)) { int j; for(j = i; j < q->length; j++) { r->array[j].coef = q->array[j].coef; r->array[j].expn = q->array[j].expn; r->length++; } } else if((i != p->length) && (i == q->length)) { int j; for(j = i; j < p->length; j++) { r->array[j].coef = p->array[j].coef; r->array[j].expn = p->array[j].expn; r->length++; } } printf("项数为:%d\n", r->length); return OK;}
两个多项式(L1-L2)相减
Status SubractPolyn(SqList *L1, SqList *L2, SqList *L3){ int i;//循环变量 SqList *p; SqList *q; SqList *r; p = L1; q = L2; r = L3; //若L1和L2不一样长,先把前面的部分相减 for(i = 0; i < p->length && i < q->length; i++) { r->array[i].coef = p->array[i].coef - q->array[i].coef; r->array[i].expn = p->array[i].expn; r->length++; } //两个多项式不一样长 //若被减数多项式长,则把剩下的直接加在L3后面 //若减数多项式长,则把剩下的变成负的加在L3后面 if((i == p->length) && (i != q->length)) { int j; for(j = i; j < q->length; j++) { r->array[j].coef = -(q->array[j].coef); r->array[j].expn = q->array[j].expn; r->length++; } } else if((i != p->length) && (i == q->length)) { int j; for(j = i; j < p->length; j++) { r->array[j].coef = p->array[j].coef; r->array[j].expn = p->array[j].expn; r->length++; } } return OK;}
两个多项式相乘
Status MultiplyPolyn(SqList *L1, SqList *L2, SqList *L4){ //L1*L2 = L4 int i; int j; SqList *p; SqList *q; SqList *r; p = L1; q = L2; //根据L1和L2相乘后的项数给L4申请空间 //若L1有n项 L2有m项 则L4有(n-1)+(m-1)+ 1项 L4->array=(Polyn *)malloc(((p->length - 1) + (q->length - 1) + 1) * sizeof(Polyn)) ; if(!L4->array) printf("初始化失败!\n"); else { //L4的长度为:(n-1)+(m-1)+ 1 L4->length = (p->length - 1) + (q->length - 1) + 1; printf("初始化成功!\n"); printf("长度为:%d\n", L4->length); } r = L4; //先把L4所有的系数和指数赋为0 for(i = 0; i < L4->length; i++) { r->array[i].coef = 0; r->array[i].expn = 0; } //系数相乘,指数相加,在和计算出来的位置上原有的系数相加 for(i = 0; i < p->length; i++) { for(j = 0; j < q->length; j++) { int a = p->array[i].expn + q->array[j].expn; r->array[a].expn = a; r->array[a].coef = p->array[i].coef * q->array[j].coef + r->array[a].coef; } } return OK;}
打印多项式
void OutPut(SqList *L)//打印多项式{ SqList *q; int i; int j; q = L; printf("P = "); for(i = 0; i < q->length; i++) { if(i == 0)//若是常数项 { if(!q->array[i].coef == 0)//不为0,打印 { printf("%f", q->array[i].coef); for(j = i + 1; j < q->length; j++) { if((q->array[j].coef != 0) && (q->array[j].coef > 0)) { printf(" + "); break; } else if((q->array[j].coef != 0) && (q->array[j].coef < 0)) { printf(" "); break; } } } } else//若不是常数项 { if(!q->array[i].coef == 0)//系数不为0 打印 { printf("%fX^", q->array[i].coef); printf("%d", q->array[i].expn); for(j = i + 1; j < q->length; j++) { if((q->array[j].coef != 0) && (q->array[j].coef > 0)) { printf(" + "); break; } else if((q->array[j].coef != 0) && (q->array[j].coef < 0)) { printf(" "); break; } } } } } printf("\n");}
主方法
int main(){ int i; int res1 = 0;//L1初始化返回结果 int res2 = 0;//L2初始化返回结果 int res3 = 0;//L3初始化返回结果 int res4 = 0;//L4初始化返回结果 int res5 = 0;//L1+L2返回的结果 int res6 = 0;//L1-L2的结果 int res7 = 0;//L1*L2的结果 SqList L1;//第一个多项式 SqList L2;//第二个多项式 SqList L3;//相加后的多项式 SqList L4;//相减后的多项式 SqList L5;//L1*L2后的多项式 res1 = Init_SqList(&L1);//初始化L1 res2 = Init_SqList(&L2);//初始化L2 res3 = Init_SqList(&L3);//初始化L3 res4 = Init_SqList(&L4);//初始化L4 printf("%4d%4d%4d%4d\n", res1, res2, res3, res4); CreatPolyn(&L1);//创建多项式L1 OutPut(&L1);//打印多项式L1 printf("--------------------------------\n"); CreatPolyn(&L2);//创建多项式L2 OutPut(&L2);//打印多项式L2 printf("*******************************\n"); printf("L1为:"); OutPut(&L1); printf("\n"); printf("L2为:"); OutPut(&L2); printf("\n"); printf("************L1+L2后************\n");//多项式L1+L2赋值给L3 printf("\n"); res5 = AddPolyn(&L1, &L2, &L3); OutPut(&L3); printf("\n"); printf("%d\n", res5); printf("\n"); printf("************L1-L2后************\n"); printf("\n"); res6 = SubractPolyn(&L1, &L2, &L4); OutPut(&L4); printf("\n"); printf("%d\n", res6); printf("\n"); printf("************L1*L2后************\n"); printf("\n"); res7 = MultiplyPolyn(&L1, &L2, &L5); for(i = 0; i < L5.length; i++) { printf("系数:%4f | 指数:%4d\n", L5.array[i].coef, L5.array[i].expn); } OutPut(&L5); printf("\n"); printf("%d\n", res7); return 0;}
若有汉字的编译错误,请把汉字改成英文就OK了
运行结果:
阅读全文
0 0
- 线性表的应用——多项式的计算
- 3.线性表的应用-一元多项式的计算
- 线性表的应用----多项式操作
- 多项式运算线性链表的应用
- 线性表的应用——一元多项式的代数运算
- 线性表的应用——求解两个多项式相加问题描述(顺序表求解)
- 线性表的应用——求解两个多项式相加问题描述(链表求解)
- 线性表的应用——求解两个多项式相加问题描述(顺序表求解)
- 线性表的应用——求解两个多项式相加问题描述(链表求解)
- 线性表的应用---一元多项式的表示与相加
- (四)数据结构之线性表的简单应用:多项式求和
- 线性表应用举例——一元多项式相加问题
- 多项式计算//线性表练习
- 链表在计算多项式上的应用(1)
- 线性表基础&线性表应用:多项式
- C算法与数据结构-线性表的应用,多项式求和---ShinePans
- 一元多项式的计算
- 计算多项式的值
- 【Maven】资料库说明
- 任学堂:原来,高手都是这样学会编程的
- 094: 复习习题 型四:左右极限; 型五:连续与间断 ;第二章导数与微分
- 实验3.3 栈与队列——顺序队列
- 信号量与PV操作
- 线性表的应用——多项式的计算
- MySQL查询语句的45道练习
- Tornado框架09-异步01
- [C#基础]字符编码与二进制
- Activity跳转空白
- 【Maven】依赖机制
- 任学堂:自学编程:新手学编程 你需要注意以下几点!
- 什么是String[] argv和String args[]
- python快速安装xgboost