C 模擬實現List

2021-07-25 11:26:38 字數 3295 閱讀 7645

//雙向鍊錶

#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...