如何用链表实现一元多项式相加

来源 :青年生活 | 被引量 : 0次 | 上传用户:zhp95869213
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  一元多项式的表示在计算机内可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。 链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。对于如何利用链表将两个一元多项式分别存入两个链表中,通过相加将链表合并后并输出合成后的新的一元多项式。在运行的过程中主要所运用的就是利用链表的data域相加完成链表的加法运算,输出相加之后的新一元多项式。
  数据结构的存储结构有两种:顺序储存结构和链式储存结构,而我们所做的一元多项式的相加及其表示,就是我们要把算法想象成是一种抽象的运行算法,将一元多项式抽象的想象成一个新的线性表。
  程序流程如下:
  使用typedef 和 struct 定义的新类型名称,其用途与内建类型的名称相同,可以用来:声明和初始化结构体变量;创建并根据自己的意愿初始化结构数组,用链表表示多项式时,每个链表结点储存多项式中的一个非零项,包括系数(data1)和指数(data2)两个数据域及一个指针域(next)。对应的数据结构定义为:
  typedef struct LNode
  {
  int data1;//系数
  int data2;//指数
  struct LNode *next;//指向下一节点的指针
  }LNode, *LinkList;
  之后需要初始化链表:因为实现目的过程需要使用链表进行算法的实现,所以开始时需要先创建两个有头结点的空链表,因为初始化的链表拥有两个data域(data1,data2)和一个指针域(next),我们要利用后插法建立单链表,将“X”的系数放入data1中,幂放入data2中,这样指针域next就可以存放下一个节点的地址,初始化函数void Init(LinkList *L)是一个无参函数,这样就能成功实现链表的初始化。
  在接下来的过程中,所用到的输入函数LinkList Creat(int n)是一个无返回值的有参函数,用于输入系数和指数。然后通过为“s”申请一块大小为(sizeof(LinkList))的内存,生成一个新的节点“*s”,之后就可以输入多项式当前项的系数和指数然后付给新结点*s的数据域。
  根据代码可以判断,我们将要进行指数大小判断,比较函数int Compare(int a, int b)
  当p1的指数大于p2的指数时,函数返回1,当p1的指数小于p2的指数时,返回-1,当p1的指数等于p2的指数时,返回0.
  连接函数void Attach(int c, int d, LinkList *pRear)
  该连接函数用于把得到的结果多项式一项一项的接到用front记录结果多项式链表的头结点的后面,为“p”申请一个新的节点,“p->date1/date2=c/d”表示对“p”这一链表拥有两个data域(data1,data2)进行赋值,将其当前所指向的新结点插入到这一时刻多项式所表达的尾部。
  void Attach(int c, int d, LinkList* pRear) {
  LinkList p;
  p = (LinkList)malloc(sizeof(LinkList));
  p->data1 = c;
  p->data2 = d;
  p->next = NULL;
  (*pRear)->next = p;
  *pRear = p;
  }
  多项式相加函数LinkList PolyAdd(LinkList p1, LinkList p2)
  该函数作为代码核心函数,作用是将两个一元多项式中指数相同的每一项加在一起,并返回结果多项式的首地址。首先利用“front”申请新的节点,将结果多项式链表的头节点用前面的“front”来进行记录,。在运算的过程中,就会出现两个多项式可能都有非零项需要进行处理,如果说“p1”的指数大于“p2”的指数,那么“p2”的系数和指数都将会存入多项式链表中,存储完成后,“p2”将会继续指向下一节点,
  由此可知,对于“p1”和“p2”的互相比较,为的就是哪一个先进行存入和指向下一步,同理,如果“p1”的指数小于“p2”的指数,那么“p1”的系数和指数都将会存入多项式链表中,存储完成后,“p1”将会继续指向下一节点,当然也不能忘记 “p1”和“p2”的指数相同这种情况,那么和刚刚的两种就会有些不同,他们会将自身相同的系数相加,相加完成之后生成的系数和“p1”的指数存入多项式链表,同时“p1”和“p2”指向下一个节点。
  节点的插入也会有顺序之分,当“p1”和“p2”两者中其中有一方已经完全的插入了多项式链表,那么紧接其后的就是另一方全部的插入多项式链表里,插入完成后让上一结构内的“front”去指向结果多项式的第一个非零项,这样就会将释放一个临时空表头结点。
  void PrintAns(LinkList ans)这部分的结构体,目的是为了将结果进行打印,将链表中第一个节点输出并指向下一节点,输出后开始对后续的节点依次进行输出,如果链表结束,输出的就是“0”。大部分的结构的进程或者注释都进行了很详细的注释,接下来就是对于我们这个一元多项式的相加进行测验,首先我们要做的就是属于第一个 多项式有几项,第二个多项式有几项,输入的第一个多项式要按照系数指数的顺序进行输入,同理,第二个多项式的顺序与第一个多项式的顺序相同,当然输入的项式的多少,取决于你要测试的项数,所后进行調式,产生最终的运算结果。   一元多项式的相加是对创建链表使用链表最简单的一种运用,大多数函数的使用更需要注重的是函数与函数之间的相互配合,下面所表述的是对实现一元多项式相加的全部代码:
  代码主体:
  #include<stdio.h>
  #include<stdlib.h>
  typedef struct LNode
  {
  int data1;
  int data2;
  struct LNode* next;
  } LNode, * LinkList;
  void Init(LinkList* L) {
  *L = (LinkList)malloc(sizeof(LinkList));
  (*L)->next = NULL;
  }
  LinkList Creat(int n) {
  LinkList h, s, t;
  t = h = (LinkList)malloc(sizeof(LinkList));
  for (int i = 0; i < n; i++) {
  s = (LinkList)malloc(sizeof(LinkList));
  h->next = s;
  h = s;
  scanf("%d%d", &s->data1, &s->data2);
  }
  h->next = NULL;
  t = t->next;
  return t;
  }
  int Compare(int a, int b) {
  if (a > b)
  return 1;
  if (a < b)
  return -1;
  if (a == b)
  return 0;
  }
  void Attach(int c, int d, LinkList* pRear) {
  LinkList p;
  p = (LinkList)malloc(sizeof(LinkList));
  p->data1 = c;
  p->data2 = d;
  p->next = NULL;
  (*pRear)->next = p;
  *pRear = p;
  }
  LinkList PolyAdd(LinkList p1, LinkList p2) {
  LinkList front, rear, temp;
  int sum;
  rear = (LinkList)malloc(sizeof(LinkList));
  front = rear;
  while (p1 != NULL && p2 != NULL) {
  if (Compare(p1->data2, p2->data2) == 1) {
  Attach(p2->data1, p2->data2, &rear);
  p2 = p2->next;
  } else if (Compare(p1->data2, p2->data2) == -1) {
  Attach(p1->data1, p1->data2, &rear);
  p1 = p1->next;
  } else if (Compare(p1->data2, p2->data2) == 0) {
  sum = p1->data1 + p2->data1;
  if (sum != 0)
  Attach( sum, p1->data2, &rear);
  p1 = p1->next;
  p2 = p2->next;
  }
  }
  for (; p1 != 0; p1 = p1->next)
  Attach(p1->data1, p1->data2, &rear);
  for (; p2 != 0; p2 = p2->next)
  Attach(p2->data1, p2->data2, &rear);
  rear->next = NULL;
  temp = front;
  front = front->next;
  free(temp);
  return front;
  }
  void PrintAns(LinkList ans) {
  if(ans==NULL) {
  printf("0");
  } else {
  printf("%dX^%d ",ans->data1,ans->data2);
  ans = ans->next;
  while(ans!=NULL) {
  printf("+ %dX^%d",ans->data1,ans->data2);
  ans = ans->next;
  }
  }
  printf("\n");
  }
  int main() {
  LinkList head1, head2;
  Init(& head1);
  Init(& head2);
  int m, n;
  scanf("%d", &m);
  scanf("%d", &n);
  head1 = Creat(m);
  printf("第一个多项 式:");
  PrintAns(head1);
  head2 = Creat(n);
  printf("第二个多项式:");
  PrintAns(head2);
  printf("相加结果:");
  PrintAns(PolyAdd(head1, head2));
  return 0;
  }
  在运算的过程中 切记注意节点使用的顺序以及位置,g注意与流程图的配合,搞清楚每个模块的需求,根据功能进行函數调用,最终达到代码的完美实现。
