c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)
2016-05-29 22:50
471 查看
c++中的双向链表写法,主要实现(增删查改,链表逆置,构造函数,运算符重载,等)
本文主要内容
1)介绍c++中双向链表的写法。
2)实现双向链表中数据的增、删、查、改、链表逆置、链表输出
3)介绍类中构造函数、析构函数、运算符重载函数的写法
接下来介绍双向链表的成员函数:这写函数放在头文件中,方便编写
方法一:交换每个节点的前驱和后继。
方法二:创建新的链表,从远链表上摘节点然后补到新链表上
当然还有主函数(测试用例)
#include"List.h"
void Test3()
{
cout << endl;
List l1;
l1.PushFront(1);
l1.PushBack(2);
l1.PushBack(3);
l1.PushBack(4);
l1.PushBack(5);
l1.PushBack(6);
//l1.PushFront(4);
//l1.PopFront();//前删
//l1.PopBack();//后删
//ListNode *pos = l1.Find(3);
//l1.Insert(pos, 5);
//l1.Erase(pos);
cout << "l1 :";
l1.PrintList();
l1.PrintReverseList();
cout << "逆置l1 :";
l1.Reverse();
l1.PrintList();
l1.PrintReverseList();
cout << "拷贝构造-》 l2 :";
List l2(l1);
l2.PrintList();
cout << "赋值运算符重载 -》 l3 :";
List l3;
l3 = l2;
l3.PrintList();
}
int main()
{
Test3();
system("pause");
return 0;
}[/code] 以上函数均是在学习的过程中总结写出的,肯定会有一些疏漏或者错误之处,所以敬请各位大神的批评指正,谢谢
本文出自 “分享中进步” 博客,请务必保留此出处http://xmwen1.blog.51cto.com/10730069/1748216
本文主要内容
1)介绍c++中双向链表的写法。
2)实现双向链表中数据的增、删、查、改、链表逆置、链表输出
3)介绍类中构造函数、析构函数、运算符重载函数的写法
接下来介绍双向链表的成员函数:这写函数放在头文件中,方便编写
List::List() :_head(NULL), _tail(NULL) {}2)构造函数中的拷贝构造
List::List(List&s) :_head(NULL), _tail(NULL) { ListNode*cur = s._head; while (cur) { PushBack(cur->_data); cur = cur->_next; } }3)赋值运算符重载
List& List::operator=(const List&s) { _head = NULL; _tail = NULL; ListNode*cur = s._head; while (cur) { PushBack(cur->_data); cur = cur->_next; } return *this; }4)析构函数
List::~List() { Clear(); } void List::Clear() { cout << ]5)增加节点的函数(三种,前增、后增、给定节点后插入) void List::PushFront(DataType x) { if (_head == NULL) { _head = new ListNode(x); _tail = _head; } else { ListNode*temp = new ListNode(x); _head->_prev = temp; temp->_next = _head; _head = temp; } } void List::PushBack(DataType x)//后增 { if (_head == NULL) { _head = new ListNode(x); _tail = _head; } else { ListNode*temp = new ListNode(x); _tail->_next = temp; temp->_prev = _tail; _tail = temp; } } void List::Insert(ListNode *pos, DataType x) { assert(pos); if (pos == _tail) { PushBack(x); } else { ListNode*cur = pos->_next; ListNode*temp = new ListNode(x); temp->_next = cur; temp->_prev = pos; pos->_next = temp; cur->_prev = temp; } }6)删除节点(三种,前删、后删、删除给定节点)
7)寻找节点 ListNode* List::Find(DataType x) { if (_head == NULL) { cout << "空链表!" << endl; return NULL; } ListNode*cur = _head; while (cur) { if (cur->_data == x) return cur; cur = cur->_next; } }8)双向链表逆置(两种方法)
方法一:交换每个节点的前驱和后继。
方法二:创建新的链表,从远链表上摘节点然后补到新链表上
9)打印链表(两种,顺序打印、逆序打印) void List::PrintList()//顺序打印 { ListNode*cur = _head; while (cur) { cout << cur->_data << "->"; cur = cur->_next; } cout << "NULL" << endl; } void List::PrintReverseList()//逆序打印 { cout << "从后向前:"; ListNode*cur = _tail; while (cur) { cout << cur->_data << "->"; cur = cur->_prev; } cout << "NULL" << endl; }
当然还有主函数(测试用例)
#include"List.h"
void Test3()
{
cout << endl;
List l1;
l1.PushFront(1);
l1.PushBack(2);
l1.PushBack(3);
l1.PushBack(4);
l1.PushBack(5);
l1.PushBack(6);
//l1.PushFront(4);
//l1.PopFront();//前删
//l1.PopBack();//后删
//ListNode *pos = l1.Find(3);
//l1.Insert(pos, 5);
//l1.Erase(pos);
cout << "l1 :";
l1.PrintList();
l1.PrintReverseList();
cout << "逆置l1 :";
l1.Reverse();
l1.PrintList();
l1.PrintReverseList();
cout << "拷贝构造-》 l2 :";
List l2(l1);
l2.PrintList();
cout << "赋值运算符重载 -》 l3 :";
List l3;
l3 = l2;
l3.PrintList();
}
int main()
{
Test3();
system("pause");
return 0;
}[/code] 以上函数均是在学习的过程中总结写出的,肯定会有一些疏漏或者错误之处,所以敬请各位大神的批评指正,谢谢
本文出自 “分享中进步” 博客,请务必保留此出处http://xmwen1.blog.51cto.com/10730069/1748216
相关文章推荐
- [C++] 利用模板的模板参数实现单链表
- 注释转换小项目(c注释-&gt;到c++注释)
- 九九乘法表的C语言实现
- 利用C语言实现折半查找
- 利用C语言编程:有一个分数序列 2/1+3/2+5/3+8/5+13/8+...,求此序列前N项和的简单解法,
- 经典的猴子吃桃问题,C语言算法,根据天数和当日桃子个数,求第一天猴子所摘桃的个数,
- 在字符串中找出第一个只出现一次的字符。经典C语言例题
- 用C语言编程,实现调整数组,使奇数全部位于偶数前边,
- 用C语言编写函数,实现strlen计算字符串长度的功能
- VC 对话框屏蔽ESC 和回车键 默认结束对话框
- python绑定C++类
- c++作业6
- leetcode #53 in cpp
- C++中父类成员变量和子类成员变量重复定义及访问方法的深入探究
- C++随笔:.NET CoreCLR之GC探索(3)
- C/C++ 获取汉字拼音首字母
- C++ 循环结构 的课堂笔记以及知识点
- c语言学习笔记17之函数
- C++与引用2
- 关于vptr的一些问题