java利用链表实现多项式相加_链表实现多项式相加

1.第一部分定义链表结构和相关操作。文件名称:comm.h

#ifndef _COMM_H__

#define _COMM_H__

#include

#include

#include

using namespace std;

string trim(string &strIn);

typedef struct Element

{

float index;

int exp;

}Element;

typedef int Status;

#define ERROR 0

#define OK 1

#define OVERFLOW -1

typedef struct LNode

{

Element data;

struct LNode *next;

}*Link,*Position;

typedef struct

{

Link head;

Link tail;

int len;

}LinkList;

namespace linkListName{

Status InitList(LinkList &L)

{

Link p = (Link)malloc(sizeof(LNode));

if( !p )

return ERROR;

p->next = NULL;

L.head = p;

L.tail = p;

L.len = 1;

return OK;

}

void Destroy(LinkList &L)

{

Link p = L.head;

Link q;

while(p!=L.tail)

{

q=p;

++p;

if(q) free(q);

}

}

Status MakeNode(Link &p,Element e)

{

Link ptr = (Link)malloc(sizeof(LNode));

if(!ptr) return ERROR;

ptr->data = e;

ptr->next = NULL;

p=ptr;

return OK;

}

void FreeNode( Link p )

{

if(p)

free(p);

}

Link GetHead(LinkList &L)

{

return L.head;

}

Status LinkEmpty(LinkList &L)

{

return L.len == 0;

}

int LengthLink(LinkList &L)

{

return L.len;

}

void ClearLink(LinkList &L)

{

}

Status LocateElem(LinkList &L,Link &p,int i)

{

if( i > L.len)

return OVERFLOW;

Link ha = GetHead(L);

int j=1;

while( j < i + 1 )

{

j++;

ha = ha->next;

}

p = ha;

return OK;

}

Status InsAfterElem(LinkList &L,Link &p,Element e)

{

Link ptr;

if( !MakeNode(ptr,e) )

return OVERFLOW;

if( !p->next )

{

L.tail = ptr;

}

ptr->next = p->next;

p->next=ptr;

++L.len;

return OK;

}

Status DelAfterElem(LinkList &L,Link p)

{

if(!p->next)

return OVERFLOW;

if( !(p->next)->next )

L.tail = p;

Link q = p->next;

p->next = q->next;

FreeNode(q);

return OK;

}

void SetElem(Link p,Element e)

{

p->data = e;

}

}

#endif

2.第二部分添加main函数以及多项式相加函数等。文件名称:LinkListTest.cpp.代码如下:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 #include

2 #include "..\..\include\comm.h"

3 #include "..\..\include\MainFunc.h"

4 using namespacestd;5 using namespacelinkListName;6

