数据结构_一元稀疏(加减乘法)计算器

来源:互联网 发布:window安装mac双系统 编辑:程序博客网 时间:2024/06/05 23:52

符号多项式的操作,可以使用链表进行实现。在数学上,一个一元多项式P(x)可以按照升幂写为P(x)=p0+p1x+p2x^2+.....+pnx^n

它有n+1个系数唯一确定,相似的我们在计算机中可以使用线性表来表示:

P=(p0,p1,p2,p3,.....pn)每一项的指数i包含在系数Pi的序号中;

同理Q(m)也可以使用相同的方法来表示;

对此加减乘都可以轻松解决;为了计算方便以及内存占用问题,我们采用链式存储结构;

在计算过程中:我们需要对不同幂次的系数进行排序,这样才便于下一步的计算;

项目功能:

•      用VC实现两个一元多项式的加减乘

•      能够实现一元多项式的输入和输出

•      能够进行一元多项式相加

•      能够进行一元多项式相减

•      能够进行医院多项式相乘

•      能够支持多次实现


typedef struct node
{
float c;
int e;
struct node *next;
}dnode;

项目涉及到的基本算法:

1:显示算法:

void display(dnode *P){
dnode *q=P->next; 
    int flag=1;//项数计数器
    if(!q)
{ //若多项式为空,输出0
        putchar('0'); 
        printf("\n");
        return;
}
    while(q)
{   
        if(q->c>0&&flag!=1) putchar('+'); //系数大于0且不是第一项
        if(q->c!=1&&q->c!=-1)
{//系数非1或-1的普通情况
            printf("%g",q->c); //
            if(q->e==1) putchar('X');
            else if(q->e) printf("X^%d",q->e);
}
        else
{
            if(q->c==1)
{
                if(!q->e) putchar('1'); 
                else if(q->e==1) putchar('X'); 
                else printf("X^%d",q->e);
}
            if(q->c==-1)
{
                if(!q->e) printf("-1"); 
                else if(q->e==1) printf("-X"); 
                else printf("-X^%d",q->e);
}
}
        q=q->next; 
        flag++;
}
    printf("\n");
}

2:交换算法:

void swap(dnode *p,dnode *q){
float t;
int k;
k=p->e; p->e=q->e;q->e=k;
t=p->c; p->c=q->c;q->c=t;  //交换p与q的数值;
}

3:排序算法:

void sort(dnode *h)  //按顺序排列;
{
dnode *p, *q,*pi, *pl;
p=h->next;
while(p->next!= NULL)
   p=p->next;
   pi=p;
   while(pi!=h->next)
   {
    pl=h->next;
for(p=h->next;p!=pi;p=p->next)
{
q=p->next;
if(p->e>q->e){
swap(p,q);
pl=p;
   }
  
}
pi=pl;
}
}

4:插入算法:

void Insert(dnode *p,dnode *h){     
    if(p->c==0) free(p);
    else
{
        dnode *q1,*q2;
        q1=h;
q2=h->next;
        while(q2&&p->e<q2->e)
{
            q1=q2;
            q2=q2->next;
}
        if(q2&&p->e==q2->e)
{
            q2->c+=p->c;
            free(p);
            if(!q2->c)
{
                q1->next=q2->next;
                free(q2);
}
}
        else
{
            p->next=q2;
            q1->next=p;
}
}
}

5:计算算法:

1):加减

比较简单,不再赘述!

2)乘法:

dnode *MultiplyPolyn(dnode *pa,dnode *pb){
    dnode *hf,*pf;
    dnode *qa=pa->next;
    dnode *qb=pb->next;
    hf= (dnode*)malloc(sizeof(dnode));
    hf->next=NULL;
    for(;qa;qa=qa->next)
{
        for(qb=pb->next;qb;qb=qb->next)
{
            pf= (dnode*)malloc(sizeof(dnode));
            pf->c=qa->c*qb->c;
            pf->e=qa->e+qb->e;
            Insert(pf,hf);
}
}
    return hf;
}



1 0
原创粉丝点击