单链表的应用(多项式相加)

2023-10-29

目录

题目内容

算法分析

概要设计

 流程图

 

代码块

运行结果


题目内容

      完成两个多项式的相加操作:已知有两个多项式Pm(x)、Qm(x),设计算法实现Pm(x)+Qm(x)运算,而且对加法运算不重新开辟存储空间。要求用链式存储结构实现。例如:Pm(x)=5x^3+2x=1,Qm(x)=3x^3+x^2-2x-3,其计算输出结果为:8x^3+1x^2-2。

算法分析

   本设计使用单链表实现。

两个多项式相加算法的实现,首先是将两个多项式分别用链表进行存放。可以设置两个指针LA1和LB1分别从多项式Pm(x)和Qm(x)的首结点移动,比较LA1和LB1所指结点的指数项,则可以分下面三种情况进行处理:

  1. 若LA1->exp<LB1->exp,则LA1所指结点为多项式中的一项,LA1指针在原来的基础上向后移动一个位置。
  2. 若LA1->exp=LB1->exp,将对应项的系数相加,然后分两种情况处理:如果系数项的和为0,则释放LA1和LB1所指向的结点;如果系数项的和不为零,则修改LA1所指向结点的系数域,释放LB1结点。
  3. 若LA1->exp>LB1->exp,则LB1所指向结点为多项式中的一项,LB1指针在原来的基础上向后移动一个位置。

概要设计

程序中设计了四个函数:

  1. 函数Init()用来初始化一个空链表
  2. 函数CreateFromTail()用来创建一个链表,这里是用尾插法来创建链表
  3. 函数Polyadd()用来实现两个多项式相加算法
  4. 函数Print()用来输出多项式

 流程图

 

 代码块

/**
* @author:sy
* @date:2021-9-30
* @version:1.0
* @ Description:完成两个多项式相加操作
*/ 
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct poly
{
	int exp;  //指数幂
	int coef; //系数
	struct poly*next;  //指针域 
}PNode,*PLinklist;
int Init(PLinklist*head)  //链表初始化
{
	*head=(PLinklist)malloc(sizeof(PNode));
	if(*head)
	{
		(*head)->next=NULL;
		return 1;
	}
	else
	return 0;
 } 
int CreateFromTail(PLinklist *head)  //尾插法创建链表
 {
 	PNode *pTemp,*pHead;
 	int c;   //存放系数
	int exp; //存放指数
	int i=1; //计数器提示用户输入第几项
	pHead=*head;
	scanf("%d,%d",&c,&exp);
	while(c!=0)   //系数为0表示结束输入
	{
		pTemp=(PLinklist)malloc(sizeof(PNode));
		if(pTemp)
		{
			pTemp->exp=exp;  //接收指数
			pTemp->coef=c;   //接收系数
			pTemp->next=NULL;
			pHead->next=pTemp;
			pHead=pTemp;
			scanf("%d,%d",&c,&exp); 
		}
		else
		return 0;
	 } 
	 return 1;
  } 
