C语言单链表实现多项式相加

下面是关于C语言单链表实现多项式相加的完整攻略。

一、单链表实现多项式的存储

多项式是由若干项组成的,每一项有系数和指数两部分构成。为了在计算机中表示多项式,我们可以采用单链表来存储。假设一个多项式为:

$$P(x) = 3x^4 + 2x^3 + x^2 - 5$$

那么我们可以采用下面的结构体来表示一个多项式中的一项:

typedef struct node{ 
  int coef; //系数
  int expn; //指数
  struct node *next; //指向下一项
}ElemType, *LinkList;

在程序中,我们可以使用头结点来表示一个多项式。头结点不存储任何数据,只作为整个链表的起点。因此我们可以采用下面的结构体来表示一个多项式:

typedef struct { 
  LinkList head; //头结点
}Polynomial;

二、单链表实现多项式相加

假设有两个多项式:

$$P_1(x) = 2x^4 + 3x^3 + x^2 + 5x + 2$$

$$P_2(x) = x^3 - 4x^2 + 2x - 5$$

我们需要将这两个多项式相加,那么就可以采用下面的步骤:

1.新建一个结果多项式,采用头结点表示;

2.设定两个指针,分别指向两个多项式的首项;

3.依次比较两个指针所指向项的指数大小,将指数较小的项添加到结果多项式中;

4.将指针指向较小项的下一项,继续比较;

5.如果有一方的指针已经遍历完了所有项,则将另一方多项式中剩余的项添加到结果多项式中;

6.返回结果多项式。

下面是多项式相加的代码实现:

Polynomial AddPolynomial(Polynomial Poly1, Polynomial Poly2) {
  Polynomial PolySum; //结果多项式
  LinkList p = Poly1.head->next; //指向Poly1首项
  LinkList q = Poly2.head->next; //指向Poly2首项
  LinkList r = (LinkList)malloc(sizeof(ElemType)); //结果多项式的头结点
  r->next = NULL;
  PolySum.head = r;

  while (p && q) {
    //指数相等,系数相加
    if (p->expn == q->expn) {
      int sum = p->coef + q->coef;
      //系数和为0,不添加这一项
      if (sum != 0) {
        LinkList tmp = (LinkList)malloc(sizeof(ElemType));
        tmp->coef = sum;
        tmp->expn = p->expn;
        tmp->next = r->next;
        r->next = tmp;
      }
      p = p->next;
      q = q->next;
    }
    //p的指数小于q的指数,p插入结果多项式中
    else if (p->expn < q->expn) {
      LinkList tmp = (LinkList)malloc(sizeof(ElemType));
      tmp->coef = p->coef;
      tmp->expn = p->expn;
      tmp->next = r->next;
      r->next = tmp;
      p = p->next;
    }
    //p的指数大于q的指数,q插入结果多项式中
    else {
      LinkList tmp = (LinkList)malloc(sizeof(ElemType));
      tmp->coef = q->coef;
      tmp->expn = q->expn;
      tmp->next = r->next;
      r->next = tmp;
      q = q->next;
    }
  }
  //将没有遍历完的多项式连在结果多项式的后面
  while (p) {
    LinkList tmp = (LinkList)malloc(sizeof(ElemType));
    tmp->coef = p->coef;
    tmp->expn = p->expn;
    tmp->next = r->next;
    r->next = tmp;
    p = p->next;
  }
  while (q) {
    LinkList tmp = (LinkList)malloc(sizeof(ElemType));
    tmp->coef = q->coef;
    tmp->expn = q->expn;
    tmp->next = r->next;
    r->next = tmp;
    q = q->next;
  }

  return PolySum;
}

三、完整代码实例

下面是一个完整的代码实例,演示如何用单链表实现多项式相加:

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

//定义多项式项的结构体
typedef struct node{ 
  int coef; //系数
  int expn; //指数
  struct node *next; //指向下一项
}ElemType, *LinkList;

//定义多项式的结构体
typedef struct { 
  LinkList head; //头结点
}Polynomial;

