【C 数据结构】 用单链表存储一元多项式,并实现两个多项式相加运算。

这篇具有很好参考价值的文章主要介绍了【C 数据结构】 用单链表存储一元多项式,并实现两个多项式相加运算。。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本次代码纯c语言,可以支持输入两个多项式的项式、系数、指数。

实验目的:
1 掌握单链表的基本工作原理;
2 实现链式存储下的两个多项式的相加。
实验步骤
1 定义链式存储的数据结构
2 完成多项式的初始化,即给多项式赋初值
3 完成多项式的输出
4 实现多项式的相加及结果输出。

/* 采用CLion的外部控制台运行*/
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <windows.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MAXSIZE 100    //最大长度


// 单链表的定义
typedef struct PNode {
    int coef;           //系数
    int expn;           //指数
    struct PNode *next; //节点的指针域
} PNode, *Polynomial;

void greatePolyn(Polynomial p, int num);            // 链表的初始化
void printout(Polynomial p, char num[]);            // 打印多项式
Polynomial AddPolyn(Polynomial ha, Polynomial hb);  //多项式相加
void returnMenu();                                  // 返回主界面
int menu();

PNode L1, L2;


// 链表的初始化
void greatePolyn(Polynomial p, int num) {
    Polynomial s;
    Polynomial pre, q;
    int n;
    printf("请输入第%d个多项式的项数:", num);
    scanf("%d", &n);
    p->next = NULL;
    pre = p;
    // 依次输入n个非零项
    for (int i = 1; i <= n; ++i) {
        s = (Polynomial) malloc(sizeof(PNode));
        s->next = NULL;
        printf("输入系数与指数");
        scanf("%d%d", &s->coef, &s->expn);

        q = p->next;
        while (q && q->expn < s->expn) {
            //通过比较指数找到第一个大于输入项指数的项*q
            pre = q;
            q = q->next;
        }
        s->next = q; //将输入项插入*q和其前驱节点pre之间
        pre->next = s;
        pre = s;
    }
    printf("第%d个多项式输入结束\n\n", num);
}


// 打印多项式
void printout(Polynomial p, char num[]) {
    int n = 0;
    Polynomial t = p;
    printf("\n%s\n", num);
    while ((t = t->next)) {
        n++;
    }
    p = p->next;
    for (int i = 1; i < n; i++) {
        if (p->coef != 0 && p->expn == 0)
            printf("%d+", p->coef);
        else if (p->coef < 0) {
            printf("\b%dx^%d+", p->coef, p->expn);
        } else
            printf("%dx^%d+", p->coef, p->expn);
        p = p->next;
    }

    if (p->coef < 0) {
        printf("\b%dx^%d", p->coef, p->expn);
    } else
        printf("%dx^%d", p->coef, p->expn);

    printf("\n");
}


// 两个多项式相加
Polynomial AddPolyn(Polynomial ha, Polynomial hb) {
    int c;
    Polynomial pa = ha->next, pb = hb->next, s, tc, hc;//将两个指针指向两个链表
    hc = (Polynomial) malloc(sizeof(PNode));//创建个新链表
    hc->next = NULL;
    tc = hc;//指针指向新链表
    while (pa != NULL && pb != NULL) {
        if (pa->expn > pb->expn) {
            s = (Polynomial) malloc(sizeof(PNode));
            s->expn = pb->expn;
            s->coef = pb->coef;
            tc->next = s;
            tc = s;
            pb = pb->next;
        } else if (pa->expn < pb->expn) {
            s = (Polynomial) malloc(sizeof(PNode));
            s->expn = pa->expn;
            s->coef = pa->coef;
            tc->next = s;
            tc = s;
            pa = pa->next;
        } else//遇到相同的指数,开始运算

        {
            c = pa->coef + pb->coef;
            if (c != 0) {
                s = (Polynomial) malloc(sizeof(PNode));
                s->expn = pa->expn;
                s->coef = c;
                tc->next = s;
                tc = s;
            }//c=0,就是直接跳下去
            pa = pa->next;
            pb = pb->next;
        }
    }
    if (pb != NULL)pa = pb;
    while (pa != NULL) {
        s = (Polynomial) malloc(sizeof(PNode));
        s->expn = pa->expn;
        s->coef = pa->coef;
        tc->next = s;
        tc = s;
        pa = pa->next;
    }
    tc->next = NULL;
    return hc;
}

// 返回主界面
void returnMenu() {
    printf("\n\n是否返回主界面?(y/n)\n");
    getchar();
    if (getchar() == 'y') {
        system("cls");
        menu();
    }
}


