list.h
#ifndef LIST_H #define LIST_H #pragma once templateclass list { private: T **pArr; int size; int length; public: list (int size); // 赋值运算符重载 list & operator=(const list & plist); // 拷贝构造 list (const list & plist); ~list(); // 指定位置添加数值 void array_insert(int pos,T* value); // 遍历数组 void array_foreach(void(*print)(T*)); // 获取指定位置元素 T *array_index(int index); // 指定位置删除数组 T* array_splice(int pos,int num=1); // 头插 void array_unshift(T *value); // 尾插 void array_push(T *value); // 头删 T * array_shift(); // 尾删 T * array_pop(); // 翻转数组 void array_reverse(); // 获取数组总长度 int array_size(); // 获取数组大小 int array_length(); // 清空数组 void array_clear(); }; #endif //TEST1_LIST_H
list.cpp
#include#include #include "list.h" using namespace std; // 初始化 template list ::list(int size){ if(size<0) return ; this->pArr=new T*[size]; this->size=size; this->length=0; } // 析构 template list ::~list(){ delete this->pArr; this->pArr=NULL; this->size=0; this->length=0; } // 指定为添加数组 template void list ::array_insert(int pos,T* value){ if(!value) return ; if(pos<0||pos>this->length) pos=this->length; if(this->length==this->size){ T **tmp=new T*[this->size+100]; memcpy(tmp,this->pArr,this->size*sizeof(T*)); delete this->pArr; this->pArr=tmp; this->size+=100; } for(int i=this->length;i>=pos;i--){ this->pArr[i] = this->pArr[i-1]; } this->pArr[pos]=value; this->length++; } // 遍历数组 template void list ::array_foreach(void(*print)(T*)){ if(!this->pArr) return ; for(int i=0;i length;++i){ print(this->pArr[i]); } } // 获取数组总大小 template int list ::array_size(){ if(this->pArr) return this->size; else return -1; } // 获取数组长度 template int list ::array_length(){ if(this->pArr) return this->length; else return -1; } // 删除指定位置元素 template T* list ::array_splice(int pos,int num){ if(pos<0||pos>this->length||num>this->length) return NULL; T *data=this->pArr[pos]; for(int i=pos;i length-num;i++){ this->pArr[i]=this->pArr[i+num]; } this->length-=num; return data; } // 头插 template void list ::array_unshift(T *value){ if(!value) return; if(this->size==this->length){ T **tmp=new T*[this->size+100]; memcpy(tmp,this->pArr,this->size*sizeof(T*)); delete this->pArr; this->pArr=tmp; this->size+=100; } for(int i=this->length;i>0;i--){ this->pArr[i]=this->pArr[i-1]; } this->pArr[0]=value; this->length++; } // 尾插 template void list ::array_push(T *value){ if(!value) return; if(this->size==this->length){ T **tmp=new T*[this->size+100]; memcpy(tmp,this->pArr,this->size*sizeof(T*)); delete this->pArr; this->pArr=tmp; this->size+=100; } this->pArr[this->length]=value; this->length++; } // 头删 template T * list ::array_shift(){ if(!this->pArr||this->length==0) return NULL; T *data=this->pArr[0]; for(int i=0;i length;++i){ this->pArr[i]=this->pArr[i+1]; } this->length--; return data; } // 尾删 template T * list ::array_pop(){ if(!this->pArr||this->length==0) return NULL; T *data=this->pArr[this->length-1]; this->pArr[this->length-1]=this->pArr[this->length]; this->length--; return data; } // 翻转数组 template void list ::array_reverse(){ if(!this->pArr||this->length==0) return ; for(int i=0;i length/2;++i){ T *tmp=this->pArr[i]; this->pArr[i]=this->pArr[this->length-i-1]; this->pArr[this->length-i-1]=tmp; } } // 清空数组 template void list ::array_clear(){ this->length=0; this->size=0; delete this->pArr; this->pArr=NULL; } // 获取指定为元素 template T *list ::array_index(int index){ if(index<0||index>this->length-1) return NULL; return this->pArr[index]; } // 赋值操作 template list & list ::operator=(const list & plist){ // if(this->length!=0) // free(this->pArr); // cout< pArr=new T*[plist.size]; memcpy(this->pArr,plist.pArr,plist.size*sizeof(T*)); this->size=plist.size; this->length=plist.length; return *this; } template list ::list(const list & plist){ this->pArr=new T*[plist.size]; memcpy(this->pArr,plist.pArr,plist.size*sizeof(T*)); this->size=plist.size; this->length=plist.length; }
test.cpp
#include "list/list.cpp" #include#include using namespace std; struct person{ int id; string name; int age; }; template void myPrint(T *value){ struct person *p=(struct person *)value; cout<<"id:"< id<<" name:"< name<<" age:"< age< void deletePrint(T *value){ delete value; } void test(){ struct person p1={1,"Andy",21}; struct person p2={2,"Tom",21}; struct person p3={3,"Sam",21}; struct person p4={4,"Tony",21}; struct person p5={5,"Tim",21}; struct person p6={6,"Jack",21}; struct person p7={7,"Sam",21}; struct person p8={8,"John",21}; list *plist=new list (5); struct person *p; string choose; while(true){ system("cls"); cout<<"t"< >choose; // 指定位置添加 if(choose=="1"){ int pos; p=new person(); cout<<"pos:"; cin>>pos; cout<<"id:"; cin>>p->id; cout<<"name:"; cin>>p->name; cout<<"age:"; cin>>p->age; // cout< id< name< age< array_insert(pos,p); // 头插 }else if(choose=="2"){ p=new person(); cout<<"id:"; cin>>p->id; cout<<"name:"; cin>>p->name; cout<<"age:"; cin>>p->age; plist->array_unshift(p); // 尾插 }else if(choose=="3"){ p=new person(); cout<<"id:"; cin>>p->id; cout<<"name:"; cin>>p->name; cout<<"age:"; cin>>p->age; plist->array_push(p); // 指定位置删除 }else if(choose=="4"){ int pos,num=1; cout<<"删除位置:"; cin>>pos; cout<<"删除几个:"; cin>>num; p=(struct person *)plist->array_splice(pos,num); if(!p){ cout<<"数据为空"< id<<" name:"< name<<" age:"< age< array_shift(); if(!p){ cout<<"数据为空"< id<<" name:"< name<<" age:"< age< array_pop(); if(!p){ cout<<"数据为空"< id<<" name:"< name<<" age:"< age< array_foreach(deletePrint); plist->array_clear(); cout<<"数组已清空"< array_reverse(); cout<<"数组已翻转"< array_foreach(myPrint); // 在指定位置获取数组 }else if(choose=="10"){ int index=0; cout<<"数组下标:"; cin>>index; p=(struct person *)plist->array_index(index); cout<<"id:"< id<<" name:"< name<<" age:"< age< array_insert(0,&p1); // plist->array_insert(0,&p2); // plist->array_insert(0,&p3); // plist->array_insert(0,&p4); // plist->array_insert(0,&p5); // plist->array_insert(0,&p6); // // plist->array_splice(3,2); // plist->array_unshift(&p7); // plist->array_push(&p8); // plist->array_shift(); // plist->array_pop(); // plist->array_reverse(); // cout< array_length()< array_size()< array_foreach(myPrint); // // list *plist1=new list (*plist); // // 可通过,传参、赋值,的方式使用拷贝构造 // list *plist1=new list (5); // // list *plist2=new list (5); // *plist1=*plist; // plist1->array_insert(0,&p8); // cout< array_length()< array_length()<



