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;}

原创粉丝点击