严蔚敏数据结构:链表实现一元多项式相加

一、基本概念

1、多项式pn(x)可表示成:  pn(x)=a0+a1x+a2x2+…+anxn。

listP={(a0,e0),(a1,e1),(a2,e2),…,(an,en) }。在这种线性表描述中,各个结点包括两个数据域,对应的类型描述为:

typedef struct node

{ double coef;            //系数为双精度型

  int expn;                //指数为正整型
  struct node *next;    //指针域
}polynode;          




二、算法思想
对两个一元多项式进行相加操作的运算规则是:假设指针qa和qb分别指向多项式A(x)和B(x)中当前进行比较的某个结点,则需比较两个结点数据域的指数项,有三种情况:

(1) 指针qa所指结点的指数值<指针qb所指结点的指数值时,则保留qa指针所指向的结点,qa指针后移;
(2) 指针qa所指结点的指数值>指针qb所指结点的指数值时,则将qb指针所指向的结点插入到qa所指结点前,qb指针后移;
(3) 指针qa所指结点的指数值=指针qb所指结点的指数值时,将两个结点中的系数相加。若和不为零,则修改qa所指结点的系数值,同时释放qb所指结点;反之,从多项式A (x)的链表中删除相应结点,并释放指针qa和qb所指结点。



#include "stdio.h"
#include "stdlib.h"
#define OK 1
#define ERROR -1
#define FALSE 0
#define TRUE 2
typedef int Status;typedef struct
{
float coef; //系数
int expn;   //指数
}term,ElemType;typedef struct LNode
{
ElemType data;
struct LNode *next;
}*Link,*Position;typedef struct
{
Link head,tail;
int len;
}LinkList;typedef LinkList polynomial; //用带头结点的有序链表表示多项式int cmp(term a,term b)
{
if(a.expn<b.expn) return -1;
else if(a.expn==b.expn) return 0;
else return 1;
}//cmpStatus InitList(polynomial &P)
{//构造一下空的线性链表
Link p;
p=(Link)malloc(sizeof(LNode));//生成头结点
if(p){p->next=NULL;P.head=P.tail=p;P.len=0;return OK;}//
else return ERROR;
}//InitListPosition GetHead(polynomial P)
{
return P.head;
}//PositionStatus SetCurElem(Position h,term e)
{
h->data=e;
return OK;
}//SetCurElemStatus LocateElem(LinkList P,ElemType e,Position &q,int(*cmp)(ElemType,ElemType))
{
Link p=P.head,pp;
do{pp=p;p=p->next;}while(p&&(cmp(p->data,e)<0));if(!p||cmp(p->data,e)>0){q=pp;return FALSE;}//ifelse //find it{q=p;return TRUE;}//else
}Status MakeNode(Link &p,ElemType e)
{
p=(Link)malloc(sizeof(LNode));
if(!p) return ERROR;
p->data=e;
return OK;
}//MakeNodeStatus InsFirst(LinkList &P,Link h,Link s)
{
s->next=h->next;
h->next=s;
if(h==P.tail)
P.tail=h->next;
++P.len;
return OK;
}//InsFirstvoid CreatPolyn(polynomial &P,int m){//输入m项的指数及系数,建立表示一元多项式的有序链表P
InitList(P);
Position h,q,s;
h=GetHead(P); //h指向P的头结点
term e;
e.coef=0.0;
e.expn=-1;
SetCurElem(h,e);//设置头结点的数据元素
printf("input the the value of m(indicate how many items)\n");
scanf("%d",&m);
printf("input (%d) ceof,expn(separated by ,)\n",m);
for(int i=1;i<=m;++i){scanf("%f,%d",&e.coef,&e.expn);if(!LocateElem(P,e,q,cmp)){if(MakeNode(s,e)) InsFirst(P,q,s);}//if不存在,则生成新结点并插入}//for
}//CreatPolynPosition NextPos(Link p)
{
return p->next;
}//NextPosElemType GetCurElem(Link p)
{
return p->data;
}//GetCurElemStatus DelFirst(LinkList L,Link h,Link &q)
{
q=h->next;
if(q)//非空链表{h->next=q->next;if(!h->next) //删除尾结点L.tail=h;L.len--;return OK;}//ifelse return FALSE; //链表空}//DelFirstvoid FreeNode(Link &p)
{
free(p);
p=NULL;
}//FreeNodeStatus ListEmpty(LinkList L)
{
if(L.len)return FALSE;
else return TRUE;
}//ListEmptyStatus Append(LinkList &L,Link s)
{
int i=1;
L.tail->next=s;
while(s->next){s=s->next;i++;}//whileL.tail=s;
L.len+=i;
return OK;
}//Appendvoid PrintPolyn(polynomial P)
{
Link q;
q=P.head->next;
printf("系数  指数\n");
while(q){printf("%f   %d\n",q->data.coef,q->data.expn);q=q->next;}//while
}//PrintPolynStatus ClearList(LinkList &L)
{
Link q,p;
if(L.head!=L.tail){p=q=L.head->next;L.head->next=NULL;while(p!=L.tail){p=q->next;free(q);q=p;}//whilefree(q);L.tail=L.head;L.len=0;}//if
return OK;
}//ClearListStatus DestroyPolyn(LinkList &L)
{ // 销毁线性链表L,L不再存在ClearList(L); // 清空链表FreeNode(L.head);L.tail=NULL;L.len=0;return OK;}//DestroyListvoid AddPolyn(polynomial &Pa,polynomial &Pb){ // 多项式加法:Pa=Pa+Pb,并销毁一元多项式PbPosition ha,hb,qa,qb;term a,b;ha=GetHead(Pa);hb=GetHead(Pb); // ha和hb分别指向Pa和Pb的头结点qa=NextPos(ha);qb=NextPos(hb); // qa和qb分别指向Pa和Pb中当前结点(现为第一个结点)while(qa&&qb){ // Pa和Pb均非空且ha没指向尾结点(qa!=0)a=GetCurElem(qa);b=GetCurElem(qb); // a和b为两表中当前比较元素switch(cmp(a,b)){case -1:ha=qa; // 多项式Pa中当前结点的指数值小qa=NextPos(ha); // ha和qa均向后移一个结点break;case 0: qa->data.coef+=qb->data.coef;// 两者的指数值相等,修改Pa当前结点的系数值if(qa->data.coef==0) // 删除多项式Pa中当前结点{DelFirst(Pa,ha,qa);FreeNode(qa);}elseha=qa;DelFirst(Pb,hb,qb);FreeNode(qb);qb=NextPos(hb);qa=NextPos(ha);break;case 1: DelFirst(Pb,hb,qb); // 多项式Pb中当前结点的指数值小InsFirst(Pa,ha,qb);ha=ha->next;qb=NextPos(hb);}}if(!ListEmpty(Pb)){Pb.tail=hb;Append(Pa,qb); // 链接Pb中剩余结点}DestroyPolyn(Pb); // 销毁Pb}int main()
{
polynomial Pa,Pb;
int m;
CreatPolyn(Pa,m);
PrintPolyn(Pa);
printf("Pa.len: %d\n",Pa.len);
CreatPolyn(Pb,m);
PrintPolyn(Pb);
printf("Pb.len: %d\n",Pb.len);
AddPolyn(Pa,Pb);
PrintPolyn(Pa);
printf("Pa.len: %d\n",Pa.len);
return 1;
}




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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java二十三设计模式之------工厂方法模式

一、工厂方法模式&#xff08;Factory Method&#xff09; 工厂方法模式有三种 1、普通工厂模式&#xff1a;就是建立一个工厂类&#xff0c;对实现了同一接口的一些类进行实例的创建。首先看下关系图&#xff1a; 举例如下&#xff1a;&#xff08;我们举一个发送邮件和短信的…

无法转化为项目财富的技术或功能就是垃圾

技术人员可能有个习惯&#xff0c;也可以叫通病&#xff0c;发现一个新技术&#xff0c;或者新的想法&#xff0c;会把某个现有的东西做的更好&#xff0c;或者可以增加某个功能让系统看上去更完美。 如果这是一个产品&#xff0c;那么大家都会鼓励你去做&#xff0c;如果我们…

ibatis oracle function,IBATIS调用oracle function(函数)的步骤实例

IBATIS调用oracle function(函数)的方法实例引用create or replace function getClassifiedCode(p_planCode in varchar2 -- 险种代码,p_usageAttributeCode in varchar2 -- 使用性质代码,p_ownershipAttributeCode in varchar2 -- 所属性质代码,p_vehicleTypeCode in varchar2…

一元多项式乘法算法

我认为大致算法应该是这样的: 首先准备一个空的链表L。利用第一个多项式的的指针所指的节点数值乘以多项式二的每一项&#xff0c;将结果保存在链表L中。 然后将指向该节点的指针后移到下一个节点继续进行乘法运算&#xff0c;将所得结果加到L中&#xff08;这个操作已经在一…

堆以及stl堆的使用

概念 性质: 1.堆是一颗完全二叉树&#xff0c;用数组实现。    2.堆中存储数据的数据是局部有序的。 最大堆&#xff1a;1.任意一个结点存储的值都大于或等于其任意一个子结点中存储的值。      2.根结点存储着该树所有结点中的最大值。 最小堆&#xff1a;1.任意一个结…

读【36岁IT老人再次随笔】的读后感,你会哪些计算机语言?

论坛首页一篇&#xff1a;社区“揭穿最大谎言”事件 &#xff0c; 我看了&#xff0c;也顺便看了里面另一位仁兄的【36岁IT老人再次随笔】 其中关键的地方就是一个例子&#xff1a;你会哪些计算机语言&#xff1f; 这个问题很有意思&#xff0c;确实如网友回复里说到的&#xf…

php接收vue请求数据axios,详解vue axios用post提交的数据格式

Content-type的几种常见类型一、是什么&#xff1f;是Http的实体首部字段&#xff0c;用于说明请求或返回的消息主体是用何种方式编码&#xff0c;在request header和response header里都存在。二、几个常用类型&#xff1a;1、application/x-www-form-urlencoded这应该是最常见…

数据结构中的逻辑结构简介

数据的逻辑结构是对数据之间关系的描述&#xff0c;有时就把逻辑结构简称为数据结构。逻辑结构形式地定义为&#xff08;K&#xff0c;R&#xff09;&#xff08;或&#xff08;D&#xff0c;S&#xff09;&#xff09;&#xff0c;其中&#xff0c;K是数据元素的有限集&#x…

applicationContext配置文件模板1

<?xml version"1.0" encoding"utf-8"?> <beans      --整个配置文件的根节点&#xff0c;包含一个或多个bean元素 xmlns    --最基本的命名空间定义 xmlns:xsi  --最基本的命名空间定义 xmlns:context  --启动自动扫描或注解装配…

时间复杂度的一些计算规则

一些规则(引自&#xff1a;时间复杂度计算 ) 1) 加法规则 T(n,m) T1(n) T2(n) O (max ( f(n),g(m) ) 2) 乘法规则 T(n,m) T1(n) * T2(m) O (f(n) * g(m)) 3) 一个特例&#xff08;问题规模为常量的时间复杂度&#xff09; 在大O表示法里面有一个特例&#xff0c;如…

职场新人面试误区:我的技术好,所以你必须要请我?

这个是论坛的一个帖子。 前几天有家软件公司联系到我&#xff0c;去之前电话里跟他们的项目经理聊了两句&#xff0c;什么都明白了就没去面试 是老板先给我打的电话&#xff0c;问我做J2EE多久了&#xff0c;期望薪水什么个范围。。。 然后老板说&#xff0c;你稍等&#xff…

Oracle 基础

为什么80%的码农都做不了架构师&#xff1f;>>> Oracle DB笔录&#xff0c;以后会不断Add&#xff0c;欢迎留言补充! --cmd.exe(你懂得!) --[1]多个数据库实例&#xff0c;切换选择DB后&#xff0c;登录操作 set ORACLE_SIDorcl --选择DB orcl(你的DB实例名) --可在…

Linux执行命令提示Password,linux expect远程自动登录以及执行命令

linux远程自动登录以及执行命令远程登录该自动登录的过程是通过shell里面expect实现的&#xff0c;类似相当于开了一个类似于cmd的命令段输出IP和密码。注意该脚本能够执行的前提是安装了expectyum install -y expect直接上脚本&#xff1a;#!/usr/bin/expect …

双塔

## 双塔 题目描述 有n个数字&#xff0c;要求将这n个数字分成两部分&#xff08;两部分可以数字个数不同&#xff09;&#xff0c;使得两部分数字之和的差最小 输入输出格式 输入&#xff1a; 第一行为n 第二行有n个数&#xff0c;即题目中所描述那样 输出&#xff1a; 两部分和…

时间复杂度计算杂记

算法时间复杂度的计算 [整理] 时间复杂度算法 基本的计算步骤 时间复杂度的定义 一般情况下&#xff0c;算法中基本操作重复执行的次数是问题规模n的某个函数&#xff0c;用T(n)表示&#xff0c;若有某个辅助函数f(n)&#xff0c;使得当n趋近于无穷大时&#xff0c;T(n)/f(n…

MyBatis 在xml文件中处理大于号小于号的方法

为什么80%的码农都做不了架构师&#xff1f;>>> 第一种方法&#xff1a;用转义字符&#xff08;注&#xff1a;对大小写敏感&#xff01; &#xff09; 用了转义字符把>和<替换掉&#xff0c;然后就没有问题了。 SELECT * FROM test WHERE 1 1 AND start_da…

linux 进程间读写锁,Linux系统编程—进程间同步

我们知道&#xff0c;线程间同步有多种方式&#xff0c;比如&#xff1a;信号量、互斥量、读写锁&#xff0c;等等。那进程间如何实现同步呢&#xff1f;本文介绍两种方式&#xff1a;互斥量和文件锁。##互斥量mutex我们已经知道了互斥量可以用于在线程间同步&#xff0c;但实际…

程序员:开汽车,难道我要知道汽车的原理才能把车开好吗?

一个网友的迷惑&#xff1a; 我工作&#xff15;年了&#xff0c;一直做&#xff2a;&#xff12;&#xff25;&#xff25;的项目&#xff0c;前几天去面试&#xff0c;一个人问我JDBC有几种连接方式&#xff0c;这个问题这么多年以来我从来没有遇见过&#xff0c;不知道大家 …

杭州某知名xxxx公司急招大量java以及大数据开发工程师

因公司战略以及业务拓展&#xff0c;收大量java攻城狮以及大数据开发攻城狮. 职位信息&#xff1a; java攻城狮: https://job.cnblogs.com/offer/56032 大数据开发攻城狮: https://job.cnblogs.com/offer/56033 欢迎博客园的XDJM自荐和推荐&#xff01; 此招聘长期有效 欢迎留言…

35.6. /etc/dnsmasq.d/dnsmasq.address.conf

vim /etc/dnsmasq.d/dnsmasq.address.confaddress/www.mydomain.com/172.16.0.254deny domain address/www.facebook.com/127.0.0.1 address/www.google.com/127.0.0.135.6.1. 域名劫持 将域名解析到错误的地址&#xff0c;这样可以屏蔽一些网站。 address/www.facebook.com/12…