数据结构单向不循环链表实现多项式合并

多项式合并

思路

  • 多项式合并

    P1 = 5 + 2x + 8x ^8 +3x^16

    P2 = 6x + 16x^6 - 8x^8

    P = P1 + P2 = 5 + 8x + 16x^6 + 3x^16

  • 使用带头结点的单向不循环链表

  • 每个节点分为三个部分,系数项,指数项,指针域

image-20210503195842241

  • 结构体表示为

    struct node_st
    {int exponent;int coefficient;struct node_st *next;
    };
    
  • 定义两个指针p,q,分别指向多项式P1,P2第一个有效节点

  • 在定义一个指针r,保存合并结果,p的前驱指向不确定,r表示p的前驱,r可以指向p,也可以指向q

  • image-20210503201502267

  • 比较p指向节点的指针项与q指向节点的指针项

    • p->exponent == q->exponent

      指数项不变,系数项相加

      • 若系数之和为零

      p = p->next;
      q = q->next;

      • 若系数之和不为零

        r->next = p;
        r = p;

        p = p->next;
        q = q->next;

    • p->exponent > q->exponent

      r->next = q;
      r = q;
      q = q->next;

    • p->exponent < q->exponent

      r->next = p;

      r= p;

      p = p->next;

代码

main.c(负责测试)

#include<stdio.h>
#include<stdlib.h>
#include "polynomial.h"
int main()
{//p1,p2表示多项式struct node_st *p1 = NULL, *p2 = NULL;//数组中第一个元素为系数,第二个元素为指数int arr1[][2] = { {5,0},{3,16},{8,8},{2,1} };int arr2[][2] = { {16,6},{-8,8},{6,1} };p1 = poly_create(arr1,4);if (p1 == NULL){return -1;}p2 = poly_create(arr2,3);if (p2 == NULL){return -1;}poly_show(p1);poly_show(p2);poly_union(p1, p2);poly_show(p1);poly_destroy(p1);poly_destroy(p2);return 0;
}

polynomial.c(负责函数定义)

#include<stdio.h>
#include<stdlib.h>
#include "polynomial.h"struct node_st* poly_create(int arr[][2],int row)
{struct node_st *ps = NULL,*prenode = NULL,*curnode = NULL;struct node_st *newnode = NULL;int i = 0;//生成头结点ps = (struct node_st*)malloc(sizeof(struct node_st));if (ps == NULL){return NULL;}ps->next = NULL;for (i = 0; i < row; i++){prenode = ps;curnode = ps->next;//按照指数从小到大的顺序插入有效节点while ((curnode != NULL) && (curnode->exponent < arr[i][1])){prenode = curnode;curnode = curnode->next;	}//生成新节点newnode = (struct node_st*)malloc(sizeof(struct node_st));if (newnode == NULL){return NULL;}newnode->coeffitient = arr[i][0];newnode->exponent = arr[i][1];newnode->next = prenode->next;prenode->next = newnode;}return ps;
}void poly_show(struct node_st* ps)
{struct node_st *p = ps->next;printf("%3s\t%3s\n", "系数", "指数");while (p){printf("%3d\t%3d\n", p->coeffitient, p->exponent);p = p->next;	}
}//多项式合并,p2向p1上合并,p1保存合并后的结果
void poly_union(struct node_st *p1, struct node_st *p2)
{struct node_st *p = p1->next;struct node_st *q = p2->next;struct node_st *r = p1,*temp=NULL;while (p&&q){if (p->exponent > q->exponent){temp = (struct node_st*)malloc(sizeof(struct node_st));if (temp == NULL){return;}temp->coeffitient = q->coeffitient;temp->exponent = q->exponent;temp->next = q->next;r->next = temp;r = temp;q = q->next;}else if (p->exponent < q->exponent){r->next = p;r = p;p = p->next;}else if (p->exponent == q->exponent){p->coeffitient += q->coeffitient;if (p->coeffitient){r->next = p;r = p;}p = p->next;q = q->next;}}if (p == NULL){r->next = q;}if (q == NULL){r->next = p;}}void poly_destroy(struct node_st* ps)
{struct node_st *cur = ps->next,*next = NULL;while (cur){next = cur->next;free(cur);cur = next;	}free(ps);ps = NULL;
}

