一元多项式的计算
来源:互联网 发布:守望先锋账号购买淘宝 编辑:程序博客网 时间:2024/04/28 15:12
【任务要求】
(1) 能够按照指数降序排列建立并输出多项式;
(2) 能够完成两个多项式的相加、相减,并将结果输入;
实现提示:可选择带头结点的单向循环链表或单链表存储多项式,头结点可存放多项式的参数,如项数等。
要求:在上交资料中请写明:存储结构、多项式相加的基本过程的算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法;
【测试数据】
自行选择
本题主要考察的是链表的建立,删除和增加元素,下面附上代码(带有注释)。若有更好的方法欢迎提建议
。
#include<stdio.h>
#include<malloc.h>
#include<math.h>
typedef struct Lnode
{
int co;//系数
int exp;//指数
struct Lnode *next;
}Lnode;//结构体
int t=0;
Lnode Creat()//创建链表
{
#include<malloc.h>
#include<math.h>
typedef struct Lnode
{
int co;//系数
int exp;//指数
struct Lnode *next;
}Lnode;//结构体
int t=0;
Lnode Creat()//创建链表
{
Lnode *head,*p;
int c,e;
head=(Lnode*)malloc(sizeof(Lnode));
p=head;
head->next=NULL;//创建空链表
printf("请分别输入新的一项的系数,指数(以-1作为结束)\n");
scanf("%d %d",&c,&e);//输入系数和指数
while((c!=-1)||(e!=-1))//当指数不等于-1或系数不等于-1时进入循环尾插法建立链表
{
Lnode *s;
s=(Lnode*)malloc(sizeof(Lnode));
s->co=c;
s->exp=e;
scanf("%d %d",&c,&e);
p->next=s;
p=s;
t++;
int c,e;
head=(Lnode*)malloc(sizeof(Lnode));
p=head;
head->next=NULL;//创建空链表
printf("请分别输入新的一项的系数,指数(以-1作为结束)\n");
scanf("%d %d",&c,&e);//输入系数和指数
while((c!=-1)||(e!=-1))//当指数不等于-1或系数不等于-1时进入循环尾插法建立链表
{
Lnode *s;
s=(Lnode*)malloc(sizeof(Lnode));
s->co=c;
s->exp=e;
scanf("%d %d",&c,&e);
p->next=s;
p=s;
t++;
}
p->next=NULL;
return *head;
p->next=NULL;
return *head;
}
Lnode add(Lnode *a,Lnode *b)//多项式相加的函数
{
Lnode *c;
c=(Lnode*)malloc(sizeof(Lnode));
c->next=NULL;//生成一个新的头结点
Lnode *p1,*p2;
p1=a->next;//p1指向链表a的第一个节点
p2=b->next;//p2指向链表b的第一个节点
Lnode *rear=c;
while(p1!=NULL&&p2!=NULL)//当指针p1和p2都不为空时
{
if(p1->exp>p2->exp)//当链表a节点的指数数小于链表b节点的指数时
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));//生成一个新节点p3;
p3->co=p1->co;//把p1的系数赋值给p3的系数
p3->exp=p1->exp;//把p1的指数赋值给p3的指数
p3->next=NULL;//把p3的nest赋值为空
rear->next=p3;//把rear的next指向新节点p3
rear=p3;//rear 指向p3
p1=p1->next;//p1移动到下一个指针位置
}//总体实现的功能利用尾插法形成一个新的链表
else if(p1->exp < p2->exp)//当链表a节点的指数数大于链表b节点的指数时
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p2->co;//把p2的系数赋值给p3的系数
p3->exp=p2->exp;//把p2的指数赋值给p3的指数
rear->next=p3;//把rear的next指向新节点p3
rear=p3;//rear 指向p3
p2=p2->next;//p2移动到下一个指针位置
}
else //当p1->exp==p2->exp
{
Lnode add(Lnode *a,Lnode *b)//多项式相加的函数
{
Lnode *c;
c=(Lnode*)malloc(sizeof(Lnode));
c->next=NULL;//生成一个新的头结点
Lnode *p1,*p2;
p1=a->next;//p1指向链表a的第一个节点
p2=b->next;//p2指向链表b的第一个节点
Lnode *rear=c;
while(p1!=NULL&&p2!=NULL)//当指针p1和p2都不为空时
{
if(p1->exp>p2->exp)//当链表a节点的指数数小于链表b节点的指数时
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));//生成一个新节点p3;
p3->co=p1->co;//把p1的系数赋值给p3的系数
p3->exp=p1->exp;//把p1的指数赋值给p3的指数
p3->next=NULL;//把p3的nest赋值为空
rear->next=p3;//把rear的next指向新节点p3
rear=p3;//rear 指向p3
p1=p1->next;//p1移动到下一个指针位置
}//总体实现的功能利用尾插法形成一个新的链表
else if(p1->exp < p2->exp)//当链表a节点的指数数大于链表b节点的指数时
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p2->co;//把p2的系数赋值给p3的系数
p3->exp=p2->exp;//把p2的指数赋值给p3的指数
rear->next=p3;//把rear的next指向新节点p3
rear=p3;//rear 指向p3
p2=p2->next;//p2移动到下一个指针位置
}
else //当p1->exp==p2->exp
{
if((p1->co!=0)&&(p2->co!=0))//如果p1的系数和p2的系数不同时为0
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co+p2->co;//把p1和p2系数的和赋值给p3的系数
p3->exp=p1->exp;//把p1的指数赋值给p3的指数
p3->next=NULL;
rear->next=p3;//把rear的next指向新节点p3
rear=p3;//rear 指向p3
}
p2=p2->next;//p2移动到下一个指针位置
p1=p1->next;//p1移动到下一个指针位置
}
}
if(p1==NULL)
{
while(p2!=NULL)//当指针p1为空p2不为空时
{
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co+p2->co;//把p1和p2系数的和赋值给p3的系数
p3->exp=p1->exp;//把p1的指数赋值给p3的指数
p3->next=NULL;
rear->next=p3;//把rear的next指向新节点p3
rear=p3;//rear 指向p3
}
p2=p2->next;//p2移动到下一个指针位置
p1=p1->next;//p1移动到下一个指针位置
}
}
if(p1==NULL)
{
while(p2!=NULL)//当指针p1为空p2不为空时
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));//生成一个新节点
p3->co=p2->co;
p3->exp=p2->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p2=p2->next;
p3=(Lnode*)malloc(sizeof(Lnode));//生成一个新节点
p3->co=p2->co;
p3->exp=p2->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p2=p2->next;
}
}
else
{
while(p1!=NULL)//当指针p1不为空p2为空时
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co;
p3->exp=p1->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p1=p1->next;
}
else
{
while(p1!=NULL)//当指针p1不为空p2为空时
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co;
p3->exp=p1->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p1=p1->next;
}
}
return *c;//返回指针c
}
return *c;//返回指针c
}
Lnode dec(Lnode *a,Lnode *b)//多项式a-多项式b的函数
{
Lnode *c;
c=(Lnode*)malloc(sizeof(Lnode));
c->next=NULL;
Lnode *p1,*p2;
p1=a->next;
p2=b->next;
Lnode *rear=c;
while(p1!=NULL&&p2!=NULL)//当p1不为空p2不为空时
{
if(p1->exp>p2->exp)//如果p1的指数小于p2的指数
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co;
p3->exp=p1->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p1=p1->next;
}
else if(p1->exp <p2->exp)
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=-(p2->co);
p3->exp=p2->exp;
rear->next=p3;
rear=p3;
p2=p2->next;
}
else //p1->exp==p2->exp p1的指数和p2的指数相等时
{
Lnode dec(Lnode *a,Lnode *b)//多项式a-多项式b的函数
{
Lnode *c;
c=(Lnode*)malloc(sizeof(Lnode));
c->next=NULL;
Lnode *p1,*p2;
p1=a->next;
p2=b->next;
Lnode *rear=c;
while(p1!=NULL&&p2!=NULL)//当p1不为空p2不为空时
{
if(p1->exp>p2->exp)//如果p1的指数小于p2的指数
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co;
p3->exp=p1->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p1=p1->next;
}
else if(p1->exp <p2->exp)
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=-(p2->co);
p3->exp=p2->exp;
rear->next=p3;
rear=p3;
p2=p2->next;
}
else //p1->exp==p2->exp p1的指数和p2的指数相等时
{
if((p1->co!=0)&&(p2->co!=0))//p1的系数不等于p2的系数不等于0
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co-p2->co;//把p1的系数减去p2的系数之差赋值给p3
p3->exp=p1->exp;//把p1的指数赋值给p3的指数
p3->next=NULL;
rear->next=p3;
rear=p3;
}
p2=p2->next;
p1=p1->next;
}
}
if(p1==NULL)
{
while(p2!=NULL)
{
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co-p2->co;//把p1的系数减去p2的系数之差赋值给p3
p3->exp=p1->exp;//把p1的指数赋值给p3的指数
p3->next=NULL;
rear->next=p3;
rear=p3;
}
p2=p2->next;
p1=p1->next;
}
}
if(p1==NULL)
{
while(p2!=NULL)
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=-(p2->co);
p3->exp=p2->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p2=p2->next;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=-(p2->co);
p3->exp=p2->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p2=p2->next;
}
}
else if(p2==NULL)
{
while(p1!=NULL)
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co;
p3->exp=p1->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p1=p1->next;
}
else if(p2==NULL)
{
while(p1!=NULL)
{
Lnode *p3;
p3=(Lnode*)malloc(sizeof(Lnode));
p3->co=p1->co;
p3->exp=p1->exp;
p3->next=NULL;
rear->next=p3;
rear=p3;
p1=p1->next;
}
}
return *c;
}
return *c;
}
void print(Lnode *head,int n)//打印节点的函数
{
int i=0;
if(head==NULL)//如果链表不存在
{
printf("多项式不存在");
return ;
}
Lnode *p;
p=head->next;
if(p!=NULL&&p->co!=0)//如果p指针不为空p的系数不为0
printf("%d*x^%d",p->co,p->exp);
p=p->next;
while(p!=NULL)
{
if(p->co>0)//当p的系数大于0时
{
printf("+%d*x^%d",p->co,p->exp);//把连字符“+”打印出来
p=p->next;
}
else if(p->co<0)//当p的系数小于0时
{
printf("%d*x^%d",p->co,p->exp);//此时不用打印"+"连字符
p=p->next;
}
else
{
i++;//i计数
p=p->next;
continue;
}
void print(Lnode *head,int n)//打印节点的函数
{
int i=0;
if(head==NULL)//如果链表不存在
{
printf("多项式不存在");
return ;
}
Lnode *p;
p=head->next;
if(p!=NULL&&p->co!=0)//如果p指针不为空p的系数不为0
printf("%d*x^%d",p->co,p->exp);
p=p->next;
while(p!=NULL)
{
if(p->co>0)//当p的系数大于0时
{
printf("+%d*x^%d",p->co,p->exp);//把连字符“+”打印出来
p=p->next;
}
else if(p->co<0)//当p的系数小于0时
{
printf("%d*x^%d",p->co,p->exp);//此时不用打印"+"连字符
p=p->next;
}
else
{
i++;//i计数
p=p->next;
continue;
}
}
if(i==t)//多项式不存在的情况
printf("多项式不存在!");
printf("\n");
if(i==t)//多项式不存在的情况
printf("多项式不存在!");
printf("\n");
}
int main()
{
printf("请输入多项式A:");
Lnode p;
p=Creat();//创建链表a
printf("多项式A为:\n");
print(&p,t);
printf("请输入多项式B:\n");
Lnode p1;
p1=Creat();//创建链表b
printf("多项式B为:\n");
print(&p1,t); Lnode p2,p3;
p2=add(&p,&p1);//调用链表相加函数
printf("多项式A加B后的结果为:");
print(&p2,t);
p3=dec(&p,&p1);//调用链表相减函数
printf("多项式A减B后的结果为:");
print(&p3,t);
return 0;
int main()
{
printf("请输入多项式A:");
Lnode p;
p=Creat();//创建链表a
printf("多项式A为:\n");
print(&p,t);
printf("请输入多项式B:\n");
Lnode p1;
p1=Creat();//创建链表b
printf("多项式B为:\n");
print(&p1,t); Lnode p2,p3;
p2=add(&p,&p1);//调用链表相加函数
printf("多项式A加B后的结果为:");
print(&p2,t);
p3=dec(&p,&p1);//调用链表相减函数
printf("多项式A减B后的结果为:");
print(&p3,t);
return 0;
}
1 0
- 一元多项式的计算
- 一元多项式的计算
- 计算两个一元多项式的乘积
- 一元多项式加法计算问题
- 一元、二元多项式计算函数
- 3.线性表的应用-一元多项式的计算
- 一元多项式的计算 包括加法减法 降幂排列
- 数据结构之链表一元多项式的计算
- 一元多项式的实现
- 一元多项式的运算
- 一元多项式的幂
- 一元多项式的
- 一元多项式的相乘
- 一元多项式的加减法
- 一元多项式的加减
- 一元多项式的相加
- 一元多项式的代数运算
- 一元多项式的相加运算
- Net设计模式实例之代理模式(Proxy Pattern)
- 求二叉树中节点的最大距离
- Struts框架知识点总结<二>
- Python模块之: configobj(转)
- 5个构建移动应用程序的优秀框架
- 一元多项式的计算
- Net设计模式实例之享元模式( Flyweight Pattern)
- 从菜鸟到入门,掌握 Java
- 大学生禁忌
- Net设计模式实例之外观模式(Façade Pattern)
- 运行时数据区(仅限于线程栈)
- c++ Primer Plus(第六版)第十一章,编程练习之路
- Net设计模式实例之装饰者模式(Decorator Pattern)
- Linux也有全功能杀毒软件啦!