数据结构:多项式表示(polynomial representation)

发布于:2025-08-02 ⋅ 阅读:(11) ⋅ 点赞:(0)

目录

从定义出发 —— 什么是多项式?

目标本质是什么?

探索表示方式 

第一步:如何表示一个项?

第二步:如何存多个项?

第三步:再抽象一点,用结构体封装多项式

示例推导


从定义出发 —— 什么是多项式?

数学中,一个一元多项式是由多个项(term)构成的,每一项的形式是:

系数 × 变量的幂次

一个一元多项式(single-variable polynomial)是形如:

P(x) = a0 + a1*x + a2*x^2 + ... + an*x^n

其中:

  • x 是变量

  • a0, a1, ..., an 是对应每一项的 系数(coefficient)

  • 每个 x^k 是幂次,k 是“指数”或“指数幂”(exponent)

  • n 是多项式的 最高次数(degree)

举个例子:P(x) = 5*x^3 + 0*x^2 + 2*x + 7

可以看成是 4 项相加:

  • 第 1 项:5*x^3

  • 第 2 项:0*x^2(虽然结果是0,我们还是可以记下来)

  • 第 3 项:2*x

  • 第 4 项:7 (可以看作 7*x^0)

目标本质是什么?

我们想要用程序的结构(数组、结构体、链表等)去保存这个多项式里的每一项

所以我们先来思考:

一个多项式项(term)需要保存什么信息?

答:两个信息:

  1. 系数(例如:5)

  2. 指数(例如:3)

 我们要解决的问题是:如何使用 C 语言的数据结构来存储这样的“系数-指数”对的集合?


探索表示方式 

第一步:如何表示一个项?

假设我们有这个多项式:P(x) = 5*x^4 + 0*x^3 + 2*x^1 + 7

如何表示 (a2, 2) (系数, 指数) 这样的东西?

我们尝试用一个数组 int coef[] 表示

coef[0] = 7;   // x^0
coef[1] = 2;   // x^1
coef[2] = 0;   // x^2
coef[3] = 0;   // x^3
coef[4] = 5;   // x^4

问题是:

  • 当指数变大(比如出现 x^100),我们就得分配很多空间,即使很多项为 0。

  • 我们实际上只关心那些“系数 ≠ 0 的项”,不想保存无效信息。

我们希望两个整数能绑在一起。C语言中,我们最基础的方法是结构体。 

✅ 结论:我们只保存“有效项”(即系数不为 0 的项),每一项用结构体 Term 表示:

struct Term {
    int coef;  // 系数
    int exp;   // 指数
};

第二步:如何存多个项?

一个多项式是多个项的集合。

从数据的角度,我们有以下需求:表示一组结构体 Term,存储在一起,方便访问

最直接的方式是:数组

  • 为什么用数组?因为数组是连续的、可以用索引访问、逻辑简单。

  • 为什么不用链表?我们现在先只讲“数组表示法”。

一个多项式是若干个 Term 构成的,我们就可以开一个结构体数组:

struct Term terms[100];

⚠️ 但又出现一个新问题:

数组开了 10 个,但我们实际也许只用了 3 个项。我们就必须知道:

当前实际用了几个项?

所以我们需要一个变量:记录项数

我们可以定义:

int n;  // 表示多项式实际的项数

这时,我们可以有两个变量:

  • n 表示实际项数

  • terms[n] 表示 n 个项,每个项是 (coef, exp)


第三步:再抽象一点,用结构体封装多项式

多项式本质上就是一组“项” + 这组项的个数

因此,我们用一个结构体 Polynomial 来封装这个“多项式”:

struct Polynomial {
    int n;         // 实际有效项数
    struct Term* t; // 指向 Term 数组的指针
};

为什么用 Term* t 而不是 Term t[100]

两个原因:

  1. 多项式的项数不固定,想动态创建

  2. t 是一个指针,更灵活,可传参、分配空间

我们可以在运行时这样写:

poly.n = 3;
poly.t = (struct Term*) malloc(poly.n * sizeof(struct Term));

到目前为止,我们得到了:

  • 每一项:用 Term 表示 (coef, exp)

  • 多项式:用 Polynomial 表示一组 Term 和项数 n


示例推导

表示多项式:P(x) = 3*x^5 + 2*x^2 + 7

我们一步步来看:

第一步:有几项?

答案是 3 项,对应:

系数 指数
3 5
2 2
7 0

第二步:准备数据结构 

struct Polynomial p;
p.n = 3;
p.t = (struct Term*) malloc(p.n * sizeof(struct Term));

第三步:填充每一项

p.t[0].coef = 3; p.t[0].exp = 5;
p.t[1].coef = 2; p.t[1].exp = 2;
p.t[2].coef = 7; p.t[2].exp = 0;

完整代码

#include <stdio.h>
#include <stdlib.h>

// 表示一项:coef * x^exp
struct Term {
    int coef;
    int exp;
};

// 表示一个多项式:n 个项,t 指向这些项
struct Polynomial {
    int n;
    struct Term* t;
};

int main() {
    // 1. 创建一个多项式变量
    struct Polynomial p;

    // 2. 指定这个多项式有 3 项
    p.n = 3;

    // 3. 分配数组空间来存这 3 项
    p.t = (struct Term*) malloc(p.n * sizeof(struct Term));

    // 4. 设置每一项:P(x) = 3*x^5 + 2*x^2 + 7
    p.t[0].coef = 3; p.t[0].exp = 5;
    p.t[1].coef = 2; p.t[1].exp = 2;
    p.t[2].coef = 7; p.t[2].exp = 0;

    // 5. 打印多项式
    printf("P(x) = ");
    for (int i = 0; i < p.n; i++) {
        printf("%d*x^%d", p.t[i].coef, p.t[i].exp);
        if (i != p.n - 1) printf(" + ");
    }
    printf("\n");

    // 6. 释放空间
    free(p.t);

    return 0;
}

网站公告

今日签到

点亮在社区的每一天
去签到