polynomial.h(负责函数声明)

#ifndef POLYNOMIAL_H__
#define POLYNOMIAL_H__
struct node_st
{int coeffitient;int exponent;struct node_st *next;
};
struct node_st* poly_create(int arr[][2], int row);
void poly_show(struct node_st* ps);
void poly_destroy(struct node_st* ps);
void poly_union(struct node_st *p1, struct node_st *p2);
#endif

运行结果

image-20210503203024010

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261499.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决Warning: Cannot modify header information – headers already sent by

Warning: Cannot modify header information – headers already sent by….这类语句&#xff0c;造成这个原因是因为setcookie语句的问题。 上网找了半天&#xff0c;有人说要在文件开头写上ob_start(); output_buffering 改成4096 也失败失败。 后来打开 php.ini 然后把 outp…

下 终端_Linux/UNIX 下终端复用利器 tmux

tmux 是一个终端复用器(terminal multiplexer)。简介tmux 是一个终端复用器类自由软件&#xff0c;功能类似 GNU Screen&#xff0c;但使用 BSD 许可发布。用户可以通过 tmux 在一个终端内管理多个分离的会话&#xff0c;窗口及面板&#xff0c;对于同时使用多个命令行&#xf…

约瑟夫环(杀人游戏)

问题描述&#xff1a; 刚学数据结构的时候&#xff0c;我们可能用链表的方法去模拟这个过程&#xff0c;N个人看作是N个链表节点&#xff0c;节点1指向节点2&#xff0c;节点2指向节点3&#xff0c;……&#xff0c;节点N - 1指向节点N&#xff0c;节点N指向节点1&#xff0c;这…

oracle insert两个关联表

现有一张老师学生表(tb_tea_cou)&#xff0c;由于业务需要&#xff0c;需把老师学生表tb_tea_stu拆分成两张表(tb_tea、tb_cou)&#xff0c;并把记录insert到这两张子表中(tb_tea、tb_cou为关联的两张表)。 表结构如下&#xff1a;tb_tea_cou( id, //pk name, //任课老师 …

消失的字符串——c语言函数中的数据存储方式以及字符串实现

2019独角兽企业重金招聘Python工程师标准>>> 事情是这样的&#xff0c;最近在学习翁老师的Mooc之C语言程序设计&#xff0c;插一句&#xff0c;真的是好老师&#xff0c;讲的真的太好了&#xff0c;在c里的字符串这里&#xff0c;翁老师演示了一个小程序&#xff0c…

JQuery 文本框高亮显示插件

以前使用Mootools Js框架&#xff0c;文本框有个$(id).highlight()高亮方法&#xff0c;使其高亮显示&#xff0c;效果如下&#xff1a; JQuery 中没有这个方法&#xff0c;自己今天写了一个Plugin&#xff0c;把代码贴出来分享一下&#xff1b; 代码如下&#xff1a; jquery-h…

优秀工程师应该具备哪些素质_一名优秀工程师所需要具备的条件和素质[1]

一名优秀工程师所需要具备的条件和素质碰到一个不相熟的人。“上学还是工作&#xff1f;(我看起来还不算老嘛)”“工作了&#xff0c;一年多一点。”“做什么的&#xff1f;”“半导体行业的。”“哦&#xff0c;具体做什么呢&#xff1f;”“嗯......工程师。”工程师——这就…

