数据结构与算法实验01-使用链表实现多项式乘法

多项式乘法程序

一个学期才4个实验,太少了吧,边打炉石边写程序花了三四天把四个实验水完了,代码放上供大家参考

由于全程使用的C语言,加上写的很随意,代码优化的空间很大,有很多冗余的代码,只不过写完了就当交差了

实验题目:多项式乘法问题
实验目的:设计一个一元稀疏多项式简单计算器。实验内容与要求 一元稀疏多项式简单计算器的基本功能是:
1.输入并建立多项式;

  • 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列。
  • 多项式a与多项式b相乘,建立多项式。

代码思路

  • 使用链表存多项式
  • 每一个参数链表后的位置后插入

完整代码

#include "stdio.h"
#include "stdlib.h"
#define N 1000
typedef struct muls
{
    int val[N];
    int idx[N];
    int ne[N];
    int head;
    int cnt;
}mul;
mul *eq1;
mul *eq2;
mul *res;
void get_mul(mul *v,int n);
void read();
void  times(mul *x,mul *y);
void insert_k(mul *m,int v,int i,int k);
void insert(mul *m,int v,int  i);
void init();
int main()
{
    init();
    read();
}
void init()
{
    eq1= (mul *)(malloc(sizeof(mul)));
    eq2=(mul  *)(malloc(sizeof (mul)));
    res=(mul *)(malloc(sizeof (mul)));
    eq1->cnt=0;
    eq1->head=-1;
    eq2->cnt=0;
    eq2->head=-1;
    res->cnt=0;
    res->head=-1;
}
void read()
{
    printf("欢迎使用一元多项式简易计算器\n");
    printf("输入格式为系数 指数 (回车键结束)\n");
    printf("下面请输入第一个多项式:\n");
    printf("你输入的多项式项数为:\n");
    int n=0;
    scanf("%d",&n);
    get_mul(eq1,n);
    printf("输入第二个多项式:\n");
    printf("你输入的多项式项数为:\n");
    scanf("%d",&n);
    get_mul(eq2,n);
    printf("计算结果如下:\n");
    times(eq1,eq2);
    int t=res->head;
    while(t!=-1)
    {
        printf("%d %d\n",res->val[t],res->idx[t]);
        t=res->ne[t];
    }
}
void  times(mul *x,mul *y)
{
    int x_t=x->head;
    while(x_t!=-1)
    {
        int x_val=x->val[x_t];
        int x_idx=x->idx[x_t];
        x_t=x->ne[x_t];
        int y_t=y->head;
        while(y_t!=-1)
        {
            int y_val=y->val[y_t];
            int y_idx=y->idx[y_t];
            int res_val=x_val*y_val;
            int res_idx=x_idx+y_idx;
            y_t=y->ne[y_t];
            insert(res,res_val,res_idx);
        }
    }
}
void get_mul(mul *v,int n)
{
    while(n--)
    {
        int a, b;
        scanf("%d %d",&a,&b);
        insert(v,a,b);
    }
}
void Head(mul *m,int v,int i)
{
    int c=m->cnt;
    m->val[c]=v;
    m->idx[c]=i;
    m->ne[c]=m->head;
    m->head=m->cnt++;
}
int search(mul *m,int v,int i)
{
    int t=m->head;
    while(t!=-1) {
        if (m->idx[t] == i) {
            m->val[t] += v;
            return 1;
        }
        t = m->ne[t];
    }
    return 0;
}
void insert(mul *m,int v,int  i)
{
    if(search(m,v,i)==0)
    {
        int t=m->head;
        if(m->idx[t]<i)
        {
            Head(m, v, i);
            return;
        }
        while(t!=-1)
        {
            int la=t;
            t = m->ne[t];
            if(m->idx[t]<i)
            {
                insert_k(m,v,i,la);
                return;
            }
        }
        insert_k(m,v,i,t);
        return;
    }
}
void insert_k(mul *m,int v,int i,int k)
{
    m->cnt++;
    int c=m->cnt;
    int x=m->ne[k];
    m->ne[k]=c;
    m->val[c]=v;
    m->idx[c]=i;
    m->ne[c]=x;
}

