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

yizhihongxing

下面是关于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日

相关文章

  • C++读取文件的四种方式总结

    当我们需要读取文件时,可以使用以下四种方式: 1. 使用 C++ 标准库库函数 我们可以使用 ifstream 类和其对象读取文件内容,需要包含头文件 <fstream>。 #include <fstream> #include <iostream> using namespace std; int main() { if…

    other 2023年6月26日
    00
  • IDEA debug漏洞第一篇(weblogic,cve-2017-10271)

    IDEA debug漏洞第一篇(weblogic,cve-2017-10271) 在网站开发中,使用集成开发环境(IDE)进行调试是非常常见的一种方式。而现在,一种名为IDEA debug漏洞的安全漏洞受到了人们的关注。在之前,weblogic曾经遭受了CVE-2017-10271漏洞的攻击,而这种漏洞与IDEA debug漏洞有着紧密的联系。本文将会详细介…

    其他 2023年3月28日
    00
  • iscroll.js滚动加载实例详解

    iScroll.js滚动加载实例详解 介绍 iScroll.js是一款移动端滚动插件,可以实现移动端的滚动效果和滚动加载等功能。本文将详细介绍使用iScroll.js实现滚动加载的方案。 iScroll.js iScroll.js是一款专门为移动端开发的滚动插件,它可以实现各种滚动效果、滚动加载,同时支持多种设备和浏览器。 滚动加载 滚动加载就是一种页面加载…

    other 2023年6月25日
    00
  • 讲解vue-router之什么是嵌套路由

    讲解vue-router之什么是嵌套路由 在Vue.js中,Vue Router是一个官方的路由管理器,用于实现单页面应用程序(SPA)的导航功能。嵌套路由是Vue Router提供的一种功能,它允许我们在一个路由下定义子路由,从而实现更复杂的页面结构和导航。 嵌套路由的概念 嵌套路由是指在一个父级路由下定义子级路由的一种方式。父级路由可以包含多个子级路由,…

    other 2023年7月27日
    00
  • Java ClassLoader虚拟类实现代码热替换的示例代码

    Java ClassLoader虚拟类实现代码热替换的示例代码攻略 1. 概述 Java ClassLoader是Java虚拟机(JVM)的一部分,用于加载Java类。通过自定义ClassLoader,我们可以实现类的热替换,即在运行过程中动态替换类的实现代码,而不需要重新启动应用程序。 2. 实现步骤 下面将详细介绍如何实现Java ClassLoader…

    other 2023年6月28日
    00
  • win7系统清除usbstor记录

    在Windows 7系统中,当我们使用U盘或其他可移动存储设备时,系统会自动记录设备的使用历史,这些记录会存储在系统的usbstor目录中。这些记录包含敏感信息,因此我们需要定期清除它们。以下是清除Win7系统中usbstor记录的完整攻略: 打开“运”窗口 按下Win+R键,打开“运行”窗口。 输入“regedit”命令 在“运行”窗口中输入“regedi…

    other 2023年5月7日
    00
  • C语言二维数组指针的概念及使用

    当我们把一维数组的数组名(即指向数组首元素的指针)赋值给一个指针变量时,这个指针变量就指向了这个一维数组的首元素,因此可以通过数组名或指向它的指针访问该元素。同样的,当我们把二维数组的数组名作为指针变量的初值时,这个指针变量也指向了这个二维数组的首元素(即第一行第一列的元素),可以通过数组名或指向它的指针访问该元素,而数组名本身指向的也是二维数组的首元素。这…

    other 2023年6月25日
    00
  • 微信公众平台token验证失败的解决办法

    以下是“微信公众平台token验证失败的解决办法的完整攻略”的详细讲解,过程中包含两个示例说明的标准Markdown格式文本: 微信公众平台token验证失败解决办法的完整攻略 在使用微信公众平台开发时,我们需要进行token验证以确保安全性。然而,有时候我们会遇到token验证失败的情况。本文将介绍如何解微信公众平台token验证失败的问题,并提供两个常见…

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