LibSingleList.sol¶
LibSingleList提供了单向链表操作,包括链表更新、查询、迭代等。
使用方法¶
首先需要通过import引入LibLinkedList类库,然后通过”.”进行方法调用,如下为添加元素的例子:
pragma solidity ^0.4.25;
import "./LibSingleList.sol";
contract LibSingleListTest{
using LibSingleList for LibSingleList.List;
LibSingleList.List _list;
function test()public{
_list.pushBack(bytes32(1));
}
}
API列表¶
编号 | API | API描述 |
---|---|---|
1 | getSize(List storage self) internal view returns(uint256) | 获取链表元素数 |
2 | isEmpty(List storage self) internal view returns(bool) | 判断是否为空 |
3 | isExists(List storage self, bytes32 ele) internal view returns(bool) | 判断是否存在 |
4 | pushBack(List storage self, bytes32 ele) internal | 添加在链表尾部 |
5 | pushFront(List storage self, bytes32 ele) internal | 添加在链表头部 |
6 | getBack(List storage self) internal returns(bytes32) | 获取尾部元素 |
7 | getFront(List storage self) internal returns(bytes32) | 获取头部元素 |
8 | find(List storage self, bytes32 ele) internal returns(Iterate memory) | 查找,返回一个迭代器, 从链表头部开始,复杂度O(n) |
9 | remove(List storage self, bytes32 ele) internal | 删除一个元素,复杂度O(n) |
10 | remove(List storage self, Iterate memory iter) internal returns(Iterate memory) | 删除迭代器指定节点 |
11 | insertNext(List storage self, Iterate memory iter, bytes32 ele)internal | 插入元素到迭代器后面 |
12 | insertPrev(List storage self, Iterate memory iter, bytes32 ele) internal | 插入元素到迭代器前面 |
13 | begin(List storage self) internal view returns(Iterate) | 链表迭代初始化 |
14 | isEnd(List storage self, Iterate memory iter) internal view returns(bool) | 迭代条件检查 |
15 | nextNode(List storage self, Iterate memory iter) internal view returns(Iterate) | 迭代下一个迭代器 |
测试代码¶
pragma solidity ^0.4.25;
import "./LibSingleList.sol";
contract LibSingleListTest{
using LibSingleList for LibSingleList.List;
LibSingleList.List _list;
event log(bytes32 data);
function test()public{
//3-->1-->2
_list.pushBack(bytes32(1));
_list.pushBack(bytes32(2));
_list.pushFront(bytes32(3));
require(_list.getSize() == 3, "List size error");
require(_list.getFront() == bytes32(3), "Front node error");
require(_list.getBack() == bytes32(2), "back node error");
var iter = _list.find(bytes32(1));
require(iter.value == bytes32(1), "find error");
require(iter.prevNode == bytes32(3), "list error");
var next = _list.nextNode(iter);
require(next.value == bytes32(2), "nextNode error");
_list.remove(bytes32(3));
require(_list.getSize() == 2, "List size error");
var curr = _list.find(bytes32(1));
_list.insertNext(curr, bytes32(4));
_list.insertPrev(curr, bytes32(5));
require(_list.getFront() == bytes32(5), "insert Front node error");
require(_list.getBack() == bytes32(2), " insert back node error");
require(_list.getSize() == 4, "List size error");
var beg = _list.begin();
while(!_list.isEnd(beg)){
if(beg.value == 4){
//删除节点
beg = _list.remove(beg);
} else {
beg = _list.nextNode(beg);
}
}
beg = _list.begin();
while(!_list.isEnd(beg)){
emit log(beg.value);
beg = _list.nextNode(beg);
}
}
}