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

  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 });

 

你可能感兴趣的:(链表)