int menu() {
    Polynomial L;
    printf("\t多项式相加运算\t\n");
    printf("\t     1.多项式的创建\t\n");
    printf("\t     2.多项式的打印 \t\n");
    printf("\t     3.多项式的相加 \t\n");
    printf("=================================\n");
    printf("请输入要执行的操作: ");
    int l;
    scanf("%d", &l);
    switch (l) {
        case 1:
            system("cls");
            printf("请输入分别输入两个多项式:\n\n");
            for (int i = 1; i < 3; i++) {
                if (i == 1)
                    greatePolyn(&L1, i);
                else
                    greatePolyn(&L2, i);
            }
            returnMenu();
            break;
        case 2:
            system("cls");
            for (int i = 1; i < 3; i++) {
                if (i == 1)
                    printout(&L1, "第1个多项式如下");
                else
                    printout(&L2, "第2个多项式如下");
            }
            returnMenu();
            break;
        case 3:
            system("cls");
            L = AddPolyn(&L1, &L2);
            printout(L, " 相加后的多项式如下");
            returnMenu();
            break;
        default:
            printf("[输入错误]请重新输入有效数字!\n");
            Sleep(1000);
            system("cls");
            menu();
            break;
    }
}

int main() {
    menu();
}

链表 求两个一元多项式之和,数据结构,算法,c语言,链表

 多项式的创建

链表 求两个一元多项式之和,数据结构,算法,c语言,链表

多项式的打印

链表 求两个一元多项式之和,数据结构,算法,c语言,链表

 多项式的相加

 链表 求两个一元多项式之和,数据结构,算法,c语言,链表文章来源地址https://www.toymoban.com/news/detail-739625.html

到了这里,关于【C 数据结构】 用单链表存储一元多项式,并实现两个多项式相加运算。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构:链表应用:第1关:基于链表的两个一元多项式的基本运算

    任务描述 本关任务:给定两个一元多项式A(x)与B(x),利用链表表示A(x)与B(x),实现A(x)与B(x)的加法、减法、乘法和求导运算。 编程要求 输入 输入多组数据,总计n*( a+b+2)+1行。其中,第一行整数n代表总计有n组数据,之后依次输入n组数据。每组数据包括a+b+2行,其中第一行是两

    2024年04月12日
    浏览(33)
  • 题02-线性结构2 一元多项式的乘法与加法运算(C语言)

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月07日
    浏览(31)
  • 【数据结构】15 队列应用实例:多项式加法运算

    我们准备采用不带头节点的单向链表结构表示一元多项式,并按照指数递减的顺序排列各项。 对列表存放的两个多项式进行加法运算时,可以使用两个指针p1和p2。初始时的p1和p2分别指向这两个多项式第1个节点(指数的最高项)。通过循环不断比较p1和p2所指的节点,比较结

    2024年02月21日
    浏览(29)
  • 【ZZULI数据结构实验一】多项式的三则运算

    📃 博客主页: 小镇敲码人 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧月,独傲天下百坚强。 男儿应有龙腾志,盖世一意转洪荒。 莫使此生无痕度,终归人间一捧黄。🍎🍎🍎 ❤️ 什么?你问我答案,少年你看,下一

    2024年04月15日
    浏览(41)
  • 南京邮电大学数据结构实验一(线性表的基本运算及多项式的算术运算)(代码篇)

    小伙伴们要多多体会,不要全部借鉴哦!

    2024年02月08日
    浏览(40)
  • 【链表应用】| 一元多项式的操作

    专栏推荐:写文章刚刚起步,各个专栏的知识点后续会补充完善,不断更新好文,希望大 家支持一下。 专栏 名字 Elasticsearch专栏 es spring专栏 spring开发 redis专栏 redis学习笔记 项目专栏 项目集锦 修bug专栏 bug修理厂 设有两个一元多项式: p(x)=p0+p1x+p2x2+···+pnxn q(x)=q0+q1x+q2x2+··

    2024年02月06日
    浏览(28)
  • 一元多项式相加问题(两种方法)

    一元多项式的相加问题,主要运用了线性结构的合并,在合并线性结构的基础上,增加判断,所以我们可以将这个问题理解为一个复杂的线性表合并问题  目录 问题描述 一、顺序表法 1.1 初始化并创建顺序表 1.2 一元多项式相加算法 1.3 完整代码 二、单链表法 1.1 初始化并创

    2024年02月06日
    浏览(37)
  • 一元稀疏多项式简单计算器(C语言)含注释

    问题描述 设计一个一元稀疏多项式简单计算器 基本要求 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; (

    2024年02月08日
    浏览(30)
  • PTA 习题3.6 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月07日
    浏览(29)
  • Python做曲线拟合(一元多项式拟合及任意函数拟合)

    目录 1. 一元多项式拟合 使用方法 np.polyfit(x, y, deg) 2. 任意函数拟合 使用 curve_fit() 方法 实例: (1)初始化 x 和 y 数据集 (2)建立自定义函数 (3)使用自定义的函数生成拟合函数绘图  polyfig 使用的是最小二乘法,用于拟合一元多项式函数。 参数说明: x 就是x坐标,

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包