数据结构一元多项式的相加-单链表实现

实验内容:把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果。

     一元多项式可以用单链表表示,结点结构图示如下:

 

coef expnext

       

首先分析一下这个过程是如何实现的

        该算法需要求A与B两个一元多项式的和,那么需要准备三个带头结点的单链表,首先从键盘依次输入A与B一元多项式各项的系数与指数,分别存入两个链表,接着搞个嵌套循环,外循环为A链表,内循环为B链表,功能为从A链表的第一个Node开始去遍历B链表的所有Node,如果有指数相等的Node,那么就将系数相加,存入一个新Node,使第三个链表指向新Node,紧接着删除被加过的Node,根据这个逻辑循环下来,我们可以得到一个求和过的第三个链表,求和完成。

        根据我编写算法过程中,有个需要特别注意的点:删除Node要搞清楚当前删除的是哪个Node,比如链表1->2->3,调用delete(SqList,2),即1->3,然后再调用一次delete(SqList,2),即1->NULL,这个点非常重要!在我编写算法过程中使我最困扰的一个问题,特别是在循环嵌套中使用这种方法没搞清楚时,难以排查错误!

程序代码

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef int DataType;//结点
typedef struct LNode {DataType coef;//系数DataType exp;//指数LNode *next;
} LNode, *LinkList;void getEle(LinkList L) {LinkList p;p = L->next;while(p) {if((p->coef)<0) {printf("-");} else {printf("+");}printf("%dx^%d",abs(p->coef),p->exp);p = p->next;}
}LinkList createList() {int coef;int exp;LinkList headNode;headNode = (LinkList)malloc(sizeof(LNode));int flag = 1;LinkList last = headNode;while(true) {printf("请输入式第%d个系数和指数,(输入404停止插入数据进链表):",flag);scanf("%d %d",&coef,&exp);if(coef == 404 || exp == 404) {break;}LinkList Node = (LinkList)malloc(sizeof(LNode));Node->coef = coef;Node->exp = exp;Node->next = NULL;last->next = Node;last = Node;flag++;}return headNode;
}//删除L链表中的第i个结点
void deleteElem(LinkList L, int i) {int j = 1;LinkList p,q;p = L;while(p->next && j < i) {p = p->next;//第i-1个结点j++;}q = p->next;//第i个结点p->next = q->next;free(q);
}LinkList getSum(LinkList LA, LinkList LB) {LinkList PA = LA->next;LinkList PB = LB->next;LinkList PSum = (LinkList)malloc(sizeof(LNode));//创建头节点LinkList p = PSum;p->next = NULL;int AFlag = 1;int BFlag = 1;while(PA) {PB = LB->next;BFlag = 1;
//		printf("\nA=%d",AFlag);while(PB) {//如果LA表和LB表指数相同,系数相加,并把相加结果放进新Node if(PA->exp == PB->exp) {LinkList q = (LinkList)malloc(sizeof(LNode));q->coef = (PA->coef) + (PB->coef);q->exp = PA->exp;q->next = NULL;p->next = q;p = q;deleteElem(LA,AFlag);PA = LA->next;deleteElem(LB,BFlag);PB = LB->next;//如果LA表和LB表指数不相同,把LA和LB分别放进两个新Node}else{LinkList q1 = (LinkList)malloc(sizeof(LNode));LinkList q2 = (LinkList)malloc(sizeof(LNode));q1->coef = PA->coef;q1->exp = PA->exp;q1->next = q2;q2->coef = PB->coef;q2->exp = PB->exp;q2->next = NULL;p->next = q1;p = q2;deleteElem(LA,AFlag);PA = LA->next;deleteElem(LB,BFlag);PB = LB->next;}
//			PB = PB->next;
//			printf("\nB=%d",BFlag);
//			BFlag++;}
//		PA = PA->next;
//		AFlag++;}getEle(LA);getEle(LB);return PSum;
}int main() {printf("请输入A式\n");LinkList AHead = createList();printf("\n请输入B式\n");LinkList BHead = createList();
//	getEle(AHead);
//	deleteElem(AHead, 2);
//	getEle(AHead);
//	getEle(BHead);printf("\nA和B一元多项式的和为:");LinkList sum = getSum(AHead, BHead);getEle(sum);printf("\n\nauthor by 2062011002-吴奇\n");return 0;
}

 

 实验结果与分析

  1. 输入A一元多项式,可以看到有负数也有正数
  2. 输入B一元多项式,可以看到有与A式不同的指数
  3. 最后得出正确结果

        该算法难度不高,核心内容为A与B求和,如在链表层面无法理解,不妨自行用两个数组去做个小实验:将A数组中的i索引中的值与B数组中的i索引中的值求和放进C数组,这一层面弄清楚之后,这个核心问题将不攻自破

总结

  1. 根据我编写算法过程中,有个需要特别注意的点:删除Node要搞清楚当前删除的是哪个Node,比如链表1->2->3,调用delete(SqList,2),即1->3,然后再调用一次delete(SqList,2),即1->NULL,这个点非常重要!在我编写算法过程中使我最困扰的一个问题,特别是在循环嵌套中使用这种方法没搞清楚时,难以排查错误!
  2. 除了其他方法,其中getSum()方法时间复杂度O(n2),感觉其中并没有改进余地,单链表也无法使用二分查找法,只可只用传统的遍历方法,假如这里我们用到了双向链表不知可否能用二分法。
  3. 其次我还认为输入方式不够优雅大气,其实可以将输入方式做一个字符串解析,去判断每一项之前是“+”还是“-”,将该项的系数与指数存入Node,只需在该算法的基础上修改一下输入方式解析一下即可,程序无需大改,但由于本人目前还在投入大量时间学习Java与英语,所以这一步暂时还未实现。
  4. 算法总体难度不高,搞懂结构体,面向结构体去编程,这里形似Java面向对象,把每个结构体看作一个类,里面有许多参数,把思维转变成面向对象的想法来编写算法,就是一个大进步!

 

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

一元多项式加减乘实现c/c++

一、实验题目&#xff1a; 一元多项式简单的计算器 1.主要功能&#xff1a; (1)输入并建立多项式&#xff1b; (2)输出多项式&#xff1b; (3)两个多项式相加&#xff0c;建立并输出和多项式&#xff1b; (4)两个多项式相减&#xff0c;建立并输出差多项式。 (5)算法的时…

一元多项式的加法

一元多项式的加法 问题描述&#xff1a;一元多项式的加法 &#xff08;1&#xff09; 编程实现一元多项式的加法。 &#xff08;2&#xff09; 编写一个测试主函数。 分析&#xff1a; 对于任意一元多项式 可以抽象为一个由“系数—指数”对构成的线性表&#xff0c;且线性表中…

一元多项式求导

问题描述&#xff1a; 设计函数求一元多项式的导数。&#xff08;注&#xff1a;x​n​​&#xff08;n为整数&#xff09;的一阶导数为nx​n−1​​。&#xff09; #include<cstdio> int main() {int a[100000];int b[100000];int n,m;char c;//判断结束的条件scanf(&q…

一元多项式课设

代码详见 目录 一、实习任务........................................................................................... - 1 - 1.问题描述&#xff1a;.................................................................................... - 1 - 2.小组分工.........…

数据结构:一元多项式及其基本运算

1、实现方式&#xff1a;可采用线性表的顺序存储结构&#xff0c;但是当多项式的每个项的指数差别很大时&#xff0c;会浪费很多存储空间。所以采用链式存储方式表示&#xff0c;每一项可以表示成一个结点&#xff0c;结点的结构由存放系数的coef域&#xff0c;存放指数的expn域…

一元多项式计算

目录 题目的内容及要求--------------------------------------------2需求分析-------------------------------------------------------2概要设计-------------------------------------------------------2 1、存储结构------------------------------------------------…

【数据结构】一元多项式的表示及相加

文章目录 ⭐️写在前面的话⭐️一元多项式的表示及相加初始化0_1、初始化链表0_2_1、头插法插入多项式的项(没有相同项)0_2_2、将要插入的相同&#xff0c;链表中有相同项&#xff0c;对应系数相加0_3、从链表中查找是否有相同的指数项0_4、对已经创建好的一元多项式按指数大小…

数据结构(严蔚敏)【一元多项式的运算】【C语言】

1、一元多项式的运算&#xff1a;实现两个多项式加、减乘运算 设计内容&#xff1a; 用顺序存储结构实现一元多项式的加法、减法和乘法。具体要求为&#xff1a;用五个函数分别实现一元多项式的创建、输出、加法、减法和乘法&#xff1b; 设计思路&#xff1a; 将顺序表数组…

算法竞赛入门【码蹄集进阶塔335题】(MT2151-2175)

算法竞赛入门【码蹄集进阶塔335题】(MT2151-2175&#xff09; 文章目录 算法竞赛入门【码蹄集进阶塔335题】(MT2151-2175&#xff09;前言为什么突然想学算法了&#xff1f;为什么选择码蹄集作为刷题软件&#xff1f; 目录1. MT2151 权值计算2. MT2152 黑客小码哥3. MT2153 来给…

Linux基础之LVM卷管理

LVM LVM是 Logical Volume Manager&#xff08;逻辑卷管理&#xff09;的简写&#xff0c;它是Linux环境下对磁盘分区进行管理的一种机制。Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地评估各分区大小&#xff0c;以分配合适的硬盘空间。普通的…

linux lvcreate,LFCS:如何使用vgcreate,lvcreate和lvextend命令管理和创建LVM - 第11部分...

因为在LFCS考试要求有效的二月变化 2&#xff0c;2016年 &#xff0c;我们增加了必要的专题到LFCS系列发表在这里。 为了准备这场考试&#xff0c;你是高度鼓励使用联邦经济竞争法系列为好。 LFCS&#xff1a;管理LVM和创建LVM分区 - 第11部分 安装Linux系统时最重要的决定之一…

lvm 制作

壹&#xff1a; 创建LVM 逻辑卷 1&#xff0c;将物理盘格式为pv卷&#xff08;物理卷&#xff09;&#xff0c;使用pvcreate 命令 pvcreate /dev/sdc 或则是 pvcreate /dev/sdc /dev/sdb pvdisplay 或pvs 命令查看 PV 物理卷得创建情况 2,创建卷组 VG 通过vgcreate 命令,将pv加…

lvcreate 常用命令举例

http://linux.cn/article-5117-1.html4 个 lvcreate 常用命令举例 2015-3-25 15:09| 查看: 2752| 评论: 3| 收藏: 3| 分享: 10 原文&#xff1a;http://www.ehowstuff.com/4-lvcreate-command-examples-on-linux/作者&#xff1a; skytech译文&#xff1a;LCTT https://linux.…

49.逻辑卷管理4,逻辑卷管理详解,lvscan,lvcreate,lvdisplay,lvextend,lvreduce,lvremove,lvresize,lvchange

逻辑卷相关操作 可以把逻辑卷想象成分区&#xff0c;那么这个逻辑卷当然也需要被格式化和挂载。另外&#xff0c;逻辑卷也是可以动态调整大小的&#xff0c;而且数据不会丟失&#xff0c;也不用卸载逻辑卷。 常用的命令有 lvscan Lvcreate Lvdisplay lvextend lvreduce Lvremov…

oppo手机删除计算机怎样恢复,【数据恢复篇】oppo手机删掉的照片怎么恢复

原标题&#xff1a;【数据恢复篇】oppo手机删掉的照片怎么恢复 手机删掉的照片可以恢复吗&#xff1f;oppo手机删掉的照片怎么恢复&#xff1f;很多人会奇怪oppo手机删掉的照片还能恢复吗&#xff1f;现在科技技术的提高&#xff0c;照片能够被恢复也是很简单的。像我们所知道的…

苹果手机照片误删恢复的方法

苹果手机照片误删恢复的方法&#xff1f;苹果手机相册里都有一个【最近删除】相册&#xff0c;为了恢复我们手机里误删的照片&#xff0c;我们首先可以打开相册&#xff0c;然后找里面的最近删除的相簿&#xff0c;看看里面有没有自己误删的照片&#xff0c;如果有的话&#xf…

android sd卡数据恢复软件下载,手机SD卡内存卡数据恢复软件

手机SD卡内存卡数据恢复软件免费版是一款专门解决内存卡等存储介质数据丢失问题的恢复软件&#xff0c;支持各个型号的SD卡、内存卡及U盘的删除恢复、格式化恢复等。 手机SD卡内存卡数据恢复软件是一款简单易用功能强大的数据恢复软件。该软件有针对性的对各类内存卡进行数据恢…

android 恢复照片误删,安卓手机数据恢复:红米手机照片误删怎么恢复

原标题&#xff1a;安卓手机数据恢复&#xff1a;红米手机照片误删怎么恢复 红米手机误删照片怎么恢复&#xff1f;小编的也爷爷使用的是红米手机&#xff0c;有一天跟我说“他误删了手机上的很多张照片&#xff0c;还一直抱怨自己眼花乱删东西”。小编就赶紧安慰爷爷还说会帮他…

android删除sd卡照片恢复,安卓手机照片误删怎么恢复

现如今国内大多的人都拥有一部智能手机&#xff0c;使用手机拍摄照片记录生活中的美好也成为了一种普遍流行的行为。当我们用手机照片记录身边点滴后&#xff0c;经过时间的打磨&#xff0c;我们也需要整理这些照片&#xff0c;误删照片随之成为一个严峻的问题&#xff0c;手机…

android删除手机照片恢复软件,安卓手机上照片删除如何恢复?

原标题&#xff1a;安卓手机上照片删除如何恢复&#xff1f; 安卓手机上的照片被删除了如何恢复&#xff1f;现在大部分手机都有手机最近删除相册&#xff0c;当发现手机上的数据被自己误删的时候&#xff0c;可以在手机最近删除相册中快速恢复。不过呢&#xff0c;最近删除的相…