链方法[C# 基础知识系列]专题三:如何用委托包装多个方法——委托链

最近研究链方法&#xff0c;稍微总结一下&#xff0c;以后继续补充&#xff1a; 弁言&#xff1a; 上一专题分析了下编译器是如何来翻译委托的&#xff0c;从中间语言的角度去看委托&#xff0c;希望可以帮助大家进一步的理解委托&#xff0c;然而之前的分析都是委托只是封装一…

51单片机lcd1602的简单实用

基础知识准备 lcd1602简介 图片来自b站斌哥单片机 需要关注的有以下几点&#xff1a; RS : 高数据低命令&#xff1b;RS 1时&#xff0c;lcd1602读写数据&#xff0c;RS0时&#xff0c;lcd1602读写命令R/W&#xff1a;高读低写&#xff1b;RW1时&#xff0c;单片机读取lcd160…

firedebug调试Jquery

不了解的同学先“点这里”看看什么是Firebug。简单来说&#xff0c;Firebug是Firefox上用来监视、编辑和调试站点的CSS、HTML、DOM和JavaScript的扩展工具。 我们先到Firebug的主页上下载最新的版本装上&#xff0c;下面开始调试&#xff1a; 1、查看、编辑HTML元素及其(转) 安…

linux下Bash编程until语句及格式化硬盘分区等编写脚本(十)

linux下Bash编程until语句及格式化硬盘分区等编写脚本(十)1.循环语句结构总结1.1.while语句当条件满足时&#xff0c;进入循环语句while 条件; do语句done1.2.until语句当条件不满足时&#xff0c;进入循环语句until 条件; do语句done1.3.for 变量 in 列表; do 循环体done1.4.f…

halcon区域腐蚀膨胀算子_Halcon算子

Halcon部分算子功能&#xff1a;*读取一张图像read_image(Image,C:/Users/Desktop/无标题.png)*画一个矩形生成区域draw_rectangle1(3600, Row1, Column1, Row2, Column2)*获得矩形区域gen_rectangle1(Rectangle, Row1, Column1, Row2, Column2)*区域内最大、最小、最大-最小灰…

51单片机数字钟的实现

作业 用51单片机完成一个数字钟的计时及校时功能。 1、设置8个数码管的显示缓冲区为DISPBUFF[8],并初始化为02,02,-,04,08,-,03,06. 2、定时器0每隔5ms刷新一次数码管显示缓冲区&#xff0c;并显示时间(中断来做&#xff09; 3、定时器1负责精确定时&#xff0c;计时1s,每隔…

Google Map API 学习三

转载于:https://www.cnblogs.com/MyFlora/p/3154066.html

委托声明----委托实例化-----委托调用

定义和使用委托分三个步骤&#xff1a; 1、委托声明。2、委托实例化。3、委托调用。 一、定义委托定义委托的语法如下&#xff1a; <访问修饰符> delegate 返回类型 委托名(); 定义委托和定义方法很相似&#xff0c;委托没有具体的实现体&#xff0c;由关键字delegate声明…

慎用SELECT INTO复制表

很多时候我们习惯于用SELECTINTO 复制一个表或表结构&#xff0c;因为它方便&#xff0c;快捷&#xff0c;而且在某些情况下效率比INSERT INTO 效率要高一些。但是要注意&#xff1a; SELECT INTO 复制表或表结构的时候&#xff0c;只是得到了一个“外壳”&#xff0c;就像克隆…

mysql sql语句使用技巧

mysql更新数据限制limitmysql更新时&#xff0c;要更新记录中某个区间的数据&#xff0c;只能用WHERE条件来限制了&#xff0c;用LIMIT只能限制更新多少条&#xff01;测试如下&#xff1a;UPDATE products SET goods_number goods_number10 ORDER BY goods_id DESC LIMIT 5,1…

wingdows安装psutil_psutil模块安装指南(win与linux)

1、windows下psutil模块安装&#xff1a;https://pypi.python.org/packages/3.4/p/psutil/下载符合版本的软件包下载&#xff0c;然后安装即可。2、ubuntu下载psutil模块的tar包安装复制代码 代码示例:wget https://pypi.python.org/packages/source/p/psutil/psutil-2.1.3.tar…

信号的采样与插值重建(包含matlab)

实验任务 双频信号的采样和插值重建&#xff1a;对双频信号进行采样&#xff08;符合奈奎斯特低通采样定理&#xff09;&#xff0c;绘制波形和频谱&#xff1b;编制sinc函数插值函数&#xff0c;对采样进行恢复&#xff0c;绘制波形。 实验原理 matlab代码 clear all; clos…

dc概论之IO约束

版权声明&#xff1a;转载时请以超链接形式标明文章原始出处和作者信息及本声明http://bb2hh.blogbus.com/logs/39654476.html 注明&#xff1a;如需转载&#xff0c;请注明作者出处&#xff0c;谢谢&#xff5e;&#xff0c;Author&#xff1a;pythonlong以下根据资料和个人体…