import java.util.Scanner;
/**
* @author:Ravanla
* @vreate:2019-10-19-17:30
*/
public class OneLetterMultiplyPolyn {
public OneLetterMultiplyPolyn(){
Node A = new Node();
Node B = new Node();
Node C = new Node();
A = CreatePolyn();
// A = Reverse(A);
// Print(A);
B = CreatePolyn();
// Print(B);
C = MultiplyPolybn(A, B);
Print(C);
}
public static void main(String[] args) {
OneLetterMultiplyPolyn o = new OneLetterMultiplyPolyn();
}
链表插入操作的图片在
https://blog.youkuaiyun.com/weixin_43584220/article/details/102457446
public Node MultiplyPolybn(Node A, Node B){// 两链表相乘操作
Node pa, pb, pc, u, head;
int k, maxExp;
float cof;
head = new Node();
if (A != null && B != null) maxExp = A.exp + B.exp;
else return head;
pc = head;
B = Reverse(B);
for(k = maxExp; k >= 0; k--){
pa = A;
while (pa.next != null && pa.exp > k)
pa = pa.next;
pb = B;
while (pb.next != null && pa.exp + pb.exp < k)
pb = pb.next;
// 这两个找pa 和pb 位置的过程是想找到对应的 k
//找pb 的时候只要pb.exp + pa.exp 大于等于k就行了
//找到两个exp相加大于k的话后面代码会将pa 向下一个移动
//万一移动到小于k的话后面代码还有一个机制就是将pb 向下一个移动
//那天这两个相加等于k 就会创建新的node并计算赋值进去再插入我们的pc,pc的表头是head
cof = (float) 0.0;
while(pa != null && pb != null){
if(pa.exp + pb.exp == k){
cof += (pa.cof * pb.cof);
pa = pa.next;
pb = pb.next;
}else if (pa.exp + pb.exp > k) pa = pa.next;
else pb = pb.next;
}
if (cof != 0.0){
u = new Node();
u.cof = cof;
u.exp = k;
Insert(pc, u);
pc = u;
}
}
B = Reverse(B);
return head.next;
}
创建顺序链表就不画图了吧,我有一个博客写过,可以看看
https://blog.youkuaiyun.com/weixin_43584220/article/details/102459885
public Node CreatePolyn(){// 制作顺序链表操作
Node head = new Node();
// head.next = null;
// head.exp = 0;
// head.cof = 0;
// head.next = null;
Node s;
// s.exp = 0;
// s.cof = 0;
Node p;
// p.cof = 0;
// p.exp = 0;
Node q;
// q.exp = 0;
// q.cof = 0;
Scanner sc = new Scanner(System.in);
int exp2 = 0;
float cof2 = 0;
for(;;){
s = new Node();
p = new Node();
q = new Node();
// System.out.println("输入系数cof");
cof2 = sc.nextFloat();
// System.out.println("输入指数exf");
exp2 = sc.nextInt();
if(cof2 == 0 && exp2 == 0)// 浮点数直接等于0不知道可不可以,但在c是肯定不可以的(c++)
break;// cof 和 exp 同时为0 是退出输入
s.exp = exp2;
s.cof = cof2;
q = head.next;// q 是 排头兵,拿来试探的, 不行就兆前去p
p = head;// q 的前驱
while(q != null && q.exp > exp2){
p = q;
q = q.next;
}
if(q == null || q.exp < exp2){
//p.next = s;
//s.next = q;
Insert(p, s);// 找到p 和 q 顺序链表里的最后一个了或则 q的指数小于exp2的了 就将装入了数据的s插入p和q之间就号了
}else q.cof += cof2;
}
return head.next;
}
public Node Reverse(Node head){// 倒置操作
Node q;
Node p = null;
Node r = new Node();
q = head;
while(q != null){
r = q.next;
q.next = p;
p = q;
q = r;
}
// head.next = p;
head = p;
return head;
}
void Print(Node head){// 打印操作
Node p = head;
if(p.next == null) return;
while(p.next != null){
System.out.print(p.cof + "x^" + p.exp + "+ ");
p = p.next;
}
System.out.println(p.cof + "x^" + p.exp);
}
void Insert(Node e, Node p){// 插入操作
p.next = e.next;
e.next = p;
}
}
class Node{
int exp;// 指数
float cof;// 系数
Node next;
}