函数功能说明:

Void InitList(PolyNode &L) /初始化多项式单链表*/
Int GetLength(PolyNode*L) /求多项式单链表的长度/
PolyNode GetElem(PolyNode *L,int i) /返回多项式单链表中第i个结点的指针*/
PolyNode Locate(PolyNode *L,float c,inte) /在多项式单链表中按值查找*/
int InsElem(PolyNode &L,float c,inte,int i) /在多项式单链表中插入一个结点*/
int DelElem(PolyNode L,int i) /在多项式单链表中删除一个结点*/
void DispList(PolyNode L) /输出多项式单链表的元素值*/
void CreaPolyList(PolyNode &L,floatC[],int E[],int n) /创建一个链表 */
void SortPloy(PolyNode &L) /对L的多项式单链表按expn域递增排序*/
PolyNode AddPoly(PolyNode *pa,PolyNode*pb) /两个多项式单链表合并*/
2、以单链表作为存储结构插入多项式:多项式按幂从高到低,以“系数,幂”的格式输入,并以“0,0”结束。
3、多项式相加,单链表合并 :
1)两个多项式对应的单链表头节点开始,依次扫描各节点;
2)若两表的节点均非空:比较二者的幂,按幂大者先入表。如果幂相等,则系数相加再入表;
3) 若有一链表已空,则将非空链表插入新表;
4) 输出合并后的链表;
5) 主函数调用,完成多项式相加。

算法实现:

一.一元多项式加法:
1.建立多项式:尾插法建立一元多项式的链表,通过键盘输入多项式的系数和指数,以输入系数0为结束标志,并约定建立一元多项式链表时,总是按指数从小到大的顺序排列。
2.输出多项式:从单链表的第一项开始逐项读出系数和指数,按多项式的形式输出。
3.多项式相加:设La和Lb分别表示两个多项式。Lc表示和多项式。p,q,r分别表示指向单链表的当前项比较指数大小。
(1)若La->expexp,则结点p应是和多项式中的一项,将p复制到r,并使p后移。
(2)若La->exp = Lb->exp,则将两个结点中的系数相加,当和不为0时,La的系数域加上Lb的系数域作为Lc的系数域;若和为0,则和多项式中没有这一项,p,q后移。
(3)若La->exp > Lb->exp,则将结点q复制到Lc中,q后移。

二.一元多项式减法
算法:将减数多项式的所有系数先变为相反数,然后调用多项式相加的函数进行运算。

三.一元多项式乘法
两个多项式相乘,应该是第一个多项式中的每一项分别与第二个多项式相乘,将相乘得到的结果都存在第一个多项式中,再调用合并多项式的函数。我写的多项式相乘用到了两重循环,合并多项式也用到了两重循环。

代码如下:

