java 一元稀疏多项式简单计算器_一元稀疏多项式简单的计算器

本文介绍了一种一元稀疏多项式计算器的设计与实现,包括创建、销毁、打印、相加和求值等操作。通过C语言编程,实现了多项式的链表存储,并提供了多项式相加的高效算法,适用于处理具有稀疏系数的多项式表达式。

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

共回答了25个问题采纳率:92%

一元稀疏多项式计算器设计程序代码

#include

#include

#include

#include

#define maxlen 10

#define large 999

typedef struct Linklistomial{

float coef;

int expn;

struct Linklistomial *next;

}Linklistomial,*Linklist;

void Insert(Linklist p,Linklist h){

if(p->coef==0) free(p);//系数为0的话释放结点

else

{

Linklist q1,q2;

q1=h;

q2=h->next;

while(q2&&p->expnexpn) { //查找插入位置

q1=q2;

q2=q2->next;

}

if(q2&&p->expn==q2->expn) { //将指数相同相合并

q2->coef+=p->coef;

free(p);

if(!q2->coef) {//系数为0的话释放结点

q1->next=q2->next;

free(q2);

}

}

else { //指数为新时将结点插入

p->next=q2;

q1->next=p; }

}

}

Linklist CreateLinklist(Linklist head,int m){

//建立一个头指针为head、项数为m的一元多项式

int i;

Linklist p;

p=head=(Linklist)malloc(sizeof(struct Linklistomial));

head->next=NULL;

for(i=0;icoef,&p->expn);

Insert(p,head); //调用Insert函数插入结点

}

return head;

}

void DestroyLinklist(Linklist p){ //销毁多项式p

Linklist q1,q2;

q1=p->next; q2=q1->next;

while(q1->next) {

free(q1);

q1=q2;

q2=q2->next; }

}

void PrintLinklist(Linklist P){

Linklist q=P->next;

int flag=1; //项数计数器

if(!q) { //若多项式为空,输出0

putchar('0');

printf("n");

return;

}

while(q)

{

if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项

if(q->coef!=1&&q->coef!=-1) { //系数非1或-1的普通情况

printf("%g",q->coef);

if(q->expn==1) putchar('X');

else if(q->expn) printf("X^%d",q->expn);

}

else {

if(q->coef==1)

{

if(!q->expn) putchar('1');

else if(q->expn==1) putchar('X');

else printf("X^%d",q->expn);

}

if(q->coef==-1)

{

if(!q->expn) printf("-1");

else if(q->expn==1) printf("-X");

else printf("-X^%d",q->expn);

}

}

q=q->next;

flag++;

}

printf("n");

}

int compare(Linklist a,Linklist b){

if(a&&b)

{ if(!b||a->expn>b->expn) return 1;

else if(!a||a->expnexpn) return -1;

else return 0;

}

else if(!a&&b) return -1;//a多项式已空,但b多项式非空

else return 1;//b多项式已空,但a多项式非空

}

Linklist AddLinklist(Linklist pa,Linklist pb){//求解并建立多项式a+b,返回其头指针

Linklist qa=pa->next;

Linklist qb=pb->next;

Linklist headc,hc,qc;

hc=(Linklist)malloc(sizeof(struct Linklistomial));//建立头结点

hc->next=NULL;

headc=hc;

while(qa||qb)

{

qc=(Linklist)malloc(sizeof(struct Linklistomial));

switch(compare(qa,qb)){

case 1: {

qc->coef=qa->coef;

qc->expn=qa->expn;

qa=qa->next;

break; }

case 0: {

qc->coef=qa->coef+qb->coef;

qc->expn=qa->expn;

qa=qa->next;

qb=qb->next;

break;

}

case -1: {

qc->coef=qb->coef;

qc->expn=qb->expn;

qb=qb->next;

break; }

}

if(qc->coef!=0)

{

qc->next=hc->next;

hc->next=qc;

hc=qc;

}

else free(qc);//当相加系数为0时,释放该结点

}

return headc;

}

int ValueLinklist(Linklist head,int x){

//输入x值,计算并返回多项式的值

Linklist p;

int i;

int sum=0,t;

for(p=head->next;p;p=p->next)

{

t=1;

for(i=p->expn;i!=0;)

{

if(icoef*t;

}

return sum;

}

void xiang()

{ int m,n,a,x;

char flag;

Linklist pa=0,pb=0,pc;

printf(" 欢迎使用多项式操作程序nn");

printf("请输入a的项数:");

scanf("%d",&m);

pa=CreateLinklist(pa,m);//建立多项式a

printf("请输入b的项数:");

scanf("%d",&n);

pb=CreateLinklist(pb,n);//建立多项式

//输出菜单

printf(" n");

}

int main(){

int choice;

menu();

printf(" please make your choice:");

scanf("%d",&choice);

while(choice!=3)

{

switch(choice){

case 1:system("cls");xiang();getch();break;

case 2:system("cls");shu();getch();getch();break;

default:printf(" please chooose the right choice!");getch();getch();break;

}

system("cls");

menu();

printf(" please make your choice:");

scanf("%d",&choice);

}

printf(" 谢谢使用该程序!n");

}

1年前

6

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值