C语言 一元特征多项式式 谁能解释一下这个程序怎么算的啊 为什么要用两个结构体?Open函数怎么理解?

一元多项式的表示和相加是数据结构(C语言)中的一个简单的问题,这里我们用C++的一些东西来实现它。(简洁版)
首先是表示多项式,多项式有一些列的单项组成,每一项都有系数和指数两个量,考虑到多项式的长度和指数的不确定性,显而易见,应该使用链表来存储它。
由上面的叙述很容易得到单项的结构:
struct Poly
int second;
Poly *next;
first代表单项的常数,second表示指数,next代表下个节点的所在,这个结构体十分的简单。
接下来是多项式的表示,我把它设计为一个类:
class Polynomial
Polynomial();
void insert(int ,int);
Polynomial(const Polynomial&);
friend Polynomial operator +(const Polynomial&,const Polynomial&);
~Polynomial();
void print();
Poly *get_new_poly(int ,int);
Poly *链表的头结点
当然,这个类的设计有一些问题,这里不做详细的描述,比如我少写了重载赋值运算符。
首先是打印函数的实现:
void Polynomial()
Poly *p=head-&
while(p!=NULL)
cout&&p-&first&&"
"&&p-&second&&
不做太多的描述。
下面是两个构造函数:
Polynomial():head(NULL)
head=get_new_poly(0,0);
Polynomial(const Polynomial&poly):head(NULL)
head=get_new_poly(0,0);
Poly *p=poly.head-&
while(p!=NULL)
this-&insert(p-&first,p-&second);
这里我把头结点赋予了一个常数为0,指数为0的单项,这是为了后面算法实现的 方便,无实际意义,也可以看到insert()函数的重要性。
接下来是析构函数和辅助函数,也很简单。
Polynomial::~Polynomial()
while(p!=NULL)
Poly *pp=p;
p=p-&next;
Poly *Polynomial::get_new_poly(int first,int second)
Poly *poly=new P
assert(poly!=NULL);
poly-&first=
poly-&second=second;
poly-&next=NULL;
接下来开始最重要的insert()函数,这个函数完成插入工作,在其中完成自动的排序以及一些其它的工作。
两个多项式相加得到一个新的多项式,就可以看做先把一个多项式插入进新的空的多项式中,然后再把另一个多项式也插入其中,其时间复杂度依旧是O(f(N1)+G(N2)),不变。
void Polynomial::insert(int first,int second)
Poly *p_s=head-&next,*p_e=
while(p_s!=NULL)
if(p_s-&second == second)
p_s-&first+=
if(p_s-&first==0)
p_e-&next=p_s-&next;
delete p_s;
else if(p_s-&second & second )
p_s=p_s-&next;
Poly *poly=get_new_poly(first,second);
p_e-&next=
poly-&next=p_s;
这个函数中,p_s参与实际的比较和循环,p_e指向的是p_s的前一个节点。
当插入的加点与p_s的指数相同的时候,这个时候不需要新的节点来链接它,只需要常数相加即可,如果结果常数项为0,就删除p_s节点,同时也意味着此次插入完成。
如果p_s的指数项比要插入的项的指数项小,那么更新p_s为链表的下个节点,直到满足条件。
如果p_s的指数项大于要插入的项的指数,那么完成插入操作。
接下来就是重载+操作符的操作:
Polynomial operator +(const Polynomial&poly1,const Polynomial&poly2)
Poly *p_head=poly1.head-&
while(p_head!=NULL)
poly.insert(p_head-&first,p_head-&second);
p_head=p_head-&
p_head=poly2.head-&
while(p_head!=NULL)
poly.insert(p_head-&first,p_head-&second);
p_head=p_head-&
分别将两个多项式的每一项插入到新的多项式中。
下面为我写的一个测试代码:
int main()
Polynomial poly1,poly2;
poly1.insert(1,1);
poly1.insert(-1,2);
poly2.insert(1,2);
poly2.insert(2,8);
Polynomial poly3=poly1+poly2;
poly3.print();
下图为我的测试结果:
本文已收录于以下专栏:
相关文章推荐
一元多项式每个节点是由系数和指数来确定,因此可以采用顺序表表示。由于不知道多项式的指数会达到多大,所以采用顺序存储结构不合适,应该用链表。
   如何完成两个一元多项式的相加?
  思路:每个一元...