运行截图

在这里插入图片描述

实验一 线性表及其应用 一、 实验目的和要求 1、掌握线性表的插入、删除、查找等基本操作设计与实现 2、学习利用线性表提供的接口去求解实际问题 3、熟悉线性表的的存储方法 二、 实验内容和原理 1、实验内容:设计一个一元多项式的简单计算器,其基本功能有①输入并建立多项式;②输出多项式;③多项式相加。可利用单链表或单循环链表实现之。 2、实验原理:以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式中某一项的系数和指数,建立单链表时指数高的结点列于指数低的 结点之后,即线性表的元素按指数递增有序排列。 三、 实验环境 Visual C++ 6.0 及PC机 四、 算法描述及实验步骤 思想算法: 以线性表来描述一元多项式,存储结构采用单链表,每个结点存储的多项式中某一项的系数和指数,建立单链表时指数高的结点列于指数低的结点之后,即线性表的元素按指数递增有序排列。 例如构造两个多项式ha: 5X3+4X2+3X+2 hb: X2+X+1 多项式加法:定义指针p,q分别指向ha,hb i.p->exp==q->exp ,r->coef=p->coef+q->coef,pa,pb下移; ii.p->expexp ,r->coef=q->coef;r->exp=q->exp;,q下移 iii.pa->exp>pb->exp, r->exp=p->exp;r->coef=p->coef;,p下移 iv.p!=NULL,pb==NULL.相当于iii. V.q==NULL,pb!=NULL.相当于ii. 其流程图如下: 多项式乘法:定义指针fp,gp分别指向f,g 1.将两多项式最大指数相加并赋于maxp,并置g 2.用for循环求指数等于maxp时相乘的系数 3. (fp!=NULL)&&(gp!=NULL), p=fp->exp+gp->exp 1.p>maxp, fp=fp->next; 2. pnext; 3.p=maxp, x+=fp->coef*gp->coef; fp=fp->next;gp=gp->next; 五、 实验结果 1.分别输入两个多项式: 5X3+4X2+3X+2 和X2+X+1,然后输出结果如下: 2.分别输入两个多项式:6X4+4X2+2和5X+6,然后输出结果如下: 六、 总结 此次上机实验应用了线性表实现了一次实际操作,完成了一个一元多项式的简单计算器,不仅对此次编译程序的算法思想有了新的认识,还让我深刻的体会到了线性表的重要性以及其应用的方便,并且对指针加深了映象,应用了书本中的算法思想,对我以后的编译以及完成新的程序有很大的帮助。 附录: 1.建立多项式列表代码如下: mulpoly *creatpoly()/*建立多项式列表*/ {mulpoly *head,*r,*s;/*设中间变量*/ int m,n; head=(mulpoly *)malloc(sizeof(mulpoly));/*头结点申请空间*/ printf("\ninput coef and exp:\n"); scanf("%d%d",&n,&m);/*输入多项式系数和指数*/ r=head;/*尾指针指向头指针*/ while(n!=0)/*将输入的多项式存放在S中*/ {s=(mulpoly*)malloc(sizeof(mulpoly)); s->coef=n; s->exp=m; r->next=s; r=s; /*printf("input coef and exp:\n");*/ scanf("%d%d",&n,&m);/*再次输入多项式系数和指数*/ } r->next=NULL;/*将尾指针置空*/ head=head->next;/*将head哑结点向前跑一个结点,使其不为空*/ return (head);/*返回多项式*/ } 2.两个多项式相加代码如下: mulpoly *polyadd(mulpoly *ha,mulpoly *hb)/*两个多项式相加*/ {mulpoly *hc,*p,*q,*s,*r;/*声明结构体型*/ int x; p=ha; q=hb; hc=(mulpoly *)malloc(sizeof(mulpoly));/*申请结点空间*/ s=hc; while((p!=NULL)&&(q!=NULL))/*两多项式不为空*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值