实现两个多项式的加和
是数据结构课程的引例之一,主要使用单链表来实现。有助于有序线性序列(线性表)组织和管理的理解。
本文内容较为简单,实现比较基础,没有考虑到乱序输入等情况,有较大优化空间。
代码
使用C语言实现。
# include <stdio.h>
# include <stdlib.h>
# define STOP -1
typedef struct _node {
/*
定义结点结构体,每个节点代表一个输入的单项式
int ai为单项式系数
int exp为单项式指数
next为指向下一个结点的指针
*/
int ai;
int exp;
struct _node* next;
} Node;
typedef struct _list {
/*
定义List结构体,便于在函数中操作结点
每个List代表一个多项式链表
head指向该链表的头
tail指向该链表的任意位置(生成链表时是最新位置)
*/
Node* head;
Node* tail;
} List;
void getpoly(List* plist); // 获取多项式(调用getmo
void getmo(List* plist, int ai, int exp); // 获取单项式
List polyplus(List* plist_1, List* plist_2); // 加和多项式(调用plusmo、attachmo、moveplist)
void plusmo(List* plusres, List* plist_1, List* plist_2); // 当单项式指数相等且和不为0时,系数相加
void attachmo(List* plusres, List* plist); // 当单项式指数不同时,直接附加到结果
void moveplist(List* plist); // 根据运算情况,移动多项式链表中指向单项式的tail指针
void printres(List* plusres); // 根据运算结果,以合理格式输出
void polyfree(List* plist); // 释放多项式链表的空间
int main()
{
/*
获取两个多项式链表
定义两个List list
分别调用getpoly
*/
List list_1 = {
NULL, NULL};
List list_2 = {
NULL, NULL};
puts("请按照第一个多项式指数从大到小输入(系数,指数),没有常数项则以(0, 0)为结尾。");
getpoly(&list_1);
puts("请按照第二个多项式指数从大到小输入(系数,指数),没有常数项则以(0, 0)为结尾。");
getpoly(&list_2);
/*
依据输入情况输出运算结果
如果两个多项式存在有效输入,定义储存结果的多项式链表,调用polyplus计算并输出,最后释放空间
如果只有list_1存在有效输入,输出list_1
如果只有list_2存在有效输入,输出list_2
如果两个多项式输入均无效,则输出提示
*/
if (list_1.head && list_2.head) {
List plusres = polyplus(&list_1, &list_2);
printres(&plusres