void Polyadd(PLinklist LA,PLinklist LB)  //两个多项式相加,该方法中两个表都是按指数顺序增长
  {
  	//对指数进行对比分三类情况:A<B时将A链到LA后,A==B时比较系数,A>B时将B链到表中
	  PNode*LA1=LA->next;  //用于在LA中移动
	  PNode*LB1=LB->next;  //用于在LB中移动
	  //LA与LB在充当LA1和LB1 的前驱
	  PNode*temp; //保存要删除的结点
	  int sum=0;  //存放系数的和
	  while(LA1&&LB1)
	  {
	  	if(LA1->exp<LB1->exp)
	  	{
	  		LA->next=LA1; //LA的当前结点可能是LB1或LA1
			LA=LA->next;
			LA1=LA1->next;
		  }
		  else if(LA1->exp==LB1->exp) //指数相等系数相加
		  {
		  	sum=LA1->coef+LB1->coef;
		  	if(sum)  //系数不为0,结果存入LA1中,同时删除结点LB1
			{
				LA1->coef=sum;
				LA->next=LA1;
				LA=LA->next;
				LA1=LA1->next;
				temp=LB1;
				LB1=LB1->next;
				free(temp);
			 } 
			 else  //系数为0时的情况下删除两个结点
			 {
			 	temp=LA1;
			 	LA1=LA1->next;
			 	free(temp);
			 	temp=LB1;
			 	LB1=LB1->next;
			 	free(temp);
			  } 
		   } 
		   else
		   {
		   	LA->next=LB1;
		   	LA=LA->next;
		   	LB1=LB1->next;
		   }
	   } 
	   if(LA1)   //将剩余结点链入链表
	        LA->next=LA1;
		else
		    LA->next=LB1; 
} 
void Print(PLinklist head) //输出多项式
{
	head=head->next;
	while(head)
	{
		if(head->exp)
		   printf("%dx^%d",head->coef,head->exp);
		else
		   printf("%d",head->coef);
		if(head->next)
		   printf("+");
		else
		   break;
		head=head->next;
	}
 } 
 int main()
 {
 	PLinklist LA; //多项式列表LA
	PLinklist LB; //多项式列表LB
	Init(&LA);
	Init(&LB);
	printf("输入第一个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
	CreateFromTail(&LA);
	printf("输入第二个多项式的系数,指数(例如10,2)输入0,0结束输入\n");
	CreateFromTail(&LB);
	Print(LA);
	printf("\n");
	Print(LB);
	printf("\n");
	Polyadd(LA,LB);
	printf("两个多项式相加的结果:\n");
	Print(LA); //相加后结果保存在LA中,打印LA 
	printf("\n");
 }

运行结果

注意:这里两个多项式按指数增长输入,运行如下:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单链表的应用(多项式相加) 的相关文章

  • spring底层核心原理解析

    目录 一 Spring如何创建一个对象 二 Bean的创建生命周期 三 推断构造方法 四 Spring的构造方法设计 五 利用cglib进行Aop的流程 六 spring判断对象要不要进行aop 一 Spring如何创建一个对象 Annot
  • 阿里云轻量应用服务器和云服务器ECS区别(终于懂了)

    阿里云服务器ECS和轻量应用服务器有什么区别 云服务器ECS是明星级云服务器 轻量应用服务器可以理解为简化版的云服务器ECS 轻量适用于单机应用 云服务器ECS适用于集群类高可用高容灾应用 阿里云百科来详细说下阿里云轻量应用服务器和云服务器

随机推荐

  • 腾讯云服务器ubuntu18.04搭建FastDFS文件服务器

    腾讯云服务器ubuntu18 04搭建FastDFS文件服务器 FastDFS简介 FastDFS是用c语言编写的一款开源的分布式文件系统 FastDFS为互联网量身定制 充分考虑了冗余备份 负载均衡 线性扩容等机制 并注重高可用 高性能等
  • 华为OD机试 - 消消乐游戏(Java)

    题目描述 游戏规则 输入一个只包含英文字母的字符串 字符串中的两个字母如果相邻且相同 就可以消除 在字符串上反复执行消除的动作 直到无法继续消除为止 此时游戏结束 输出最终得到的字符串长度 输入描述 输入原始字符串 str 只能包含大小写英
  • 2022西山居seed游戏开发训练营笔试复盘

    1 c基础 char arr1 a b c b char arr2 abcd int arr3 10 0 arr1和arr2的区别 cout lt lt sizeof arr1 lt lt endl cout lt lt sizeof ar
  • gcc 选项

    1 c选项 gcc命令后直接跟源文件会对源文件进行预处理 编译 链接生成默认名为a out的可执行文件 而 c选项会处理到编译环节终止 生成一个目标文件 默认名为filename o 它必须再经过链接才最终生成可执行文件 2 g选项 创建符
  • scss、less

    SCSS 是 Sass 3 引入新的语法 是Sassy CSS的简写 是CSS3语法的超集 其语法完全兼容 CSS3 并且继承了 Sass 的强大功能 可以简单理解为scss是sass的一个升级版本 完全兼容sass之前的功能 又有了些新增
  • 吃鸡服务器维护7月5号,绝地求生7月5日更新到几点好?更新进不去怎么办?

    绝地求生7月5日更新内容 绝地求生7月5日更新到几点好 更新进不去怎么办 在绝地求生大逃杀中 为了让大家有个更好的游戏体验环境 绝地求生将于7月5日对游戏进行停机更新 本次更新到几点 很多玩家都不知道 下面就和小编一起去看看 绝地求生正式版
  • SpringBoot 用户登录(二)登录增加验证码

    一 需求分析 SpringBoot 用户登录 一 基础登录 在登录的基础上加上验证码验证 验证码过期时间为一分钟 二 解决思路 在后台生成UUID和验证码返回到前台 并将UUID作为key 验证码内容作为value存入redis 设置过期时
  • ajax获取后台图片数据流如何处理?

    当我们利用ajax从后台获取图片的时候 一般有两种方法 一种是获取后台传递过来的图片的url 一种是获取后台传递过来的图片数据流 当我们获取图片数据流的时候 应该这样处理这些数据流 让它在前台展示出图片 HTML img src alt J
  • 用apache james做简单的垃圾邮件过滤网关(转)

    网络环境如下 三台服务器 1 网关 公网IP 2 domino邮件服务器 3 另一台服务器 通过把网关的端口25 映射到domino服务器上 让domino服务器可以收发邮件 同时domino服务器还要把部分邮件转发到服务器3上 大家的发邮
  • 801冠号大全及桃花荧光

    第一 存量少是801升值的基本依据 801共158个冠号 天蓝 荧光 冠号去除一部分 桃花荧光油墨的占到801的总量的80 以上 有荧光满版网格的又分为 1 满版红桃花荧光 满版底纹网格荧光 2 满版金桃花荧光 满版底纹网格荧光 3 满版桃
  • JavaWeb——SSJDBC(struts2,spring,jdbc)框架,正向工程

    原文地址 http blog csdn net sapce fish article details 52900750 本文采用struts2 spring jdbc搭建web框架 使用正向工程 IDE用myeclipse 数据库用Mysq
  • 实时汇率转换小程序(c++爬虫)

    实时汇率转换小程序 c 爬虫 利用c 网络爬虫爬取网页的实时汇率进行汇率的转换 其中也利用了QT进行了页面设计 define SILENCE STDEXT HASH DEPRECATION WARNINGS include
  • Linux下安装过程中编译PHP时报错:configure: error: jpeglib.h not found.

    今天在搭建LNMP编译PHP时 报错 configure error jpeglib h not found root cac3 php 5 6 22 configure gt prefix usr local php5 gt enable
  • Java Thread Join

    join方法的作用 在A线程中调用了B线程的join 方法时 表示只有当B线程执行完毕时 A线程才能继续执行
  • Opencv之答题卡识别判卷

    项目要求 提供一张答题卡图像 通过图像处理识别出答题卡上每个题的选项 与正确答案对比 得出分数并写在答题卡上 代码实现过程 1 引入需要的库 import numpy as np import cv2 as cv 2 定义绘图函数 def
  • 下代码下代码下代码

    https modelzoo co
  • linux c语言编译成exe,C/C++程序从编译到最终生成可执行文件的过程分析

    C C 程序编译步骤 如何生成可执行文件 电子计算机所使用的是由 0 和 1 组成的二进制数 二进制是计算机的语言的 基础 计算机发明之初 人们只能降贵纡尊 用计算机的语言去命令计算机干这干那 一 句话 就是写出一串串由 0 和 1 组成的
  • QT事件--阐述的比较系统

    转载 http www qtcn org bbs simple t31383 html Another Look at Events 再谈Events 最近在学习Qt事件处理的时候发现一篇很不错的文章 是2004年季刊的一篇文章 网上有这篇
  • 迷宫 蓝桥杯 641

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 X 星球的一处迷宫游乐场建在某个小山坡上 它是由 10 1010 10 相互连通的小房间组成的 房间的地板上写着一个很大的字母 我们假设玩家是面朝上坡的方向站
  • 单链表的应用(多项式相加)

    目录 题目内容 算法分析 概要设计 流程图 代码块 运行结果 题目内容 完成两个多项式的相加操作 已知有两个多项式Pm x Qm x 设计算法实现Pm x Qm x 运算 而且对加法运算不重新开辟存储空间 要求用链式存储结构实现 例如 Pm