一元稀疏多项式计算器.docx
《一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式计算器.docx(13页珍藏版)》请在冰豆网上搜索。
一元稀疏多项式计算器
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
typedefintelemtype;
typedefstructlist//定义结构体链表
{
floatc;//多项式的常数域
elemtypee;//指数域
structlist*next;//指针域
}lnode,*linklist;//结构体名称
voidcreate_jisuanqi_linklist(linklist*l)//初始化结构体
{
(*l)=(linklist)malloc(sizeof(lnode));
(*l)->next=NULL;
}
voidinsert_jisuqnai_linklist(linklistl)//创建结构体
{
inte,n,i=1;
floatc;
lnode*p=l;
printf("Howmanytermsinthepolynomial:
");
scanf("%d",&n);//输入多项式中的项数
while(n)
{
lnode*q=(linklist)malloc(sizeof(linklist));
printf("PleaseinputNO.%d'scande:
",i);
fflush(stdin);//清除缓存数据
scanf("%f%d",&c,&e);//分别输入多项式的常数域和指数域
q->c=c;
q->e=e;
p->next=q;//将结点q接入链表中
q->next=NULL;
p=q;
n--;
i++;
}
}
voidchose_jisuanqi_linklist(linklist*l)//对多项式按指数进行降序排序
{
lnode*p=(*l)->next;
lnode*q=(lnode*)malloc(sizeof(linklist));//定义一个结点,用于循环比较指数域的值
inttempc,tempe;
while(p!
=NULL)//一直循环,直到遍历完链表中所有结点
{
q=p;
while(q!
=NULL)
{
if(p->ee)//交换两节点中的常数和指数域的值
{
tempe=p->e;
tempc=p->c;
p->e=q->e;
p->c=q->c;
q->e=tempe;
q->c=tempc;
}
q=q->next;//指针下移
}
p=p->next;
}
}
lnode*add_jisuanqi_linklist(linklista,linklistb)//执行多项式A与B相加
{
linklistc;//定义一个链表C用于存放两个多项式的和
intx;
create_jisuanqi_linklist(&c);//创建该多项式
lnode*p1=a->next;
lnode*p2=b->next;
lnode*t=c;
t->next=NULL;
lnode*p3=t;
while(p1)//遍历两个多项式中所有结点,找到指数域相同的结点,将其常数域相加存放到链表C中
{
p2=b->next;
while(p2)
{
if(p1->e==p2->e)
{
lnode*q=(lnode*)malloc(sizeof(lnode));
x=p1->c+p2->c;//将常数域相加
q->c=x;
q->e=p1->e;
p3->next=q;
q->next=NULL;
p3=q;
break;
}
else
p2=p2->next;
}
p1=p1->next;
}
p1=a->next;//指针复位指向头结点的next
while(p1)//链表a与c比较,将a中指数域的值未在c中出现的结点连接在链表c后
{
lnode*q=t->next;
while(q)
{
if(p1->e!
=q->e)
q=q->next;
elsebreak;
}
if(q==NULL)
{
lnode*q1=(lnode*)malloc(sizeof(lnode));
q1->c=p1->c;
q1->e=p1->e;
p3->next=q1;
q1->next=NULL;
p3=q1;
}
p1=p1->next;
}
p2=b->next;
while(p2)//链表a与c比较,将a中指数域的值未在c中出现的结点连接在链表c后
{
lnode*q=t->next;
while(q)
{
if(p2->e!
=q->e)
q=q->next;
elsebreak;
}
if(q==NULL)
{
lnode*q2=(lnode*)malloc(sizeof(lnode));
q2->c=p2->c;
q2->e=p2->e;
p3->next=q2;
q2->next=NULL;
p3=q2;
}
p2=p2->next;
}
chose_jisuanqi_linklist(&c);//对链表c进行安指数降序排序
returnt;//返回c的头结点
}
lnode*jian_jisuanqi_linklist(linklista,linklistb)//执行多项式A与B相减
{
linklistc;
intx;
create_jisuanqi_linklist(&c);
lnode*p1=a->next;
lnode*p2=b->next;
lnode*t=c;
t->next=NULL;
lnode*p3=t;
while(p1)
{
p2=b->next;
while(p2)
{
if(p1->e==p2->e)
{
lnode*q=(lnode*)malloc(sizeof(lnode));
x=p1->c-p2->c;//将两个多项式的常数项相减
q->c=x;
q->e=p1->e;
p3->next=q;
q->next=NULL;
p3=q;
break;
}
else
p2=p2->next;
}
p1=p1->next;
}
p1=a->next;
while(p1)
{
lnode*q=t->next;
while(q)
{
if(p1->e!
=q->e)
q=q->next;
elsebreak;
}
if(q==NULL)
{
lnode*q1=(lnode*)malloc(sizeof(lnode));
q1->c=p1->c;
q1->e=p1->e;
p3->next=q1;
q1->next=NULL;
p3=q1;
}
p1=p1->next;
}
p2=b->next;
while(p2)
{
lnode*q=t->next;
while(q)
{
if(p2->e!
=q->e)
q=q->next;
elsebreak;
}
if(q==NULL)
{
lnode*q2=(lnode*)malloc(sizeof(lnode));
q2->c=p2->c;
q2->e=p2->e;
p3->next=q2;
q2->next=NULL;
p3=q2;
}
p2=p2->next;
}
chose_jisuanqi_linklist(&c);
returnt;
}
voiddisplay_jisuanqi_linklist(linklistl)//输出链表
{
lnode*p=l->next;
printf("%3.1f^%d",p->c,p->e);
p=p->next;
while(p)
{
if(p->c>0)//如果多项式的常数项大于0,则在输出项前面加一个“+”
{
printf("+%3.1f^%d",p->c,p->e);
p=p->next;
}
elseif(p->c<0)//如果多项式的常数项小于0,则输出原式
{
printf("%3.1f^%d",p->c,p->e);
p=p->next;
}
else//常数项为0,不输出
p=p->next;
}
printf("\n");
}
#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"jisuanqi_linklist.h"
voidmain()//主函数
{
linklista,b,c,d;
intk;
start:
printf("\n\t\t\t欢迎使用多项式计算器系统\n");//进入系统提示
do
{
printf("\t|*********************************************************|\n");//选择模块
printf("\t|1.输入多项式A、B,并对其进行指数降序排列|\n");
printf("\t|2.输出多项式A、B|\n");
printf("\t|3.计算多项式C=A+B|\n");
printf("\t|4.计算多项式D=A-B|\n");
printf("\t|5.输出多项式C、D|\n");
printf("\t|0.退出系统|\n");
printf("\t|*********************************************************|\n");
printf("\t选择功能选项:
");
scanf("%d",&k);//输入要选择的功能选项
switch(k)//对号调用子函数
{
case1:
system("cls");//清屏
{
create_jisuanqi_linklist(&a);
insert_jisuqnai_linklist(a);
chose_jisuanqi_linklist(&a);
create_jisuanqi_linklist(&b);
insert_jisuqnai_linklist(b);
chose_jisuanqi_linklist(&b);
}system("cls");break;
case2:
system("cls");
{
printf("PolynomialAis:
\n");
display_jisuanqi_linklist(a);
printf("\nPolynomialBis:
\n");
display_jisuanqi_linklist(b);
getch();
}system("cls");break;
case3:
system("cls");
{
c=add_jisuanqi_linklist(a,b);
printf("CalculaepolynomialC=A+Bissuccessful!
!
");
getch();
}system("cls");break;
case4:
system("cls");
{
d=jian_jisuanqi_linklist(a,b);
printf("CalculaepolynomialC=A-Bissuccessful!
!
");
getch();
}system("cls");break;
case5:
system("cls");
{
printf("PolynomialCis:
\n");
display_jisuanqi_linklist(c);
printf("\nPolynomialDis:
\n");
display_jisuanqi_linklist(d);
getch();
}system("cls");break;
case0:
system("exit");exit(0);
default:
system("cls");gotostart;
}
}
while
(1);
}