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

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

coef  exp next

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

该算法需要求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面向对象,把每个结构体看作一个类,里面有许多参数,把思维转变成面向对象的想法来编写算法,就是一个大进步!

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

  1. 数据结构与算法:单链表(利用万能指针实现对任意类型数据进行操作)

    前言 C语言的指针真的很强大,万能指针更强大,可以指向任意类型的数据.在上篇博客 数据结构与算法:单链表(超详细实现)中用C语言实现了单链表的相关算法,不过却有局限性 只能针对某一种数据类型还是不够强 ...

  2. 数据结构与算法之单链表

    数据结构与算法之单链表 //链表的实现/*实现单链表的 构建.数据添加.数据删除(返回元素所在位置).数据查找(返回元素所在的位置)的算法设计:*/ //链表的实现/*实现单链表的 构建.数据添加.数 ...

  3. 【1138】数据结构上机测试2-1:单链表操作A(顺序建表+删除节点)(SDUT)

    数据结构上机测试2-1:单链表操作A Time Limit: 1000ms   Memory limit: 4096K  有疑问?点这里^_^ 题目描述 输入n个整数,先按照数据输入的顺序建立一个带头 ...

  4. 数据结构(二)——单链表的头插与尾插

    一.引言 上篇文章我们知道了顺序表的缺点: 插入和删除操作需要移动大量元素. 数组的大小不好确定. 存储分配需要一整段连续的存储空间,不够灵活,造成很多碎片(空闲的空间得不到利用). 所以我们就引入了 ...

  5. 数据结构练习:运用单链表实现图书管理系统(c/c++)(内含带头结点的单链表的基本操作)

    数据结构练习:运用单链表实现图书管理系统 正文 注意 部分功能运行展示 所包含头文件及结构体的定义 自定义函数 主函数 完整代码 结束语 正文 本程序使用带头节点的单链表存储结构实现,共有六个基本功能 ...

  6. C语言——一元多项式定义求和 [单链表] (数据结构)

    输入多项式项数后,对多项式进行描述,将求两个多项式和 仅为demo基础版,可拓展. 单链表实现 #include<stdio.h> #include<stdlib.h> #in ...

  7. 数据结构与算法:单链表(超详细实现)

    实现算法预览 这次博主写的单链表主要实现了以下算法.所有功能可进行循环运行测试.欢迎各位指正. LinkList.h #pragma once #ifndef __LINKLIST_H__ #defi ...

  8. 数据结构与算法篇-单链表

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 作者丨写代码的牛顿 来源丨编程学习总站 01 - 单链表结点定义以及操作函数声明 我们知道在C语言里数组 ...

  9. 西电数据结构上机题目-删除单链表中介于min与max之间的结点

    希望学长的代码能给大二西电er们带来帮助(大家一定要好好学习数据结构,合理利用资源) 大家找到了什么bug或有什么改进意见可以私信我或在下方留言,我都会看的 不多说废话直接上代码 #include&l ...

最新文章

  1. :未来5-10年,NLP将走向成熟
  2. with(nolock)简解
  3. EQueue 2.3.2版本发布(支持高可用)
  4. 设置图像的title_【HTML】2 图像标签和属性
  5. Java基础题笔记2
  6. 门面设计模式php,学习php设计模式 php实现门面模式(Facade)
  7. Xcode 开发 控件如何和代码配合使用
  8. OpenCV-扩充图像边界cv::copyMakeBorder
  9. 浅谈android应用之编程语言
  10. 自动驾驶仿真测试的意义
  11. Socket套接字,一个简单的聊天室案例!
  12. Kata Container是什么?
  13. mpvue微信小程序动画_mpvue 与微信小程序的火花
  14. mysql error 1_mysql 启动错误(InnoDB: Operating system error number 1
  15. 最热门的十种编程语言,总有一种适合你
  16. TCP-IP详解卷一(一)概述
  17. mysql blob 存取乱码问题
  18. 测开- Junit 单元测试框架
  19. 怎样把视频压缩到100M?如何在线无损压缩视频?
  20. Linux目录权限管理

热门文章

  1. plc中int数据类型范围_PLC数据类型
  2. 1650显卡能带动144hz吗_1060能带动144hz吗
  3. 极限运算法则-----------极限存在准则
  4. Pygame合集】回忆杀-“童年游戏”,看看你中几枪?(附五款源码自取)
  5. Pjsip笔记之pjsip使用示例
  6. 如何阅读文献、如何写文献笔记、如何写文献综述
  7. 40页PPT学会从0到1建设数据仓库
  8. Windows下Arduino安装ardublock(附文件下载链接)
  9. 比较原始的QQ大家来找茬的原型
  10. TextView 设置了ellipsize后面没有省略号