C++实现顺序表及双向链表

来源:互联网 发布:java nanotime 转秒 编辑:程序博客网 时间:2024/05/22 18:55

顺序表

#include <iostream>#include <assert.h>using namespace std;typedef int DataType;class SeqList{public://默认的构造函数,并初始化列表SeqList():_array(new DataType[3])//直接开辟空间, _size(0), _capacity(3){}//已有信息的构造函数,并拷贝信息到新空间上SeqList(DataType* array, size_t size):_array(new DataType[size]), _size(size), _capacity(size){for (size_t i = 0; i < size; i++){_array[i] = array[i];}}void PushBack(DataType data){CheckCapacity();_array[_size++] = data;}void PopBack(){assert(_size);  //断言,当元素为0,再尾删进行报错_size--;}//增容,开辟新空间,拷贝元素,释放旧空间void CheckCapacity(){if (_size == _capacity){DataType* temp = new DataType[_capacity << 1];if (temp == NULL){perror("temp");exit(EXIT_FAILURE);}for (int i = 0; i < _size; i++){temp[i] = _array[i];//temp[i++] = _array[i++];严重错误代码,i加了两次}delete[] _array;_array = temp;_capacity <<= 1; // 左移一位相当于乘以二}}//指定位置(下标)插入一个元素void Insert(size_t pos, DataType data){assert(pos <= _size);CheckCapacity();for (int i = _size; i > pos; i--){_array[i] = _array[i - 1];}_array[pos] = data;_size++;//插入一个元素,_size增大}//指定位置删除void Erase(size_t pos){assert(pos < _size);for (int i = pos; i < _size - 1; i++){_array[i] = _array[i + 1];}_size--;}size_t Size()const{cout << endl;cout << _size << endl;return _size;}size_t Capacity()const{cout << _capacity << endl;return _capacity;}//判断顺序表是否为空bool Empty()const{if (_size == 0){cout << 0;return false;}else{cout << 1;return true;}}//输入一个下标,返回下标对应的数据(又能读又能写)DataType& operator[](size_t index){return _array[index];}//与上一个函数成对出现,思考?什么场景下使用此函数(只读)const DataType& operator[](size_t index)const{return _array[index];}//返回顺序表第一个元素DataType& Front(){return _array[0];}const DataType& Front()const{return _array[0];}//返回顺序表最后一个元素DataType& Back(){return _array[_size - 1];}const DataType& Back()const{return _array[_size - 1];}void Display(){if (_size != 0){for (int i = 0; i < (int)_size; i++){cout << _array[i] << " ";}}cout << "" << endl;}void Clear(){_size = 0;}//逆序顺序表void Reserve(){DataType* left = _array;DataType* right = _array + _size - 1;while (left <= right){DataType tmp = *left;*left = *right;*right = tmp;left++;right--;}}//将元素表中的个数调整为newSizevoid ReSize(size_t newSize, const DataType& data = DataType()){if (newSize <= _size){_size = newSize;}else if (newSize <= _capacity){for (int i = _size; i < newSize; ++i){_array[i] = data;}_size = newSize;}else{for (int i = _size; i < newSize; i++){CheckCapacity();_array[i] = data;_size++;  //当比容量大的时候,让_size自增,到达容量时,自增}}}//拷贝构造函数(深拷贝)SeqList(const SeqList& s): _array(new DataType[s._size]), _size(s._size), _capacity(s._capacity){for (size_t i = 0; i < s._size; i++){_array[i] = s._array[i];}}//赋值运算符的重载SeqList& operator=(const SeqList& s){if (this != &s){for (size_t i = 0; i < s._size; i++){_array[i] = s._array[i];}_size = s._size;_capacity = s._capacity;}return *this;}friend ostream& operator<<(ostream& cout, const SeqList& s){for (int i = 0; i < s._size; i++){cout << s._array[i]<<" ";}cout << s._size << " " << s._capacity << endl;return cout;}~SeqList(){if (_array){delete[] _array;_array = NULL;_size = 0;_capacity = 0;}}private:DataType* _array;size_t _size;size_t _capacity;};void Funtest1(){int k[5] = { 1, 2, 3, 4, 5 };SeqList d1;SeqList d2(k,5);d1.PushBack(1);d1.PushBack(2);d1.PushBack(3);d1.Insert(2, 5);d1.Insert(1, 3);d1.Display();SeqList d3(d2);d3.Display();SeqList d4 = d3;d4.Display();/*d1.Erase(2);d1.Display();d1.Size();d1.Capacity();d1.Empty();*///d2.Display();//SeqList d3(d2);cout << d4;}void Funtest2(){int k[5] = { 1, 2, 3 };SeqList d1(k, 3);d1[0] = 2;d1.Display();cout << d1.Front() << endl;cout << d1.Back() << endl;d1.Reserve();d1.Display();d1.ReSize(7,7);d1.Display();}int main(){Funtest1();//Funtest2();getchar();return 0;}

