2016-09-06 34 views
1

我已經在JavaScript中實現了雙向鏈表,但是,我無法在nodejs中打印出我的結果。我是那些喜歡將事物形象化以充分理解它們的人之一。我使用npm中的prettyjson模塊來測試我單獨的LL結果,它的效果很好,但是由於數據結構是循環的,所以它會拋出雙倍LL的最大堆棧錯誤。想知道,是否有任何工具或最佳實踐更好,更準確地測試抽象數據結構?如何漂亮打印在JavaScript中實現的循環雙向鏈表?

更具體地,我具有不能夠在視覺上看到我在終端結果(ENV的NodeJS)由於數據結構我測試是圓形的問題。 我試過prettyjson模塊,但它會拋出「達到最大調用堆棧大小」錯誤。 我想探索其他替代方法,以便在視覺上準確地打印我在nodejs中的結果。

PS:我想,以避免執行嵌入在我的對象定義(類/構造函數。但是你想它調用JavaScript)的自定義打印功能/方法。

在情況下,它是有幫助的,在這裏我實現

var prettyjson = require('prettyjson'); 
 

 
//Blueprints 
 
function Node(val){ 
 
    this.data = val; 
 
    this.next = null; 
 
    this.prev = null; 
 
} 
 

 
function DoublyList(){ 
 
    this._length = 0; 
 
    this.head = null; 
 
    this.tail = null; 
 
} 
 

 
//Adds to the list 
 
DoublyList.prototype.add = function(val){ 
 
    var node = new Node(val); 
 

 
    if(this._length){ 
 
    this.tail.next = node; 
 
    node.prev = this.tail; 
 
    this.tail = node; 
 
    }else{ 
 
    this.head = node; 
 
    this.tail = node; 
 
    } 
 

 
    this._length++; 
 
    return node; 
 
} 
 

 
var doublyList = new DoublyList(); 
 

 
doublyList.add(5); 
 
doublyList.add(10); 
 
doublyList.add(15); 
 
doublyList.add(20); 
 
doublyList.add(25); 
 

 
console.log(doublyList);

+2

在這種情況下,「打印」是什麼意思?你期望輸出看起來像什麼,當你試圖自己做什麼時,你在哪裏陷入困境? – jfriend00

+1

也許你覺得這個節點包有用:https://www.npmjs.com/package/doubly-linked-list您可以深入到代碼並檢查其'toString'方法 – daymannovaes

+1

這是鏈接到它的'toString'方法:https://github.com/lmaccherone/DoublyLinkedList/blob/master/DoublyLinkedList.coffee#L64聯繫我,如果你有 – daymannovaes

回答

0

如果你想測試你的實現,那麼你幾乎肯定將不得不處理一些非常麻煩輸出,因爲我看不到在命令行上可視化的好方法。如果你只是想象列表中的內容,它與你在普通列表中做的事情沒有任何區別;遍歷列表並打印每個元素。例如:

function printList(doublyList) { 
    var nodes = []; 
    for (var n = doublyList.head; n != null; n = n.next) { 
     nodes.push(n.data); 
    } 
    console.log(nodes.join('<=>')); 
} 

如需更詳細的調試信息,您可以添加鏈接兩個方向:

function debugPrintList(doublyList) { 
    var nodes = []; 
    for (var n = doublyList.head; n != null; n = n.next) { 
     var nextData = n.next ? n.next.data : 'undefined'; 
     var previousData = n.prev ? n.prev.data : 'undefined'; 
     nodes.push('[data: ' + n.data + '; next: ' + nextData + '; prev: ' + prevData + ']'); 
    } 
    console.log(nodes.join('\n')); 
} 

或者其他但是你喜歡它輸出。

我不知道圖書館的功能,將自動爲您做到這一點的,但你可以看到它不是太複雜,自己做。

+0

謝謝@ Thor84no!我正在測試我的實現,其中嵌套的對象是以有組織和清晰的方式完全打印在終端中的...... –

+0

那麼,'debugPrintList'應該這樣做,如果'data'是一個字符串。如果不是的話,你可以簡單地使用'require'('util')。inspect(n.data)'來得到格式化版本的數據(或者很漂亮的打印它)。無論如何,你當然可以根據自己的喜好修改輸出。 – Thor84no