21xrx.com
2024-12-22 22:34:21 Sunday
登录
文章检索 我的文章 写文章
C++实现单链表形式的一元多项式
2023-07-13 01:17:09 深夜i     --     --
C++ 单链表 一元多项式

单链表是一种非常常见的数据结构,而在数学领域中,多项式也是一种非常重要的概念。因此,将两者结合起来,实现单链表形式的一元多项式,是一项非常有意义的任务。

在C++中,实现单链表形式的一元多项式,有以下几个步骤:

1. 定义一元多项式的项(节点)结构体

在单链表中,每个节点都需要存储数据和指向下一个节点的指针。而在一元多项式中,每个项包含系数和指数两个数据。因此,我们可以定义一个节点结构体,如下所示:


struct Term {

  double coef; // 系数

  int exp;   // 指数

  Term* next;  // 指向下一个节点的指针

};

2. 创建单链表,保存一元多项式的项

在创建单链表时,我们需要先创建一个头节点。头节点不存储任何数据,只是为了方便操作而存在。接着,我们可以逐个插入项,保证它们按照指数递减的顺序排列。具体代码如下:


Term* create_poly() {

  Term* head = new Term 0; // 创建头节点

  Term* tail = head;           // 创建尾节点指针,初始指向头节点

  double coef;

  int exp;

  std::cout << "请输入一元多项式的项,按照指数递减的顺序输入,输入0 0表示输入结束。\n";

  std::cin >> coef >> exp;        // 输入首项系数和指数

  while (exp != 0) {           // 如果输入的不是末项

    Term* t = new Term nullptr; // 创建新节点

    tail->next = t;           // 将新节点追加到尾节点后面

    tail = t;              // 更新尾节点指针

    std::cin >> coef >> exp;      // 继续输入下一项

  }

  return head;

}

3. 输出一元多项式

输出一元多项式时,我们需要对每一项进行格式化,并按照一个项一个项的顺序输出。具体代码如下:


void print_poly(Term* head) {

  Term* p = head->next;

  while (p != nullptr) {

    std::cout << p->coef;

    if (p->exp == 1)

      std::cout << "x";

     else if (p->exp != 0) {

      std::cout << "x^" << p->exp;

    }

    if (p->next != nullptr) {

      std::cout << " + ";

    }

    p = p->next;

  }

  std::cout << std::endl;

}

4. 实现一元多项式的加法

一元多项式的加法可以分为以下几个步骤:

- 遍历两个单链表,将其中相同的项合并存储在一个新的单链表中;

- 将两个单链表中剩余的项追加到新的单链表中;

- 返回新的单链表。

具体代码如下:


Term* poly_add(Term* l1, Term* l2) {

  Term* head = new Term nullptr; // 创建头节点

  Term* tail = head;           // 创建尾节点指针,初始指向头节点

  Term* p1 = l1->next;          // p1指向l1的首项

  Term* p2 = l2->next;          // p2指向l2的首项

  while (p1 != nullptr && p2 != nullptr) {

    if (p1->exp == p2->exp) {      // 如果两个项的指数相同

      double coef = p1->coef + p2->coef;

      if (coef != 0) {        // 如果系数不为0

        Term* t = new Term coef; // 创建新节点

        tail->next = t;       // 将新节点追加到尾节点后面

        tail = t;          // 更新尾节点指针

      }

      p1 = p1->next;         // p1和p2都向后移动

      p2 = p2->next;

    } else if (p1->exp > p2->exp) {   // 如果l1中的项指数大于l2中的项指数

      Term* t = new Term p1->exp; // 创建新节点

      tail->next = t;         // 将新节点追加到尾节点后面

      tail = t;            // 更新尾节点指针

      p1 = p1->next;         // p1向后移动

    } else {              // 否则,l1中的项指数小于l2中的项指数

      Term* t = new Term p2->exp; // 创建新节点

      tail->next = t;         // 将新节点追加到尾节点后面

      tail = t;            // 更新尾节点指针

      p2 = p2->next;         // p2向后移动

    }

  }

  while (p1 != nullptr) {         // 将l1中剩余的项追加到新链表中

    Term* t = new Term p1->coef;

    tail->next = t;

    tail = t;

    p1 = p1->next;

  }

  while (p2 != nullptr) {         // 将l2中剩余的项追加到新链表中

    Term* t = new Term nullptr;

    tail->next = t;

    tail = t;

    p2 = p2->next;

  }

  return head;

}

5. 测试

最后,我们可以编写测试函数,测试上述代码的正确性。具体代码如下:


int main() {

  std::cout << "请输入第一个一元多项式:\n";

  Term* l1 = create_poly();

  std::cout << "第一个一元多项式为:";

  print_poly(l1);

  std::cout << "请输入第二个一元多项式:\n";

  Term* l2 = create_poly();

  std::cout << "第二个一元多项式为:";

  print_poly(l2);

  Term* l3 = poly_add(l1, l2);

  std::cout << "两个一元多项式的和为:";

  print_poly(l3);

  return 0;

}

通过上述步骤,我们成功地实现了单链表形式的一元多项式,在进行加法等运算时也可以轻松地使用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复