//雙向鍊錶
#include#includeusing namespace std;
//typedef nodenode;
templatestruct node
t _data; //鍊錶中的資料
node* _pnext; //下乙個節點
node* _ppre; //前乙個節點
};templateclass list
;templateostream& operator<<(ostream& _cout, const list& l);
//建構函式
templatelist::list()
:_phead(null)
,_ptail(null)
,_size(0)
{}templatelist::list(const t arr, size_t size)
:_phead(null)
,_ptail(null)
,_size(0)
}//賦值運算子過載
templatelist&list:: operator=(const list& l)
} //當前物件的鍊錶長度大於要賦給它的鍊錶長度
else if(_size>l._size)
//將l._size到_size之間的剩餘的長度刪掉
for(size_t i = l._size; i<_size; i++)
}else }
return *this;
}templatelist::~list()
//判斷鍊錶是否為空
templatebool list::empty()const
//申請新節點
templatenode* list::buynewnode(const t& data)
//尾插
templatevoid list::pushback(const t &data)
else
++_size;
}//尾刪
templatevoid list::popback()
else if(_phead->_pnext == null)
else
--_size;
}//頭插
templatevoid list::pushfront(const t& data)
else
++_size;
}//頭刪
templatevoid list::popfront()
else if(_phead->_pnext == null)
else if(_phead->_pnext == null)
else
--_size;
}//找特定的元素
templatenode*list::find(const t& data)
else
pcur = pcur->_pnext;
} } return null;
}//在特定的位置插入元素
templatevoid list::insert(node* pos, const t& data)
else if(pos->_pnext == null)
else
++_size;
}//擦出特定位置的元素
templatevoid list::erase(node* pos)
else if(pos->_pnext == null)
else
--_size;
}//返回第乙個元素
templatenode&list:: front()
templateconst node& list::front()const
//返回最後乙個元素
templatenode& list::back()
templateconst node& list::back()const
//求鍊錶的長度
templatesize_t list::size()const
//清空鍊錶
templatevoid list::clear() }}
//過載輸出運算子
templateostream& operator<<(ostream& _cout, const list& l)
return _cout;
}//順序列印
templatevoid list::print()
node* pret = _phead;
while(pret) }
//逆序列印
templatevoid list::print_l()
node* pret = _ptail;
while(pret) }
//int checkpodtype(typeid name)
//;// for(size_t i = 0;il1(arr,3);
l1.print();
listl2(arr,2);
l2.print();
//賦值運算子的過載的測試
listl3(l1);
l3 = l2;
l3.print();
}//尾插尾刪函式的測試
void funtest2()
; listl1(arr,3);
l1.pushback(7);
l1.pushback(8);
l1.pushback(9);
l1.pushback(0);
l1.pushback(6);
l1.pushback(5);
l1.print();
coutl1.pushfront(8);
l1.pushfront(9);
l1.pushfront(0);
l1.print();
coutl1.insert(l1.find(2),8);
l1.print();
}//在特定位置擦出元素
void funtest5()
; listl1(arr,5);
l1.erase(l1.find(3));
l1.erase(l1.find(4));
l1.erase(l1.find(5));
l1.print();
}//清空鍊錶
void funtest6()
; listl1(arr,5);
l1.print();
l1.clear();
}int main()
模擬實現 list
鍊錶前面我已經寫過了,不過寫的是單鏈表,而c 庫中的list是雙鏈表,那麼,我們就來模擬實現一下雙鏈表,這樣對於庫中的list也會有更加深刻的了解。那麼首先我們先來了解一下雙鏈表的結構,雙鏈表無非就是比單鏈表多了一條鏈,單鏈表只有一條指向下乙個節點的鏈,而雙鏈表會多一條指向前乙個節點的鏈。說白了就是...
模擬實現list
構造 介面 插入刪除 交換 清空 include using namespace std list的節點類 template class t struct listnode listnode ppre listnode pnext t val list的迭代器類 template classt,cl...
STL 模擬實現list
list是標準模板庫中的乙個容器,實際上是一條帶頭節點的雙向鍊錶。通過與迭代器的組合使用,使得工作效率大大提高。要注意 迭代器只是為了訪問 修改和遍歷物件,不對空間進行管理。pragma once include using namespace std 定義鍊錶結點結構體 templatestruc...