boost模板库与线性表
Boost的安装
使用boost,首先需要进行的环境配置。
#include <iostream> #include <string> #include<boost/array.hpp>//区别 using namespace std; void main() { boost::array<int, 10> myarray = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; boost::array<int, 10>::iterator ibegin = myarray.begin(); boost::array<int, 10>::iterator iend = myarray.end(); for (;ibegin!=iend;ibegin++) { cout << *ibegin << endl; } cin.get(); }
线性表顺序存储
Myvector.h
#pragma once template <class T> class myvector { public: myvector(); ~myvector(); void push_back(T t); //增 删 查 改 T *find(T t); void change(T*pos, T t); void del(T t); void show(); T operator [](int i); void insert(T findt, T t); public: T *p; int n;//标记内存长度 int realn;//实际长度 };
Myvector.cpp
#include "myvector.h" template <class T> myvector<T>::myvector() { p = nullptr; n = realn = 0; } template <class T> myvector<T>::~myvector() { if (p!=nullptr) { delete []p; p = nullptr;//清空 } } template <class T> void myvector<T>::push_back(T t) { if (p==nullptr) { p = new T;//分配内存 *p = t;//赋值 realn = n = 1; } else { T *ptemp = new T[n + 1];//重新分配内存 for (int i = 0; i < n;i++) { *(ptemp + i) = *(p + i);//拷贝 } *(ptemp + n) = t;//赋值最后一个元素 delete []p; p = ptemp; realn += 1; n += 1; } } template <class T> void myvector<T>::show() { if (p==NULL) { return; } else { for (int i = 0; i < realn;i++) { cout << p[i] << " "; } cout << "\n"; } } template <class T> T * myvector<T>::find(T t) { for (int i = 0; i < realn; i++) { if (t==*(p+i)) { return p + i; } } return nullptr; } template <class T> void myvector<T>::change(T*pos, T t) { if (pos==nullptr) { return; } else { *pos = t; } } template <class T> void myvector<T>::del(T t) { int pos = -1; for (int i = 0; i < realn; i++) { if (t == *(p + i)) { pos = i; break; } } if (pos!=-1) { if (pos== realn-1) { realn -= 1; } else { for (int i = pos; i < realn-1;i++) { p[i] = p[i + 1]; } realn -= 1; } } } template <class T> void myvector<T>::insert(T findt, T t) { if (n == realn) { { int pos = -1; for (int i = 0; i < realn; i++) { if (findt== *(p + i)) { pos = i; break; } } if (pos!=-1) { //重新分配内存并拷贝 { T *ptemp = new T[n + 1];//重新分配内存 for (int i = 0; i < n; i++) { *(ptemp + i) = *(p + i);//拷贝 } delete[] p; p = ptemp; realn += 1; n += 1; } for (int i = realn - 2; i>=pos;i--) { p[i + 1]=p[i];//往前移动 } p[pos] = t; } } } else { int pos = -1; for (int i = 0; i < realn; i++) { if (findt == *(p + i)) { pos = i; break; } } if (pos != -1) { for (int i = realn - 1; i >= pos; i--) { p[i + 1] = p[i];//往前移动 } p[pos] = t; realn += 1; } } } template <class T> T myvector<T>::operator [](int i) { if (i < 0 || i>=realn) { return NULL; } return p[i]; }
Main.cpp
#include <iostream> #include<stdlib.h> #include <vector> #include <string> #include "myvector.h" #include "myvector.cpp"//因为有template //一定要学会自己怎么写模板库 //自己写的模板,写的通用是很难的 using namespace std; void main() { myvector<int> myv1; myv1.push_back(11); myv1.push_back(12); myv1.push_back(13); myv1.push_back(14); myv1.push_back(15); myvector<int> myv2; myv2.push_back(31); myv2.push_back(32); myv2.push_back(33); myvector<int> myv3; myv3.push_back(131); myv3.push_back(132); myv3.push_back(133); myv3.push_back(1337); myvector< myvector<int>* > myvv;//自己写的模板嵌套用指针 myvv.push_back(&myv1); myvv.push_back(&myv2); myvv.push_back(&myv3); myvv[0]->show(); myvv[1]->show(); myvv[2]->show(); cin.get(); } void main1() { myvector<int> myv; myv.push_back(11); myv.push_back(12); myv.push_back(13); myv.push_back(14); myv.push_back(15); myv.show(); cin.get(); } void main2() { myvector<double> myv; myv.push_back(11.2); myv.push_back(12.0); myv.push_back(13.5); myv.push_back(14.9); myv.push_back(15.90); myv.show(); cin.get(); } void main5() { myvector<char *> myv; myv.push_back("av"); myv.push_back("va"); myv.push_back("cc"); myv.push_back("tv"); myv.show(); cin.get(); } void main4() { vector<string> myv;// myv.push_back("av"); myv.push_back("va"); myv.push_back("cc"); myv.push_back("tv"); cin.get(); } void main312() { myvector<int> myv; myv.push_back(11); myv.push_back(12); myv.push_back(13); myv.push_back(14); myv.push_back(15); myv.show(); int *p = myv.find(13); cout << p << endl; myv.change(p, 23);// myv.show(); myv.del(12); myv.insert(23, 99); myv.show(); cout << myv[2] << endl; cin.get(); }
线性表链式存储
Node.h
#pragma once template <class T> class Node { public: T t;//数据 Node *pNext;//指针域 };
List.h
#pragma once #include "Node.h" #include <iostream> template <class T> class List { public: Node<T> *pHead; public: List(); void add(T t);//尾部插入 void show();//显示 Node<T> * find(T t);//查找 void change(Node<T> *p, T newt);//修改 int getnum();//获取个数 bool deletet(T t); void sort(); void deletesame();//删除相同的元素 bool clear(); void rev(); void insert(T oldt, T newt); void merge(List & list); ~List(); };
List.cpp
#include "List.h" template <class T> List<T>::List() { this->pHead = nullptr;//设置空节点 cout << "链表创建" << endl; } template <class T> List<T>::~List() { cout << "链表销毁" << endl; } template <class T> void List<T>::add(T t) { Node<T> *pnew = new Node<T>;//分配节点 pnew->t = t;//赋值 pnew->pNext = nullptr; if (pHead==nullptr) { this->pHead = pnew;//头结点 } else { Node<T> *p = pHead;//获取头结点位置 while (p->pNext!=nullptr)//循环到尾部 { p = p->pNext; } p->pNext = pnew; } } template <class T> void List<T>::show() { Node<T> *p = pHead;//获取头结点位置 while (p!= nullptr)//循环到尾部 { cout << p->t << " "; p = p->pNext; } cout << endl; } template <class T> Node<T> * List<T>::find(T t) { Node<T> *p = pHead;//获取头结点位置 while (p != nullptr)//循环到尾部 { if (p->t==t) { return p; } p = p->pNext; } return nullptr; } template <class T> void List<T>::change(Node<T> *p, T newt) { if (p==nullptr) { return; } p->t = newt; } template <class T> int List<T>::getnum() { int i = 0; Node<T> *p = pHead;//获取头结点位置 while (p != nullptr)//循环到尾部 { i++; p = p->pNext; } return i; } template <class T> bool List<T>::deletet(T t) { Node<T> *p = this->find(t); if (p==nullptr) { return false; } else { if (p==pHead)//头结点 { pHead = p->pNext; delete p; } else { Node<T> *p1, *p2; p1 = pHead; p2 = p1->pNext; while (p2!=p)//删除一个节点,获取前一个节点 { p1 = p2; p2 = p2->pNext; } p1->pNext = p2->pNext;//跳过p2 delete p2; } return true; } } template <class T> void List<T>::sort() { for (Node<T> *p1 = pHead; p1 != NULL;p1=p1->pNext) { for (Node<T> *p2 = pHead; p2!= NULL; p2 = p2->pNext) { if (p1->t < p2->t) { T temp; temp = p1->t; p1->t = p2->t; p2 -> t = temp; } } } } template<class T> void List<T>::deletesame()//重新生成 { Node<T> *p1, *p2; p1 = pHead->pNext; p2 = pHead; while (p1!=nullptr) { if (p1->t==p2->t) { //cout << "="; p2->pNext = p1->pNext; delete p1; p1 = p2->pNext; } else { p2 =p1; p1 = p1->pNext; } } } template<class T> bool List<T>::clear() { if (pHead ==nullptr) { return false; } Node<T> *p1, *p2; p1 = pHead->pNext; while (p1!=nullptr) { p2 = p1->pNext; delete p1; p1 = p2; } delete pHead; pHead = nullptr; return true; } template<class T> //递归 void List<T>::rev() { if (pHead==nullptr || pHead->pNext==nullptr) { return; } else { Node<T> *p1, *p2, *p3; p1 = pHead; p2 = p1->pNext; while (p2!=nullptr) { p3 = p2->pNext; p2->pNext = p1; p1 = p2; p2 = p3; } pHead->pNext= nullptr; pHead = p1; } } template<class T> void List<T>::insert(T oldt, T newt) { Node<T> *p = find(oldt); if (p!=nullptr) { Node<T> *p1, *p2; p1 = pHead; p2 = p1->pNext; while (p2 != p) { p1 = p2; p2 = p2->pNext; } Node<T> *pnew = new Node<T>; pnew->t = newt; pnew->pNext = p2; p1->pNext = pnew; } } template<class T> void List<T>::merge(List & list) { Node<T> *p = pHead;//获取头结点位置 while (p->pNext != nullptr)//循环到尾部 { p = p->pNext; } p->pNext = list.pHead;// }
Main.cpp
#include<iostream> #include<string> #include "List.h" #include "List.cpp" #include "Node.h" using namespace std; void main() { List<int> * pmylist1 = new List<int>; pmylist1->add(11); pmylist1->add(11); pmylist1->add(12); pmylist1->add(12); List<int> * pmylist2 = new List<int>; pmylist2->add(11); pmylist2->add(11); pmylist2->add(12); List< List<int> *> *p=new List< List<int> *>; p->add(pmylist1); p->add(pmylist2); p->pHead->t->show(); p->pHead->pNext->t->show(); p->show(); cin.get(); } void main213() { List<char *> cmdlist; cmdlist.add("china"); cmdlist.add("calc"); cmdlist.add("born"); cmdlist.add("xery"); cmdlist.show(); cin.get(); } void main4() { List<int> * pmylist = new List<int>; pmylist->add(11); pmylist->add(11); pmylist->add(12); pmylist->add(12); pmylist->add(12); pmylist->add(12); pmylist->add(15); pmylist->add(11); pmylist->show(); List<int> list; list.add(1231); list.add(1232); list.add(1239); list.add(1237); list.show(); pmylist->merge(list); pmylist->show(); delete pmylist; cin.get(); } void main3() { List<int> * pmylist = new List<int>; pmylist->add(11); pmylist->add(11); pmylist->add(12); pmylist->add(12); pmylist->add(12); pmylist->add(12); pmylist->add(15); pmylist->add(11); pmylist->add(12); pmylist->add(12); pmylist->add(12); pmylist->add(12); pmylist->add(15); pmylist->show(); pmylist->sort(); pmylist->show(); pmylist->deletesame(); pmylist->show(); pmylist->rev(); pmylist->show(); pmylist->insert(12, 1100); pmylist->show(); pmylist->clear(); pmylist->show(); delete pmylist; cin.get(); } void main1() { List<int> * pmylist =new List<int>; pmylist->add(11); pmylist->add(12); pmylist->add(13); pmylist->add(15); pmylist->show(); Node<int > *p = pmylist->find(13); pmylist->change(p, 19); pmylist->show(); pmylist->deletet(15); pmylist->show(); delete pmylist; cin.get(); }
哈希存储
插入、删除很不方便,查找最方便。O(1).
Hashnode.h
#pragma once template<class T> class hashnode { public: int key;//索引 T t; //代表数据 int cn;//代表查找次数 }; //0 1 2 3 4 5 6 7 8 9 索引 //9 10, //10 1 2 3 4 5 6 7 8 9 数据 哈希 //100
Hash.h
#pragma once #include "hashnode.h" template<class T> class Hash { public: hashnode<T> *p;//p->存储哈希表 int n;//长度 public: int myhash(int key ); void init(T * pt, int nt); bool isin(int key,T t); hashnode<T> * find(int key); Hash(); ~Hash(); };
Hash.cpp
#include "Hash.h" template<class T> Hash<T>::Hash() { this->n = 10; this->p = new hashnode<T>[this->n]; } template<class T> Hash<T>::~Hash() { delete[] p; } template<class T> int Hash<T>::myhash(int key) { return key % n; } template<class T> void Hash<T>::init(T *pt,int nt) { for (int i = 0; i < 10;i++) { p[i].key = i; p[i].t = pt[i]; p[i].cn = 0; } } template<class T> bool Hash<T>::isin(int key,T t) { int res = myhash(key); if (p[res].t==t) { return true; } else { return false; } } template<class T> hashnode<T> * Hash<T>::find(int key) { int res = myhash(key); return p + res; }
Main.cpp
#include<iostream> #include "Hash.h" #include "Hash.cpp" #include "hashnode.h" using namespace std; void main() { Hash<int> myhash; int a[10] = { 10, 11, 22, 33, 44, 55, 56, 67, 78, 99 }; myhash.init(a, 10); cout << myhash.isin(43,43) << endl; hashnode<int > *p = myhash.find(8); cout << p->key << endl; cout << p->t << endl; cin.get(); }