数据结构之——单链表的实现
来源:互联网 发布:阿里巴巴数据库在哪 编辑:程序博客网 时间:2024/06/06 09:36
/*使用嵌套类实现【单链表】学习要点:、(1)实现单链表数据结构的定义以及各种操作(1)区别深拷贝(另外动态分配内存进行拷贝) 和 浅拷贝(直接拷贝赋值)(2)实现深拷贝构造和深拷贝赋值函数(3)实现操作运算符的重载= (深拷贝赋值) << 输出运算符重载:建立全局函数,在类中定义时可声明为friend函数;friend函数可访问类中private成员*/#include<iostream>using namespace std;class List{public://构造函数 和 析构函数List(void) : m_head(NULL){}~List(){clear();}// 深度拷贝构造 和 深度拷贝赋值List(const List& that):m_head(NULL){for(Node* node = that.m_head; node; node = node->m_next){this->push_back(node->m_data);}}List& operator=(const List& that){if(this != &that){List temp = that;this->m_head = temp.m_head;temp.m_head = NULL;}return *this;}//清空链表void clear(void){for(Node* node = m_head, *next; node; node = next){next = node->m_next;delete node;}m_head = NULL;}//是否为空bool empty(void) const {return !m_head;}//元素个数size_t size(void)const{size_t count = 0;for(Node* node = m_head; node; node = node->m_next){count++;}return count;}//得到首元素int& front(void){if(empty()){throw underflow_error("list under flow");}return m_head->m_data;}const int& front(void) const{return const_cast<List*>(this)->front();}//插入首元素void push_front(const int& data){m_head = new Node(data, m_head);}//删除首元素void pop_front(void){if(empty()){throw underflow_error("list under flow");}Node* temp = m_head; m_head = m_head->m_next;delete temp;temp = NULL;}//得到尾元素int& back(void){if(empty()){throw underflow_error("list under flow");}Node* node = m_head;while(node){if(!node->m_next){return node->m_data;}node = node->m_next;}}const int& back(void) const {return const_cast<List*>(this)->back();}//插入尾元素void push_back(const int& data){Node* node = m_head;while(node){if(!node->m_next){node->m_next = new Node(data, NULL);return;}node = node->m_next;}}//删除尾元素void pop_back(void){if(empty()){throw underflow_error("list under flow");}Node* node = m_head;while(node){if(!node->m_next->m_next){Node* temp = node->m_next;node->m_next = NULL;delete temp;temp = NULL;break;}node = node->m_next;}}//删除某个特定的元素void remove(const int& data){while(data == m_head->m_data){this->pop_front();}for(Node* node = m_head; node; node = node->m_next){if(node->m_next && data == node->m_next->m_data){Node* temp = node->m_next;node->m_next = node->m_next->m_next;delete temp;temp = NULL;}}}//打印整个链表friend ostream& operator<<(ostream& os, const List& list){for(Node* node = list.m_head; node; node = node->m_next){os << node;}return os;}private:class Node{public:int m_data;Node* m_next;Node(int data, Node* next = NULL):m_data(data), m_next(next){}/* 注意:重载输出/入运算符, 要定义全局函数,在类内定义时可定义为friend函数 *///打印节点friend ostream& operator<<(ostream& os, const Node& node){return os << "["<< node.m_data << "]";}};Node* m_head;};// 主函数测试int main(){List list;cout << list.size() << endl;list.push_front(5);list.push_front(6);list.push_front(5);list.push_front(5);cout << list.empty() << endl;list.push_back(21);list.push_back(22);cout << list.size() << endl;cout << list.empty() << endl;cout << "================" << endl;cout << list.front() << endl;cout << list.back() <<endl;list.pop_front();list.pop_back();cout << list.size() << endl;cout << list.empty() << endl;cout << "================" << endl;list.remove(5);cout << list.size() << endl;cout << list.empty() << endl;list.clear();cout << list.size() << endl;cout << list.empty() << endl;return 0;}
0 0
- 数据结构之——单链表的实现
- 数据结构之——双链表的实现
- 数据结构之单链表的实现
- 数据结构之单链表的实现
- 数据结构之单链表的实现
- 数据结构—单链表的实现
- 各种数据结构的完整实现之 单链表
- 数据结构之 单链表的实现与操作
- java数据结构之单链表的简单实现
- Java数据结构之单链表的实现
- Python-数据结构之单链表的实现
- 数据结构之单链表的Java实现
- 数据结构之单链表基本功能的实现
- 数据结构之单链表的C语言实现
- python 数据结构之单链表的实现
- 数据结构之单链表的基本实现
- 数据结构之——基于数组实现的循环队列
- 数据结构之——循环双向链表的实现
- Error:Unable to start the daemon process: could not reserve enough space for object heap.
- Swift基础1.4——基本语法——字符串
- 蒙特卡罗树搜索+深度学习 -- AlphaGo原版论文阅读笔记
- Netty4学习笔记(二) TCP黏包/拆包解决办法
- Swift基础1.5——基本语法——集合
- 数据结构之——单链表的实现
- 数据结构之——双链表的实现
- Swift基础2.1——函数
- Android开发之初识MVP模式
- SQL Server 2012时出现命名管道提供程序: 无法打开与 SQL Server 的连接
- [LeetCode]Implement Queue using Stacks
- Tutorial – Creating outline effect around objects
- 两种方法求解Fibonacci数列
- 页面性能优化的几个方面及解决方案