1、贴代码:
struct Node {
Node *next...
// c2-6.h 抽象数据类型Polynomial的实现(见图2.45)
typedef struct // 项的表示,多项式的项作为LinkList的数据元素
线性表中一元多项式的表示及相加
第一个博客
1. 引言 
本文主要讲解一元多项式的表示及相加。
2. 一元多项式的表示和及相加
/* 一元多项式的表示和相加 */
#include &ds...
问题:符号多项式的求和运算
数据结构:使用链表来存储和处理符号多项式
使用的链表的节点结构体:
typedef struct ListNode
typedef struct Node
他的最新文章
讲师:韦玮
讲师:陈守元
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)查看: 11787|回复: 14
c语言结构体的用法【转】
主题帖子精华
在线时间32 小时
结构(struct)
& & &结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。&
结构中可以使用不同的数据类型。&
& & 1. 结构说明和结构变量定义&
& & 在Turbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此, &象其它&
类型的变量一样, 在使用结构变量时要先对其定义。&
& & 定义结构变量的一般格式为:&
[C] 纯文本查看 复制代码
struct 结构名
} 结构变量;
& & 结构名是结构的标识符不是变量名。&
& & 类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和&
无值型)。&
& & 构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中&
元素是以下标来访问的, 而结构是按变量名字来访问成员的。&
& & 下面举一个例子来说明怎样定义结构变量。&
[C] 纯文本查看 复制代码
struct string
char name[8];
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
& & 这个例子定义了一个结构名为string的结构变量person, & 如果省略变量名&
person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义&
时上例变成:&
[C] 纯文本查看 复制代码
struct string
char name[8];
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
& & 如果需要定义多个具有相同形式的结构变量时用这种方法比较方便, 它先作&
结构说明, 再用结构名来定义变量。&
& & 例如:&
& & &struct string Tianyr, Liuqi, ...;&
& & 如果省略结构名, 则称之为无名结构, 这种情况常常出现在函数内部, 用这&
种结构时前面的例子变成:&
[C] 纯文本查看 复制代码
char name[8];
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4, wage5;
} Tianyr, L
& & 2. 结构变量的使用&
& & 结构是一个新的数据类型, 因此结构变量也可以象其它类型的变量一样赋值、&
运算, 不同的是结构变量以成员作为基本变量。&
& & 结构成员的表示方式为:&
& & & & & 结构变量.成员名&
& & 如果将"结构变量.成员名"看成一个整体, &则这个整体的数据类型与结构中&
该成员的数据类型相同, 这样就可象前面所讲的变量那样使用。&
& & 下面这个例子定义了一个结构变量, 其中每个成员都从键盘接收数据, 然后&
对结构中的浮点数求和, 并显示运算结果, 同时将数据以文本方式存入一个名为&
wage.dat的磁盘文件中。请注意这个例子中不同结构成员的访问。&
[C] 纯文本查看 复制代码
#i nclude &stdio.h&
/*定义一个结构变量*/
char name[8];
char sex[2];
char depart[20];
float wage1, wage2, wage3, wage4,
char c=’Y’;
fp=\"fopen\"(\"wage.dat\", \"w\");
/*创建一个文件只写*/
while(c==’Y’||c==’y’)
/*判断是否继续循环*/
printf(\"/nName:\");
scanf(\"%s\", a.name);
/*输入姓名*/
printf(\"Age:\");
scanf(\"%d\", &a.wage);
/*输入年龄*/
printf(\"Sex:\");
scanf(\"%d\", a.sex);
printf(\"Dept:\");
scanf(\"%s\", a.depart);
printf(\"Wage1:\");
scanf(\"%f\", &a.wage1);
/*输入工资*/
printf(\"Wage2:\");
scanf(\"%f\", &a.wage2);
printf(\"Wage3:\");
scanf(\"%f\", &a.wage3);
printf(\"Wage4:\");
scanf(\"%f\", &a.wage4);
printf(\"Wage5:\");
scanf(\"%f\", &a.wage5);
wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;
printf(\"The sum of wage is
%6.2f/n\", wage);/*显示结果*/
fprintf(fp,
\"%10s%4d%4s%30s%10.2f/n\",
/*结果写入文件*/
a.name, a.age, a.sex,
a.depart, wage);
printf(\"Continue?&Y/N&\");
c=\"getche\"();
if(c==’Y’||c==’y’||c==’N’||c==’n’)
fclose(fp);
& & 3. 结构数组和结构指针&
& & 结构是一种新的数据类型, 同样可以有结构数组和结构指针。&
& & 一、结构数组&
& & 结构数组就是具有相同结构类型的变量集合。假如要定义一个班级40个同学&
的姓名、性别、年龄和住址, 可以定义成一个结构数组。如下所示:&
[C] 纯文本查看 复制代码
char name[8];
char sex[2];
char addr[40];
}student[40];
也可定义为:
struct string{
char name[8];
char sex[2];
char addr[40];
struct string student[40];
& & 需要指出的是结构数组成员的访问是以数组元素为结构变量的, 其形式为:&
& & & & & 结构数组元素.成员名&
& & 例如:&
[C] 纯文本查看 复制代码
student[0].name
student[30].age
& & 实际上结构数组相当于一个二维构造, 第一维是结构数组元素, 每个元素是&
一个结构变量, 第二维是结构成员。&
& & 注意:&
& & 结构数组的成员也可以是数组变量。&
& & 例如:&
[C] 纯文本查看 复制代码
int m[3][5];
char s[20];
& & 为了访问结构a中结构变量y[2]的这个变量, 可写成&
& & & &y[2].m[1][4]&
& & 二、结构指针&
& & 结构指针是指向结构的指针。它由一个加在结构变量名前的"*" 操作符来定&
义, 例如用前面已说明的结构定义一个结构指针如下:&
[C] 纯文本查看 复制代码
struct string{
char name[8];
char sex[2];
char addr[40];
& & 也可省略结构指针名只作结构说明, 然后再用下面的语句定义结构指针。&
& & & struct string *&
& & 使用结构指针对结构成员的访问, 与结构变量对结构成员的访问在表达方式&
上有所不同。结构指针对结构成员的访问表示为:&
& & & &结构指针名-&结构成员&
& & 其中"-&"是两个符号"-"和"&"的组合, 好象一个箭头指向结构成员。例如要&
给上面定义的结构中name和age赋值, 可以用下面语句:&
[C] 纯文本查看 复制代码
strcpy(student-&name, \"Lu G.C\");
student-&age=18;
& & 实际上, student-&name就是(*student).name的缩写形式。&
& & 需要指出的是结构指针是指向结构的一个指针, 即结构中第一个成员的首地&
址, 因此在使用之前应该对结构指针初始化, 即分配整个结构长度的字节空间,&
这可用下面函数完成, 仍以上例来说明如下:&
[C] 纯文本查看 复制代码
student=(struct string*)malloc(size of
(struct string));
size of (struct string)自动求取string结构的字节长度,
malloc() 函数
定义了一个大小为结构长度的内存区域, 然后将其诈地址作为结构指针返回。&
& & 注意:&
& & 1. 结构作为一种数据类型, &因此定义的结构变量或结构指针变量同样有局&
部变量和全程变量, 视定义的位置而定。&
& & 2. 结构变量名不是指向该结构的地址, 这与数组名的含义不同, &因此若需&
要求结构中第一个成员的首地址应该是&[结构变量名]。&
& & 4. 结构的复杂形式&
& & 一、嵌套结构&
& & 嵌套结构是指在一个结构成员中可以包括其它一个结构, Turbo C 允许这种&
& & 例如: 下面是一个有嵌套的结构&
[C] 纯文本查看 复制代码
struct string{
char name[8];
& & 其中: addr为另一个结构的结构名, 必须要先进行, 说明, 即&
[C] 纯文本查看 复制代码
struct addr{
char city[20];
char tel[14];
& & 如果要给student结构中成员address结构中的zipcode赋值, 则可写成:&
& & & student.address.zipcode=200001;&
& & 每个结构成员名从最外层直到最内层逐个被列出, 即嵌套式结构成员的表达&
& & & 结构变量名.嵌套结构变量名.结构成员名&
& & 其中: 嵌套结构可以有很多, 结构成员名为最内层结构中不是结构的成员名。&
& & 二、位结构&
& & 位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构&
比按位运算符更加方便。&
& & 位结构定义的一般形式为:&
[C] 纯文本查看 复制代码
struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;
& & 其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整&
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。&
& & 变量名是选择项, 可以不命名, 这样规定是为了排列需要。&
& & 例如: 下面定义了一个位结构。&
[C] 纯文本查看 复制代码
unsigned incon: 8;
/*incon占用低字节的0~7共8位*/
unsigned txcolor:
4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor:
3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1;
/*blink占用高字节的第7位*/
& & 位结构成员的访问与结构成员的访问相同。&
& & 例如: 访问上例位结构中的bgcolor成员可写成:&
& & & ch.bgcolor&
& & 注意:&
& & 1. 位结构中的成员可以定义为unsigned, 也可定义为signed, &但当成员长&
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。&
& & 2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,&
如果是指针, 其成员访问方式同结构指针。&
& & 3. 位结构总长度(位数), 是各个位成员定义的位数之和, &可以超过两个字&
& & 4. 位结构成员可以与其它结构成员一起使用。&
& & 例如:&
[C] 纯文本查看 复制代码
struct info{
char name[8];
unsigned state: 1;
unsigned pay: 1;
& & 上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结&
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工&
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间。 &
我是开源电子网?网站管理员,对网站有任何问题,请与我联系!
主题帖子精华
在线时间270 小时
收藏了,站长,好帖子,正好温习一下结构体方面的知识
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
主题帖子精华
在线时间22 小时
感谢分享,版区有你更精彩!
acbaec94cfe264f_936.gif (0 Bytes, 下载次数: 68)
22:54 上传
主题帖子精华
在线时间781 小时
主题帖子精华
初级会员, 积分 175, 距离下一级还需 25 积分
在线时间10 小时
嗯,不错,结构体基本的知识和用法讲得很仔细了。不过个人感觉C语言的结构体最大功能就是提供了数据的封装,而C++中的结构体则与class有了相当的功能,结构体使用的好坏极大程度的反映了一个C语言程序员对整个程序的把握和理解的程度。在通过网络或其他形式发送数据时若采用#pragma&pack&(n)进行对齐操作,然后用memcpy将会使发送和接收任务事半功倍(注意大小端)。另外还可以用memset()操作清空结构体(注意指针成员)。也可以用typdef来声明一个结构体。
暂不做硬件,投身机器学习和数据挖掘。欢迎交流!
主题帖子精华
新手上路, 积分 23, 距离下一级还需 27 积分
在线时间0 小时
这样的好文一定要顶下,学习了,谢谢
主题帖子精华
初级会员, 积分 50, 距离下一级还需 150 积分
在线时间2 小时
回复【5楼】xiaomengyichen:
---------------------------------
请问#pragma&pack&(n)是跟align一样的对齐作用吗?
memcpy和memset应该属于std里很有名的string吧,什么时候应该清空结构体呢?
主题帖子精华
新手上路, 积分 21, 距离下一级还需 29 积分
在线时间0 小时
c语言结构体
/c_language_structure.html
主题帖子精华
初级会员, 积分 55, 距离下一级还需 145 积分
在线时间0 小时
强、强、强。。。
主题帖子精华
在线时间535 小时
主题帖子精华
初级会员, 积分 102, 距离下一级还需 98 积分
在线时间18 小时
mark ,结构体的使用
主题帖子精华
中级会员, 积分 435, 距离下一级还需 65 积分
在线时间60 小时
学习了!!!谢谢啊!!!!
主题帖子精华
初级会员, 积分 132, 距离下一级还需 68 积分
在线时间12 小时
嗯,收藏一下,就是缺少了一个用typedef来声明的方式,毕竟这个是比较常用的
主题帖子精华
中级会员, 积分 342, 距离下一级还需 158 积分
在线时间40 小时
主题帖子精华
新手上路, 积分 27, 距离下一级还需 23 积分
在线时间7 小时
对初学者帮助真的很大& &谢谢!
Powered by扫二维码下载作业帮
2亿+学生的选择
下载作业帮安装包
扫二维码下载作业帮
2亿+学生的选择
c/c++数据结构一元多项式的求和一个一元多项式可以看作由若干个一元单项式按降幂排列成的线性表.请编写程序对输入的两个一元多项式求和,并输出求和的结果.输入为两个一元多项式,每个一元多项式输入一行,按照降幂依次输入每个单项式的系数和指数,并以-1 -1作为结束.系数和指数均为整数,指数不小于0.输出为求和结果多项式,按照降幂依次输出每个单项的系数和指数,每个数值后面用一个空格隔开,输出结果多项式后换行.系数为0的单项式不得输出——除非结果多项式就是0,则直接输出0.样例输入2 7 3 5 12 1 6 0 -1 -17 5 9 4 3 0 -1 -1样例输出2 7 10 5 9 4 12 1 9 0
扫二维码下载作业帮
2亿+学生的选择
#include&&stdio.h&#define&N&1000int&ap[N];int&ae[N];int&bp[N];int&be[N];int&main()&{&&&&int&i&=&0,&j&=&0;&&&&int&alen,&&&&&while&(scanf(&%d%d&,&&ap[i],&&ae[i]),&ap[i]&&=&0&&&&ae[i]&&=&0)&{&&&&&&&&i++;&&&&}&&&&while&(scanf(&%d%d&,&&bp[j],&&be[j]),&bp[j]&&=&0&&&&be[j]&&=&0)&{&&&&&&&&j++;&&&&}&&&&alen&=&i,&blen&=&j;&&&&i&=&j&=&0;&&&&while&(i&&&alen&&&&j&&&blen)&{&&&&&&&&if&(ae[i]&&&be[j])&{&&&&&&&&&&&&printf(&%d&%d&&,&ap[i],&ae[i]);&&&&&&&&&&&&i++;&&&&&&&&}&else&if&(ae[i]&&&be[j])&{&&&&&&&&&&&&printf(&%d&%d&&,&bp[j],&be[j]);&&&&&&&&&&&&j++;&&&&&&&&}&else&{&&&&&&&&&&&&printf(&%d&%d&&,&bp[j]+ap[i],&be[j]);&&&&&&&&&&&&i++;&j++;&&&&&&&&}&&&&}&&&&while&(i&&&alen)&{&&&&&&&&printf(&%d&%d&&,&ap[i],&ae[i]);&&&&&&&&i++;&&&&}&&&&while&(j&&&blen)&{&&&&&&&&printf(&%d&%d&&,&bp[j],&be[j]);&&&&&&&&j++;&&&&}&&&&return&0;}大体上代码就是这样了,可能还需要根据题目微调一下N的大小,还有对0系数的处理
为您推荐:
其他类似问题
扫描下载二维码C语言中连续定义两个变量,为什么地址是这样的? - 知乎83被浏览6581分享邀请回答544 条评论分享收藏感谢收起614 条评论分享收藏感谢收起查看更多回答1 个回答被折叠()}

我要回帖

更多关于 一元多项式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信