//多项式相加函数
Polynomial AddPolynomial(Polynomial Poly1, Polynomial Poly2) {
  Polynomial PolySum; //结果多项式
  LinkList p = Poly1.head->next; //指向Poly1首项
  LinkList q = Poly2.head->next; //指向Poly2首项
  LinkList r = (LinkList)malloc(sizeof(ElemType)); //结果多项式的头结点
  r->next = NULL;
  PolySum.head = r;

  while (p && q) {
    //指数相等,系数相加
    if (p->expn == q->expn) {
      int sum = p->coef + q->coef;
      //系数和为0,不添加这一项
      if (sum != 0) {
        LinkList tmp = (LinkList)malloc(sizeof(ElemType));
        tmp->coef = sum;
        tmp->expn = p->expn;
        tmp->next = r->next;
        r->next = tmp;
      }
      p = p->next;
      q = q->next;
    }
    //p的指数小于q的指数,p插入结果多项式中
    else if (p->expn < q->expn) {
      LinkList tmp = (LinkList)malloc(sizeof(ElemType));
      tmp->coef = p->coef;
      tmp->expn = p->expn;
      tmp->next = r->next;
      r->next = tmp;
      p = p->next;
    }
    //p的指数大于q的指数,q插入结果多项式中
    else {
      LinkList tmp = (LinkList)malloc(sizeof(ElemType));
      tmp->coef = q->coef;
      tmp->expn = q->expn;
      tmp->next = r->next;
      r->next = tmp;
      q = q->next;
    }
  }
  //将没有遍历完的多项式连在结果多项式的后面
  while (p) {
    LinkList tmp = (LinkList)malloc(sizeof(ElemType));
    tmp->coef = p->coef;
    tmp->expn = p->expn;
    tmp->next = r->next;
    r->next = tmp;
    p = p->next;
  }
  while (q) {
    LinkList tmp = (LinkList)malloc(sizeof(ElemType));
    tmp->coef = q->coef;
    tmp->expn = q->expn;
    tmp->next = r->next;
    r->next = tmp;
    q = q->next;
  }

  return PolySum;
}

//创建多项式
void CreatePolynomial(Polynomial *p) {
  LinkList r, q;
  r = p->head; //r指向头结点
  int n, c, e; //n表示项数,c表示系数,e表示指数
  printf("请输入多项式的项数:");
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    printf("请输入第%d项的系数和指数:", i + 1);
    scanf("%d%d", &c, &e);
    q = (LinkList)malloc(sizeof(ElemType)); //新建一项
    q->coef = c;
    q->expn = e;
    r->next = q;
    r = q;
  }
  r->next = NULL; //尾结点指向NULL
}

//输出多项式
void PrintPolynomial(Polynomial p) {
  LinkList q = p.head->next;
  while (q) {
    printf("%dx%d", q->coef, q->expn);
    q = q->next;
    if (q)
      printf("+"); //每项后面都加上加号
  }
  printf("\n");
}

int main() {
  Polynomial Poly1, Poly2, PolySum;
  Poly1.head = (LinkList)malloc(sizeof(ElemType));
  Poly2.head = (LinkList)malloc(sizeof(ElemType));
  //创建多项式1
  printf("创建多项式1:\n");
  CreatePolynomial(&Poly1);
  //创建多项式2
  printf("创建多项式2:\n");
  CreatePolynomial(&Poly2);
  //输出多项式1和多项式2
  printf("多项式1=");
  PrintPolynomial(Poly1);
  printf("多项式2=");
  PrintPolynomial(Poly2);
  //多项式相加
  PolySum = AddPolynomial(Poly1, Poly2);
  //输出结果多项式
  printf("多项式1与多项式2相加的结果=");
  PrintPolynomial(PolySum);

  return 0;
}

运行程序后,我们可以得到以下输出结果:

创建多项式1:
请输入多项式的项数:5
请输入第1项的系数和指数:2 4
请输入第2项的系数和指数:3 3
请输入第3项的系数和指数:1 2
请输入第4项的系数和指数:5 1
请输入第5项的系数和指数:2 0
创建多项式2:
请输入多项式的项数:4
请输入第1项的系数和指数:1 3
请输入第2项的系数和指数:-4 2
请输入第3项的系数和指数:2 1
请输入第4项的系数和指数:-5 0
多项式1=2x^4+3x^3+1x^2+5x^1+2x^0
多项式2=1x^3-4x^2+2x^1-5x^0
多项式1与多项式2相加的结果=2x^4+4x^3-3x^2+7x^1+-3x^0