7 intcomp(Element a,Element b)8 {9 if(a.exp ==b.exp)10 return 0;11 if(a.exp next;19 while(la)20 {21 Element a = la->data;22 cout<next;24 }25 cout<next;33 Link lb = hb->next;34

35 Element a = la->data;36 Element b = lb->data;37 Link ptmp;38 Link pcur;39

40 while( la &&lb )41 {42 a = la->data;43 b = lb->data;44

45 int ret =compare(a,b);46 switch(ret)47 {48 case -1:49 LocateElem(pc,pcur,pc.len-1);50 InsAfterElem(pc,pcur,a);51 la = la->next;52 break;53 case 0:54 if( !( (a.index + b.index) > -0.005 && (a.index + b.index) < 0.005) )55 {56 Element c;57 c.index = a.index +b.index;58 c.exp =a.exp;59 LocateElem(pc,pcur,pc.len-1);60 InsAfterElem(pc,pcur,c);61 }62 la = la->next;63 lb = lb->next;64 break;65 case 1:66 LocateElem(pc,pcur,pc.len-1);67 InsAfterElem(pc,pcur,b);68 lb = lb->next;69 break;70 default:71 break;72 }73 }74

75 while( la != (pa.tail)->next )76 {77 a = la->data;78 LocateElem(pc,pcur,pc.len-1);79 InsAfterElem(pc,pcur,a);80 la = la->next;81 }82 while( lb != (pb.tail)->next )83 {84

85 a = lb->data;86 LocateElem(pc,pcur,pc.len-1);87 InsAfterElem(pc,pcur,a);88 lb = lb->next;89 }90 }91

92

93 voidfunc1()94 {95 Element a;96 a.index=1;97 a.exp = 2;98 Element b;99 b.index=3;100 b.exp = 4;101 Element c;102 c.index=2;103 c.exp = 6;104 Element array1[3] ={a,b,c};105

106 Element aa;107 aa.index=1;108 aa.exp = 2;109 Element ab;110 ab.index=3;111 ab.exp = 3;112 Element ac;113 ac.index=1;114 ac.exp = 4;115 Element array2[3] ={aa,ab,ac};116

117 LinkList pa;118 LinkList pb;119 InitList(pa);120 InitList(pb);121 Link pcur;122 for(int i = 0 ; i < 3 ; i++)123 {124

125 LocateElem(pa,pcur,pa.len-1);126

127 InsAfterElem(pa,pcur,array1[i]);128

129 LocateElem(pb,pcur,pb.len-1);130 InsAfterElem(pb,pcur,array2[i]);131 }132

133 LinkList pc;134 InitList(pc);135 addPolynomial(pa,pb,pc,comp );136 cout<

143

144 }145

146 intmain()147 {148 cout<

View Code

3.编译文件,本人使用的是mingw32-make

LinkList.exe:LinkListTest.cpp

g++ -m64 -I../../include -L../../../lib LinkListTest.cpp -lcomm -o LinkList.exe

#move ./test.exe ../../../bin/

本人文件目录说明:

H:\myProject\src\include\comm.h

H:\myProject\src\module\LinkListTest\LinkListTest.cpp

4.运行结果:

H:\myProject\src\module\LinkListTest>LinkList

before func1 输入的第一个多项式:

1*X^2+3*X^4+2*X^6+

输入的第二个多项式:

1*X^2+3*X^3+1*X^4+

相加后的结果: 2*X^2+3*X^3+4*X^4+2*X^6+

after func1

H:\myProject\src\module\LinkListTest>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有两个多项式: P1(x) = 3x^3 + 2x^2 + x + 5 P2(x) = 2x^3 - 1x^2 + 7x + 3 将多项式转化为链表形式,每个节点包含单项式的系数和指数。例如,第一个多项式可以表示为: 5 -> 1 -> 2 -> 3 每个节点的第一个元素表示系数,第二个元素表示指数。第一个节点表示常数项。 接下来使用以下步骤实现多项式相加: 1. 初始化两个指针分别指向两个多项式的头节点。 2. 创建一个新的链表用于存储结果。 3. 当两个指针都没有到达链表的末尾时,执行以下操作: a. 如果当前指针指向的节点的指数相等,将两个节点的系数相加,并将结果插入到新链表中。 b. 如果当前指针指向的节点的指数不相等,则将指数较小的节点插入到新链表中,并将指向该节点的指针向后移动一位。 4. 当其中一个指针到达链表的末尾时,将另一个链表中剩余的节点依次插入到新链表中。 5. 返回新的链表,即为相加后的多项式。 以下是一个Python代码示例实现多项式相加: class Node: def __init__(self, coeff, exp, next=None): self.coeff = coeff self.exp = exp self.next = next def add_polynomials(p1, p2): ptr1, ptr2 = p1, p2 head = Node(0, 0) ptr = head while ptr1 and ptr2: if ptr1.exp == ptr2.exp: coeff_sum = ptr1.coeff + ptr2.coeff if coeff_sum != 0: ptr.next = Node(coeff_sum, ptr1.exp) ptr = ptr.next ptr1 = ptr1.next ptr2 = ptr2.next elif ptr1.exp > ptr2.exp: ptr.next = Node(ptr1.coeff, ptr1.exp) ptr = ptr.next ptr1 = ptr1.next else: ptr.next = Node(ptr2.coeff, ptr2.exp) ptr = ptr.next ptr2 = ptr2.next while ptr1: ptr.next = Node(ptr1.coeff, ptr1.exp) ptr = ptr.next ptr1 = ptr1.next while ptr2: ptr.next = Node(ptr2.coeff, ptr2.exp) ptr = ptr.next ptr2 = ptr2.next return head.next p1 = Node(5, 0, Node(1, 1, Node(2, 2, Node(3, 3)))) p2 = Node(3, 0, Node(7, 1, Node(-1, 2, Node(2, 3)))) p_sum = add_polynomials(p1, p2) while p_sum: print(p_sum.coeff, "x^", p_sum.exp, " + " if p_sum.next else "", end="") p_sum = p_sum.next # 输出:8 x^ 0 + 8 x^ 1 + 1 x^ 2 + 5 x^ 3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值