其他文献
摘要:作为一个特殊且重要的信息生产者----政府机构和政府官员,在当下不断变化的全媒体时代,其工作职责、社会功能、责任等方面都随之加入了“媒介属性”这个新的要素。由此政府部门和官员在工作生活中所表现出的言行举止、思维意识,也就被赋予了更高的对媒介素养的要求。  关键词:媒介素养;危机应对;舆情掌控  早在2012年,不少学者或单位都对政府机构,尤其是政府官员的媒介素养给出了具体的要求或是定义,如中
期刊
摘要:本文系统的回顾了唐代法律,深入挖掘唐代法律思维以及整个法律系统对现如今中国特色社会主义法律体系发展的的指引性作用。高度认可唐代法律和法律思想体系为中国特色社会主义法律体系的健全打下了坚实的基础,并肯定了其必要性。  关键词:唐代法律;中国特色社会主义法律体系;当代社会  一、背景及意义  回顾唐代,唐初统治者吸取前朝兴旺的教训,从一开始就采取一系列有效措施治理国家、执掌国政。在此大背景下,唐
期刊
摘要:近年来,我国影视行业进入了快速发展阶段,相应的影视文化体系也得到了完善,使得人们越来越重视影视文化水平提升。民族影视作为我国影视体系重要组成部分,也在该形势下得到了发展,对应的民族影视文化更是渗透到人们生活的方方面面,所以加大民族影视文化传播力度是非常重要和必要的,理应得到重视和关注。但实际的民族影视文化传播中还存在各种问题,给民族影视文化发展带来了不利影响,所以笔者根据相关文献,详细分析了
期刊
摘要:新时期国有企业思想政治工作是非常重要的工作之一,思想政治工作是促进员工发展的精神指导,是加强工作能力的重点。所以,国有企业要落实思想政治工作,促进改革开放发展速度,必不可少的就是创新,这对企业未来的长期发展拥有重要价值。然而国有企业的思想政治工作还具有许多的不足,限制了思想政治工作的开展,要求管理人员实施有效地对策进行处理,加强完成创新工作,并根据此研究新时期国有企业思想政治工作的创新措施。
期刊
摘要:1998年韩国“文化立国”方针以来,文化产业得到快速发展。韩国电视剧带动了韩国影视、音乐、旅游等领域共同发展,其带来的经济效益是大家有目共睹。本文将总结前期韩剧在我国的传播,并分析其的传播策略,进一步探讨韩剧对我国电视剧产业的发展的借鉴。  关键词:韩剧;电视剧产业;传播策略;启示  一、韩剧前期在国内的传播  韩剧在1993年至1997年间首次传入中国,当时中国对韩剧关注度极低;1998年
期刊
摘要:语言与文化是不可分离的,二者相互依存,相互促进。每一个国家语言中都包含着一系列的文化,我们可以认为语言是文化传承的重要载体,文化则是语言的重要组成部分。因此在英语文学作品翻译中,必须充分考虑文化因素,掌握文化与语言之间的关系,进而提升英语文学作品翻译的准确度。  关键词:文化构建;英语文学作品;翻译准确度;提升策略  前言:  一名专业的文学作品翻译者不仅要具备较高的专业化水平,而且要准确翻
期刊
摘要:高校新闻媒体是高校对内引导对外宣传的必要窗口,是提升教学工作影响促进高校办学质量的重要手段。本文基于对目前高校新闻媒体的发展先转进行问题分析,明确其重要性后提出了相应的对策与途径,帮助高校新闻媒体蓬勃发展。  关键词:高校;新闻媒体;发展困境;对策  随着高校办学改革的不断深入,新闻媒体工作也逐渐受到了越来越多的关注,作为舆论的主要引领者和消息的主要传播者,高校新闻媒体的存在有着不可替代的关
期刊
摘要:一直以来,我们人类跟环境的关系都是十分紧密的,无论是生产还是生活都离不开环境,因此,现如今我国经济快速发展的过程中也开始重视和强调对于环境的保护,特别是在当前人们生活质量大幅提高,城市一体化建设不断加快的重要时期,人们在建筑的要求上也越来越高,建筑设计师也需要在建筑设计过程中重视对于环境的保护,由此产生的绿色建筑理念本质上就是为了更好的实现对于环境的保护,将绿色景观运用到建筑中,实现对于环境
期刊
摘要:为促进我国房地产行业的繁荣发展,商品房预售制度,自1994年起,已在我国存在了约26年之久,在促进行业和国民经济快速发展中发挥了不可小觑的杠杆作用,但在近几年的发展中,商品房预售制度的风险和矛盾日益显露,为我国经济和社会的发展都带来了负面影响。关于是否应当取消商品房预售制度的讨论近日又引起了广泛管制,笔者将在本文中针对商品房预售制度的现状,分析两大阵营观点的基础上提出相关思考,希望能为此制度
期刊
摘要:近年来,在国家大力乡村振兴倡导之下,乡村旅游迅猛发展,2017年2月5日,“田园综合体”作为乡村新型产业发展的亮点措施被写进中央一号文件,田园综合体是集现代农业、休闲旅游、田园社区为一体的乡村综合发展模式,目的是通过旅游助力农业发展、促进三产融合的一种可持续性模式。本文在基于安丘市现有资源的基础上,提出了安丘市田园综合体项目规划的几点建议。  关键词:乡村旅游;休闲农业;田园综合体;一三产业
期刊