从输出结果可以看出,我们成功地实现了单链表存储多项式,并通过单链表实现了多项式的相加。其中头结点的作用是起到链表节点的关键字作用,便于插入和删除操作。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言单链表实现多项式相加 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • vantcell单元格

    Vantcell单元格攻略 Vantcell是一款基于Vue.js的移动端UI组件库,其中的单元格组件可以用于展示列表数据。本攻略将介绍Vantcell单元格的使用方法,包括元格的基本用法、自定义单元格、单元格的事件等。 基本用法 Vantcell单元格的基本用非常简单,只需要在代码中引入Vantcell组件库,并使用van-cell标签即可。例如: &lt…

    other 2023年5月7日
    00
  • JAVA 多态操作—-父类与子类转换问题实例分析

    JAVA 多态操作—-父类与子类转换问题实例分析 简介 多态是面向对象编程中的一个重要概念,能够提高代码的可扩展性、可维护性和可复用性。在多态中,一个父类可以有多个子类,同样,一个对象也可以在不同的情况下具有不同的形态。在本篇文章中将介绍在JAVA中实现多态时,父类与子类的转换问题,并通过两个实例进行说明。 父类与子类的转换 在JAVA中,父类与子类之间…

    other 2023年6月27日
    00
  • mysql中的base64函数

    MySQL中的base64函数 在MySQL中,有一个名为base64的函数,它可以将二进制数据编码成文本格式,同时也可以将文本格式的数据解码成二进制数据。它是一种常用的加密解密函数,下面我们来详细介绍一下MySQL中的base64函数的使用方法。 语法 base64函数的语法: BASE64(str) 其中,str为要进行编码的二进制数据或解码的文本数据。…

    其他 2023年3月29日
    00
  • 获取控件大小和设置调整控件的位置XY示例

    获取控件大小和设置调整控件位置XY是页面布局中非常重要的操作。下面提供两个示例,分别介绍如何获取控件大小以及如何调整控件的位置。 示例1:获取控件大小 获取控件大小的方法可以通过JavaScript中的offsetWidth和offsetHeight属性来实现。下面是一个示例代码,可以获取DIV控件的宽度和高度: <div id="myDiv…

    other 2023年6月27日
    00
  • 简约JS日历控件 实例代码

    我来为您详细讲解“简约JS日历控件实例代码”的攻略。 一、介绍 该日历控件以jQuery库为基础,简约而美观,提供了丰富的日历展示及操作功能。 二、操作步骤 1. 引入所需文件 在HTML文件头部引入相关文件,包括jQuery库和日历控件的CSS和JS文件。 <link rel="stylesheet" href="cal…

    other 2023年6月26日
    00
  • Shell脚本创建指定大小文件的测试数据

    Shell脚本创建指定大小文件的测试数据攻略 有时候我们需要创建一些指定大小的测试数据文件,以便进行性能测试或其他目的。下面是使用Shell脚本创建指定大小文件的详细攻略: 确定文件大小:首先,确定您想要创建的文件的大小。可以使用以下命令将文件大小转换为字节: bash size_in_bytes=$((desired_size * 1024 * 1024)…

    other 2023年10月18日
    00
  • 浅谈redis五大数据结构和使用场景

    浅谈Redis五大数据结构和使用场景 简介 Redis是一种开源的基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis支持多种数据结构,这些数据结构可在复杂数据处理中提供更灵活的功能。 Redis支持五种主要的数据结构: 字符串(String) 列表(List) 集合(Set) 哈希(Hash) 有序集合(Sorted Set) 本文将对…

    other 2023年6月27日
    00
  • 富文本(wangeditor框架)的使用教程

    以下是详细讲解“富文本(wangeditor框架)的使用教程的完整攻略”的标准Markdown格式文本: 富文本(wangeditor框架)的使用教程 富文编辑器是一种常见的前端组件,可以让用户在网页上编辑富文本内容。wangeditor是一种常用的富文本编辑器框架,本攻略将介绍如何使用wangeditor框架来实现富文本编辑器。 步骤一:下载wangedi…

    other 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部