#include <stdio.h>
#include <malloc.h>
typedef struct node
{      float coef;            /*序数*/  int expn;              /*指数*/  struct node *next;    /*指向下一个结点的指针*/
} PolyNode;
void InitList(PolyNode *&L)        /*初始化多项式单链表*/
{  L=(PolyNode *)malloc(sizeof(PolyNode));    /*建立头结点*/         L->next=NULL;
}
int GetLength(PolyNode *L)        /*求多项式单链表的长度*/
{  int i=0;  PolyNode *p=L->next;  while (p!=NULL)              /*扫描单链表L,用i累计结点个数*/  {  i++;p=p->next;  }  return i;
}
PolyNode *GetElem(PolyNode *L,int i)    /*返回多项式单链表中第i个结点的指针*/
{  int j=1;  PolyNode *p=L->next;  if (i<1 || i>GetLength(L))   return NULL;  while (j<i)                      /*沿next域找第i个结点*/  {  p=p->next;j++;  }  return p;
}
PolyNode *Locate(PolyNode *L,float c,int e)    /*在多项式单链表中按值查找*/
{  PolyNode *p=L->next;  while (p!=NULL && (p->coef!=c ||p->expn!=e))  p=p->next;  return p;
}
int InsElem(PolyNode *&L,float c,int e,int i)  /*在多项式单链表中插入一个结点*/
{  int j=1;  PolyNode *p=L,*s;  s=(PolyNode *)malloc(sizeof(PolyNode));  s->coef=c;s->expn=e;s->next=NULL;  if (i<1 || i>GetLength(L)+1)   return 0;  while (j<i)         /*查找第i-1个结点*p*/  {  p=p->next;j++;  }  s->next=p->next;  p->next=s;  return 1;
}
int DelElem(PolyNode *L,int i)        /*在多项式单链表中删除一个结点*/
{  int j=1;  PolyNode *p=L,*q;  if (i<1 || i>GetLength(L))   return 0;  while (j<i)             /*在单链表中查找第i-1个结点,由p指向它*/  {  p=p->next;j++;  }  q=p->next;           /*q指向被删结点*/  p->next=q->next;     /*删除*q结点*/  free(q);  return 1;
}
void DispList(PolyNode *L)        /*输出多项式单链表的元素值*/
{  PolyNode *p=L->next;  while (p!=NULL)  {  printf("(%g,%d) ",p->coef,p->expn);  p=p->next;  }  printf("\n");
}
void CreaPolyList(PolyNode *&L,float C[],int E[],int n)
{  int i;  InitList(L);  for (i=0;i<n;i++)  InsElem(L,C[i],E[i],i+1);
}
void SortPloy(PolyNode *&L)    /*对L的多项式单链表按expn域递增排序*/
{  PolyNode *p=L->next,*q,*pre;  L->next=NULL;  while (p!=NULL)   {  if (L->next==NULL)                     /*处理第1个结点*/  {  L->next=p;p=p->next;  L->next->next=NULL;  }  else                                  /*处理其余结点*/  {  pre=L;q=pre->next;  while (q!=NULL && p->expn>q->expn)  /*找q->expn刚大于或等于p->expn的结点*q的前驱结点*pre*/  {  pre=q;q=q->next;  }  q=p->next;                      /*在*pre结点之后插入*p*/  p->next=pre->next;  pre->next=p;  p=q;  }      }
}
PolyNode *AddPoly(PolyNode *pa,PolyNode *pb)
{  PolyNode *pc,*p1=pa->next,*p2=pb->next,*p,*tc,*s;  pc=(PolyNode *)malloc(sizeof(PolyNode));           /*新建头结点*pc*/      pc->next=NULL;        /*pc为新建单链表的头结点*/  tc=pc;                /*tc始终指向新建单链表的最后结点*/  while (p1!=NULL && p2!=NULL)   {  if (p1->expn<p2->expn)     /*将*p1结点复制到*s并链到pc尾*/  {  s=(PolyNode *)malloc(sizeof(PolyNode));  s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;  tc->next=s;tc=s;  p1=p1->next;  }  else if (p1->expn>p2->expn)  /*将*p2结点复制到*s并链到pc尾*/  {  s=(PolyNode *)malloc(sizeof(PolyNode));  s->coef=p2->coef;s->expn=p2->expn;s->next=NULL;  tc->next=s;tc=s;  p2=p2->next;  }  else   /*p1->expn=p2->expn的情况*/  {  if (p1->coef+p2->coef!=0)    /*序数相加不为0时新建结点*s并链到pc尾*/  {  s=(PolyNode *)malloc(sizeof(PolyNode));  s->coef=p1->coef+p2->coef;s->expn=p1->expn;  s->next=NULL;  tc->next=s;tc=s;  }  p1=p1->next;p2=p2->next;  }  }  if (p1!=NULL) p=p1;  /*将尚未扫描完的余下结点复制并链接到pc单链表之后*/  else p=p2;  while (p!=NULL)   {  s=(PolyNode *)malloc(sizeof(PolyNode));  s->coef=p->coef;s->expn=p->expn;s->next=NULL;  tc->next=s;tc=s;  p=p->next;  }  tc->next=NULL;        /*新建单链表最后结点的next域置空*/  return pc;
}
void main()
{  PolyNode *L1,*L2,*L3;  float C1[]={3,7,5,9},C2[]={-9,8,22};  int E1[]={1,0,17,8},E2[]={8,1,7};  InitList(L1);  InitList(L2);  InitList(L3);  CreaPolyList(L1,C1,E1,4);  CreaPolyList(L2,C2,E2,3);  printf("***两多项式相加运算***\n");  printf("原多项式A:\n");DispList(L1);  printf("原多项式B:\n");DispList(L2);  SortPloy(L1);  SortPloy(L2);  printf("排序后的多项式A:\n");DispList(L1);  printf("排序后的多项式B:\n");DispList(L2);  L3=AddPoly(L1,L2);  printf("多项式相加结果:\n");DispList(L3);
}  

