Skip to main content
 首页 » 编程设计

JS线性链表的例子:一元多项式

2022年07月16日47zhenyulu
  1 var List = require('./complete-LinkedList'); 
  2  
  3 function Term(coef, expn) { 
  4   // 系数 
  5   this.coef = coef || null; 
  6   // 指数 
  7   this.expn = expn || null; 
  8 } 
  9  
 10 // 一元多项式 
 11 function Polynomial() { 
 12   List.call(this); 
 13 } 
 14 Polynomial.prototype = { 
 15   __proto__: List.prototype, 
 16  
 17   locateElem: function (elem, compare) { 
 18     var current = this.head; 
 19     var prev = current; 
 20     var obj; 
 21  
 22     while (current !== null) { 
 23       obj = {}; 
 24       var ret = compare(current.data, elem); 
 25       if (ret === 0) { 
 26         obj.data = current; 
 27         obj.found = true; 
 28         break; 
 29       } else if (ret > 0) { 
 30         obj.data = prev; 
 31         obj.found = false; 
 32         break; 
 33       } 
 34  
 35       prev = current; 
 36       current = current.next; 
 37     } 
 38  
 39     return obj; 
 40   }, 
 41   initList: function () { 
 42     this.head = List.makeNode(); 
 43     this.head.data = new Term(); 
 44     this.tail = this.head; 
 45   }, 
 46   cmp: function (a, b) { 
 47     if (a.expn < b.expn) { 
 48       return -1; 
 49     } else if (a.expn === b.expn) { 
 50       return 0; 
 51     } else { 
 52       return 1; 
 53     } 
 54   }, 
 55   // 输入m项的系数和指数,建立表示一元多项式的有序链表p 
 56   createPolyn: function (elems, elems2) { 
 57     var m = elems.length; 
 58     this.initList(); 
 59     var h = this.head; 
 60     var e = h.data; 
 61     e.coef = 0; 
 62     e.expn = -1; 
 63  
 64     for (var i = 0; i < m; i++) { 
 65       e.coef = +elems[i]; 
 66       e.expn = +elems2[i]; 
 67  
 68       var q = this.locateElem(e, this.cmp); 
 69       if (!q.found) { 
 70         this.insertAsFirst(e); 
 71       } 
 72  
 73       e = {}; 
 74     } 
 75   }, 
 76   // 多项式加法,a = a + b 
 77   addPolyn: function (b) { 
 78     var a = this; 
 79     // ha, hb分别指向头结点 
 80     var ha = a.head; 
 81     var hb = b.head; 
 82     // qa,qb分别指向当前结点 
 83     var qa = ha; 
 84     var qb = hb; 
 85  
 86     while (qa && qb) { 
 87       // 当前的比较元素 
 88       var elem1 = qa.data; 
 89       var elem2 = qb.data; 
 90  
 91       switch (this.cmp(elem1, elem2)) { 
 92         // 多项式a中当前结点的指数值小 
 93         case -1: 
 94           ha = qa; 
 95           qa = qa.next; 
 96           break; 
 97         // 两者的指数相等 
 98         case 0: 
 99           var sum = elem1.coef + elem2.coef; 
100           // 修改多项式a中当前结点的系数值 
101           if (sum !== 0) { 
102             qa.data.coef = sum; 
103             ha = qa; 
104  
105             // 删除多项式a中当前结点 
106           } else { 
107             a.delete(elem1); 
108           } 
109  
110           b.delFirst(); 
111           hb = b.head; 
112           qb = hb; 
113           qa = ha.next; 
114           break; 
115         // 多项式a中当前结点的指数值大 
116         case 1: 
117           a.insertAsFirst(b.delFirst().data); 
118           qb = b.head; 
119           ha = a.head; 
120           break; 
121       } 
122     } 
123  
124     if (b.head) { 
125       a.append(qb); 
126     } 
127   } 
128 }; 
129  
130 var test = new Polynomial(); 
131 test.createPolyn([-1, 2, 4], [1, 2, 3]); 
132  
133 var test2 = new Polynomial(); 
134 test2.createPolyn([1, 2, 3], [1, 2, 3]); 
135 test.addPolyn(test2); 
136 console.log(JSON.stringify(test)); 
137  
138 var test3 = new Polynomial(); 
139 test3.createPolyn([1, 5, 2], [1, 5, 2]); 
140 test.addPolyn(test3); 
141  
142 console.log(test);

单元测试代码:

 1 describe('polyn tests', function(){ 
 2   var test = new Polynomial(); 
 3   test.createPolyn([-1, 2, 4], [1, 2, 3]); 
 4   var test2 = new Polynomial(); 
 5   test2.createPolyn([1, 2, 3], [1, 2, 3]); 
 6  
 7   it('should add a new polyn', function(){ 
 8     test.addPolyn(test2); 
 9     expect(test.head.data).toEqual({coef: 7,expn: 3}); 
10     expect(test.head.next.data).toEqual({coef: 4,expn: 2}); 
11     expect(test.head.next.next).toEqual(null); 
12   }); 
13  
14   var test3 = new Polynomial(); 
15   test3.createPolyn([1, 5, 2], [1, 5, 2]); 
16   it('should add another new polyn', function(){ 
17     test.addPolyn(test2); 
18     expect(test.head.data).toEqual({coef: 1,expn: 1}); 
19     expect(test.head.next.data).toEqual({coef: 5,expn: 5}); 
20     expect(test.head.next.next.data).toEqual({coef: 6,expn: 2}); 
21     expect(test.head.next.next.next.data).toEqual({coef: 7,expn: 3}); 
22   }); 
23 });

本文参考链接:https://www.cnblogs.com/webFrontDev/p/3668207.html