C++方式封装顺序表、单链表和双向链表
来源:互联网 发布:数据库dmp是什么文件 编辑:程序博客网 时间:2024/09/21 06:19
1.顺序表
Seqlist.h
#pragma oncetypedef int DataType;class Seqlist{public:Seqlist()//构造:_array(NULL), _size(0), _capacity(0){}Seqlist(const Seqlist& s)//拷贝构造{_array = (DataType*)malloc(sizeof(DataType)*s._size);memcpy(_array, s._array, sizeof(DataType)*s._size);_size = _capacity = s._size;}Seqlist& operator=(const Seqlist& s)//赋值运算符的重载{if (this != &s){free(_array);_array = (DataType*)malloc(sizeof(DataType)*s._size);memcpy(_array, s._array, sizeof(DataType)*s._size);}return *this;}~Seqlist()//析构{if (_array){free(_array);_size = _capacity;_array = NULL;}}void PushBack(DataType x)//尾插{CheckCapacity();_array[_size++] = x;}void PopBack()//尾删{assert(_size > 0);--_size;}void PushFront(DataType x)//头插{CheckCapacity();int end = _size - 1;while (end >= 0){_array[end + 1] = _array[end];--end;}_array[0] = x;++_size;}void PopFront()//头删{assert(_size > 0);for (size_t i = 1; i < _size; ++i){_array[i - 1] = _array[i];}--_size;}inline void Insert(size_t pos, DataType x)//指定一个位置插入{assert(pos <= _size);CheckCapacity();for (int end = _size - 1; end >= (int)pos; --end){_array[end + 1] = _array[end];}_array[pos] = x;++_size;}inline void Erase(size_t pos)//指定一个位置删除{assert(pos <= _size);for (size_t i = pos + 1; i < _size; ++i){_array[i - 1] = _array[i];}--_size;}inline DataType& operator[](size_t pos)//[]重载 修改任意位置的数据{assert(pos < _size);return _array[pos];}void CheckCapacity()//检查容量{if (_size == _capacity){_capacity = _capacity * 2 + 3;_array = (DataType*)realloc(_array, _capacity*sizeof(DataType));}}void Print()//打印函数{for (size_t i = 0; i < _size; ++i){cout << _array[i] << " ";}cout << endl;}private:DataType* _array;size_t _size;size_t _capacity;};void TestSeqlist(){Seqlist s;s.PushBack(1);s.PushBack(2);s.PushBack(3);s.PushBack(4);s.Print();s.PopBack();s.Print();s.PushFront(0);s.Print();s.PopFront();s.Print();s.Insert(0, 30);s.Print();s.Erase(0);s.Print();}
test.cpp
#include <iostream>#include <assert.h>using namespace std;#include "Seqlist.h"int main(){TestSeqlist();system("pause");return 0;}
2.单链表
SList.h
#pragma oncetypedef int DataType;struct SlistNode{SlistNode* _next;DataType _data;SlistNode(DataType x):_data(x),_next(NULL){}};class Slist{typedef SlistNode Node;public:Slist(): _head(NULL), _tail(NULL){}Slist(const Slist& s);Slist& operator=(const Slist& s);~Slist(){Node* cur = _head;while (cur){Node* next = cur->_next;delete cur;cur = next;}_head = _tail = NULL;}Node* BuyNode(DataType x){Node* node = (Node*)malloc(sizeof(Node));node->_data = x;node->_next = NULL;return node;}void PushBack(DataType x){if (_head == NULL){_head = _tail = new Node(x);}else{_tail->_next = new Node(x);_tail = _tail->_next;}}void PopBack(){if (_head == NULL){return;}else if (_head == _tail){delete _head;_head = _tail = NULL;}else{Node* prev = _head;while (prev->_next != _tail){prev = prev->_next;}delete _tail;_tail = prev;_tail->_next = NULL;}}void PushFront(DataType x){if (_head == NULL){_head = _tail = new Node(x);}else{Node* tmp = new Node(x);tmp->_next = _head;_head = tmp;}}void PopFront(){if (_head == NULL){return;}else if (_head == _tail){delete _head;_head = _tail = NULL;}else{Node* del = _head;_head = _head->_next;delete del;}}void Print(){Node* cur = _head;while(cur){cout << cur->_data << " ";cur = cur->_next;}cout << endl;}private:Node* _head;Node* _tail;};void TestSlist(){Slist s;s.PushBack(1);s.PushBack(2);s.PushBack(3);s.PushBack(4);s.PushBack(5);s.Print();}test.cpp
#include <iostream>#include <assert.h>using namespace std;#include "SList.h"int main(){TestSlist();system("pause");return 0;}
3.双向链表
List.h
#pragma oncetypedef int DataType;struct ListNode{ListNode* _next;ListNode* _prev;DataType _data;ListNode(DataType x):_next(NULL),_prev(NULL),_data(x){}};class List{typedef ListNode Node;public:List()//构造:_head(NULL),_tail(NULL){}List(const List& s)//拷贝构造:_head(NULL),_tail(NULL){Node* cur = s._head;while (cur){PushBack(cur->_data);cur = cur->_next;}}List& operator=(const List& s)//赋值运算符的重载{if (this != &s){Node* cur = _head;while (cur){Node* next = cur->_next;delete cur;cur = next;}_head = _tail = NULL;Node* tmp = s._head;while (tmp){PushBack(tmp->_data);tmp = tmp->_next;}}return *this;}~List()//析构{if (_head){Node* cur = _head;while (_head){cur = _head;_head = _head->_next;delete cur;}_head = _tail = NULL;}}void PushBack(DataType x)//尾插{if (_head == NULL){Node* cur = new Node(x);cur->_next = NULL;cur->_prev = NULL;_head = _tail = cur;}else{Node* cur = new Node(x);_tail->_next = cur;cur->_prev = _tail;_tail = cur;}}void PopBack()//尾删{if (_head == NULL){return;}else if (_head->_next == NULL){delete _head;_head = _tail = NULL;}else{Node* cur = _tail;_tail = _tail->_prev;_tail->_next = NULL;delete cur;}}void PushFront(DataType x)//头插{if (_head == NULL){_head = _tail = new Node(x);}else{Node* cur = new Node(x);cur->_next = _head;_head->_prev = cur;_head = _head->_prev;}}void PopFront()//头删{if (_head == NULL){return;}else if (_head->_next == NULL){delete _head;_head = _tail = NULL;}else{Node* cur = _head;_head = _head->_next;delete cur;_head->_prev = NULL;}}Node* Find(DataType x)//找一个数据{Node* cur = _head;while (cur){if (cur->_data == x)return cur;cur = cur->_next;}return NULL;}void Insert(Node* pos, DataType x)//在指定位置前插入一个数据{assert(pos);if(pos->_prev == NULL){PushFront(x);}else{Node* front = pos->_prev;Node* last = new Node(x);last->_prev = front;last->_next = pos;front->_next = last;pos->_prev = last;}}void Erase(Node* pos)//删除指定位置{assert(pos);if(pos->_prev == NULL){PopFront();}else if (pos->_next == NULL){PopBack();}else{Node* front = pos->_prev;Node* last = pos->_next;front->_next = last;last->_prev = front;delete pos;}}void Print()//打印函数{Node* cur = _head;while (cur){cout << cur->_data << " ";cur = cur->_next;}cout << endl;}private:Node* _head;Node* _tail;};void TestList(){List s;s.PushBack(1);s.PushBack(2);s.PushBack(3);s.PushBack(4);s.Print();s.PopBack();s.Print();s.PushFront(0);s.Print();s.PopFront();s.Print();s.Insert(s.Find(1), 0);s.Print();s.Erase(s.Find(0));s.Print();List s1(s);s1.Print();List s2;s2 = s1;s2.Print();s2 = s2;s2.Print();}test.cpp
#include <iostream>#include <assert.h>using namespace std;#include "List.h"int main(){TestList();system("pause");return 0;}
阅读全文
0 0
- C++方式封装顺序表、单链表和双向链表
- c++封装双向链表和顺序表
- 【C++】实现顺序表、单链表和双向链表
- c++实现顺序表、单链表和双向链表
- C++类实现顺序表和双向链表
- 双向链表c
- C双向链表
- 【C++】双向链表
- 【C++】双向链表
- C 双向链表
- 数据结构封装之《DLinkList双向链表》
- 类的封装性 -- 双向链表
- 数据结构封装之《DLinkList双向链表》
- 双向链表(c++封装)
- 顺序表,单链表,单循环链表,双向循环链表
- C++实现顺序表->单链表->双向链表
- 单链表和双向链表
- 数组、单链表和双链表介绍 和 双向链表的C/C++/Java实现
- bzoj3083遥远的国度 树链剖分+线段树
- MySql的Blob插入(JDBC)
- Jira的安装、使用与集成
- 线性代数 -- 子空间的投影(二)
- sqoop安装配置
- C++方式封装顺序表、单链表和双向链表
- Jedis 连接池实例
- 设置centos7之间ssh无密码登录
- 软件测试之检查产品说明书
- Redis的数据结构之字符串 0
- 1069. The Black Hole of Numbers (20)
- Spring_IOC 之 bean 的配置
- android 休眠唤醒机制分析(一) — wake_lock
- 欢迎使用CSDN-markdown编辑器