数据结构--一元多项式相关推荐

  1. 数据结构-一元多项式加减程序

    //一元多项式加减程序 //程序:张建波 //时间:2005/7/12 PM:20-08 //功能: //     1:可以计算 1+2+3-1+2-5+6+3 (加减法均可) //     2: 可 ...

  2. 数据结构—— 一元多项式的加法运算

    一. 需求分析 0.问题描述 在数学上,一个一元n次多项式 可按降序写成: 它由n+1个系数唯一确定,因此,在计算机里他可以用一个线性表表示: 设Pn(x)和Qn(x)分别为两个一元多项式,请求出两个 ...

  3. 数据结构——一元多项式相加(C语言版本)

    本关任务:设计一种单链表存储结构,每个结点存储一项的系数和指数,类型都是整型,编写完成产生多项式的函数.多项式相加及输出多项式的函数. 相关知识 为了完成本关任务,你需要掌握: 如何存储一个一元多项式 ...

  4. 数据结构 - 一元多项式相加减(C语言)

    通常情况下,一元多项式可写成: an(x) = a1x^e1 + a2x^e2 + a3x^e3 + ... + amx^em (数字,m为下标),其中:pi是指数为ei的项的非零系数,0<= ...

  5. 数据结构一元多项式求导_Joahua的数据结构笔记(二)

    说明:以下笔记中,代码全为伪代码,请自行阅读与理解.下一篇文章即将用一个小小的实验题来对文章内容进行验证和实现. 文章结尾将会放出实验题,可以先行思考. 第一章 线性表 2.1 线性表的定义和特点 定 ...

  6. 数据结构—— 一元多项式的运算(相加,相减,相乘)【C语言实现】

    用 C语言实现一元多项式的运算(相加,相减,相乘) 1.创建多项式时,无论指数项按什么顺序输入,输出均能实现以升幂顺序输出,且输入时有相同指数项时能够实现合并. 2.能够代入确切的X计算出最终多项式的 ...

  7. C语言数据结构一元多项式

    //定义多项式最大项数#include<stdio.h>#include<malloc.h>#define MAX 20//定义存放多项式的数组类型typedef struct ...

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

    实验内容:把任意给定的两个一元多项式P(x) ,Q(x) 输入计算机,计算它们的和并输出计算结果. 一元多项式可以用单链表表示,结点结构图示如下: coef  exp next 首先分析一下这个过程是 ...

  9. 数据结构之链表创建一元多项式,求一元多项式之和

    数据结构之链表创建一元多项式,求一元多项式之和 前言 对于一元多项式,我们完全可以利用线性表P(a0,a1,a2,-,an)表示,这样的线性表在求两个多项式相加等操作时确实简单,但是多于如下的多项式: ...

最新文章

  1. 斗地主发牌编程PHP,JAVA代码之斗地主发牌详解
  2. 大数据处理系列之(一)Java线程池使用
  3. 测试架构师的目标和价值
  4. mysql 5.5 重新编译_源码编译mysql5.5过程记录
  5. mongodb 如何删除 字段值为 json对象中的某个字段值
  6. 数据结构与算法(基于C++语法实现)
  7. linux内核module_init,Linux内核模块中module_init和init_module有什么区别?
  8. 高德地图iOS SDK使用
  9. 处理方块之间的连接线
  10. Mac硬件温度管理软件TG Pro
  11. OA考勤打卡系统功能点
  12. 为虚幻4安装VS2019
  13. Typora无法打开提示安装新版本解决办法
  14. Unity 用ml-agents机器学习造个游戏AI吧(2)(入门DEMO)
  15. ButterKnife系列之手写实现
  16. Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建
  17. 向《数据科学实战》作者Cathy O'Neil提问!
  18. 工商变更:吴忌寒退出北京比特大陆法定代表人,詹克团接任
  19. 【转载】基于rasa的对话系统搭建(下)
  20. 详细解析Linux scp命令的应用

热门文章

  1. Python进程池Pool的使用
  2. Java类名的命名规则
  3. Java Socket(一)使用TCP传输字符串
  4. Mycat 1.6日志分类-Sequoia数据库相关日志
  5. 线性模型之二:线性回归模型性能的评估(残差图、MSE与R2)
  6. Spanish FF Live Support
  7. JS判断输入的字符串是否是数字(正则表达式)
  8. 君子生非异也,善假于物也
  9. USB-DFP UFP DRP模式
  10. 直方图均衡化(Histogram equalization)与直方图规定化