0
点赞
收藏
分享

微信扫一扫

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

多项式乘法程序

文章目录

由于全程使用的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;
}

运行截图

在这里插入图片描述

举报

相关推荐

0 条评论