双向链表:

1.在Find中,查找到后返回当前节点的下一个节点;

2.在Erase中,需要知道pos节点的数据,接收Find查找到数据的地址,作为pos。

#include <iostream>#include <assert.h>using namespace std;typedef int DataType;//双向链表struct Node{Node(const DataType& data): _pNext(NULL), _pPre(NULL), _data(data){}Node* _pNext;Node* _pPre;DataType _data;};class List{public:List():_pHead(NULL){}List(DataType* array, size_t size){for (size_t i = 0; i < size; ++i)PushBack(array[i]);}~List(){if (_pHead == NULL){return;}Node* _head = _pHead;Node* _tail = NULL;while (_head->_pNext){_head = _head->_pNext;}while (_head != _pHead)  //删除最后一个节点,_tail往前移{_tail = _head->_pPre;delete _head;_head = _tail;}_pHead = NULL;}Node* BuyNode(const DataType data){return new Node(data);}void PushBack(const DataType data){if (_pHead == NULL){_pHead = BuyNode(data);_pHead->_pPre = NULL;_pHead->_pNext = NULL;_pHead->_data = data;}else{Node* _head = _pHead;while (_head->_pNext){_head=_head->_pNext;}_head->_pNext = BuyNode(data);_head->_pNext->_pPre = _head;_head->_pNext->_pNext = NULL;}}void PopBack(){if (_pHead == NULL){return;}if (_pHead->_pNext == NULL){_pHead= NULL;return;}Node* _head = _pHead;while (_head->_pNext){_head = _head->_pNext;}_head->_pPre->_pNext = NULL;}void PushFront(const DataType data){if (_pHead == NULL){_pHead = BuyNode(data);_pHead->_pNext = NULL;_pHead->_pPre = NULL;_pHead->_data = data;}else{_pHead->_pPre = BuyNode(data);_pHead->_pPre->_pNext = _pHead;_pHead = _pHead->_pPre;_pHead->_pPre = NULL;}}void PopFront(){if (_pHead == NULL){return;}if (_pHead->_pNext == NULL){_pHead = NULL;return;}_pHead = _pHead->_pNext;_pHead->_pPre = NULL;}//指定位置删除,没有节点,删头结点,删尾节点,非头非尾,返回pos的后一个节点Node* Erase(Node* pos){assert(pos);if (_pHead == NULL)return NULL;if (pos == _pHead){PopFront();}else{Node* _head = _pHead;while (_head->_pNext)_head = _head->_pNext;if (pos == _head)PopBack();}Node* _head = _pHead;while (_head->_pNext){_head = _head->_pNext;if (_head==pos){pos->_pPre->_pNext = pos->_pNext;pos->_pNext->_pPre = pos->_pPre;delete pos;return _head->_pNext;}}}Node* Insert(Node* pos, const DataType& data){assert(pos);if (pos == _pHead){PushFront(data);return pos->_pNext;}Node* newnode=BuyNode(data);//既不是头结点也不是尾节点pos->_pPre->_pNext = newnode;newnode->_pNext = pos;newnode->_pPre = pos->_pPre;pos->_pPre = newnode;newnode->_data = data;return pos->_pNext;}Node* Find(const DataType& data){Node* _head = _pHead;if (_head == NULL){return NULL;}while (_head->_pNext){if (_head->_data == data){return _head;}_head = _head->_pNext;}if (_head->_data == data){return _head;}return NULL;}size_t Size(){int count=1;if (_pHead == NULL){return 0;}else{while (_pHead->_pNext!= NULL){_pHead = _pHead->_pNext;++count;}}return count;}//从后往前删,找出最后节点的前一个节点为tail,删除最后一个节点void Clear(){if (_pHead == NULL){return;}Node* _head = _pHead;Node* _tail = NULL;while (_head->_pNext){_head = _head->_pNext;}while (_head!= _pHead)  //删除最后一个节点,_tail往前移{_tail = _head->_pPre;delete _head;_head = _tail;}_pHead = NULL;}void Display(){if (_pHead == NULL){return;}Node* head = _pHead;while (head)// 最后一个节点的下一指针指向空{cout << head->_data << " " ;head=head->_pNext;}cout << endl;}bool Empty(){if (_pHead == NULL){return true;}return false;}private:Node* _pHead;};void Funtest(){List L1;L1.PushBack(1);L1.PushBack(2);L1.PushBack(3);/*L1.PushBack(4);L1.PushFront(2);L1.PushFront(3);L1.PushFront(4);*///L1.Display();/*L1.PopFront();L1.PopFront();L1.PopFront();*///L1.Clear();L1.Display();/*L1.Erase(L1.Find(3));*/L1.Insert(L1.Find(3),4);L1.Display();int arr[] = { 1, 2, 3, 4, 5 };List L2(arr, 5);L2.Display();}int main(){Funtest();getchar();return 0;}