list.h
#ifndef LIST_H
#define LIST_H
#pragma once
template <class T>
class list
{
private:
T **pArr;
int size;
int length;
public:
list<T>(int size);
// 赋值运算符重载
list<T>& operator=(const list<T> & plist);
// 拷贝构造
list<T>(const list<T>& 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<iostream>
#include<string>
#include "list.h"
using namespace std;
// 初始化
template<typename T>
list<T>::list(int size){
if(size<0)
return ;
this->pArr=new T*[size];
this->size=size;
this->length=0;
}
// 析构
template<typename T>
list<T>::~list(){
delete this->pArr;
this->pArr=NULL;
this->size=0;
this->length=0;
}
// 指定为添加数组
template<typename T>
void list<T>::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<typename T>
void list<T>::array_foreach(void(*print)(T*)){
if(!this->pArr)
return ;
for(int i=0;i<this->length;++i){
print(this->pArr[i]);
}
}
// 获取数组总大小
template<typename T>
int list<T>::array_size(){
if(this->pArr)
return this->size;
else
return -1;
}
// 获取数组长度
template<typename T>
int list<T>::array_length(){
if(this->pArr)
return this->length;
else
return -1;
}
// 删除指定位置元素
template<typename T>
T* list<T>::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<this->length-num;i++){
this->pArr[i]=this->pArr[i+num];
}
this->length-=num;
return data;
}
// 头插
template<typename T>
void list<T>::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<typename T>
void list<T>::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<typename T>
T * list<T>::array_shift(){
if(!this->pArr||this->length==0)
return NULL;
T *data=this->pArr[0];
for(int i=0;i<this->length;++i){
this->pArr[i]=this->pArr[i+1];
}
this->length--;
return data;
}
// 尾删
template<typename T>
T * list<T>::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<typename T>
void list<T>::array_reverse(){
if(!this->pArr||this->length==0)
return ;
for(int i=0;i<this->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<typename T>
void list<T>::array_clear(){
this->length=0;
this->size=0;
delete this->pArr;
this->pArr=NULL;
}
// 获取指定为元素
template<typename T>
T *list<T>::array_index(int index){
if(index<0||index>this->length-1)
return NULL;
return this->pArr[index];
}
// 赋值操作
template<typename T>
list<T>& list<T>::operator=(const list<T> & plist){
// if(this->length!=0)
// free(this->pArr);
// cout<<plist.size<<endl;
this->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<typename T>
list<T>::list(const list<T>& 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 <iostream>
#include <string>
using namespace std;
struct person{
int id;
string name;
int age;
};
template<typename T>
void myPrint(T *value){
struct person *p=(struct person *)value;
cout<<"id:"<<p->id<<" name:"<<p->name<<" age:"<<p->age<<endl;
}
template<typename T>
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<person> *plist=new list<person>(5);
struct person *p;
string choose;
while(true){
system("cls");
cout<<"\t"<<endl;
cout<<"\t|\t1. 指定为位置添加\t|"<<endl;
cout<<"\t|\t2. 头插\t\t\t|"<<endl;
cout<<"\t|\t3. 尾插\t\t\t|"<<endl;
cout<<"\t|\t4. 指定位置删除\t\t|"<<endl;
cout<<"\t|\t5. 头删\t\t\t|"<<endl;
cout<<"\t|\t6. 尾删\t\t\t|"<<endl;
cout<<"\t|\t7. 清空\t\t\t|"<<endl;
cout<<"\t|\t8. 翻转\t\t\t|"<<endl;
cout<<"\t|\t9. 遍历\t\t\t|"<<endl;
cout<<"\t|\t10.获取指定位置元素\t|"<<endl;
cout<<"\t|\t11.退出(q!)\t\t|"<<endl;
cout<<"输入:";
cin>>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<<p->id<<p->name<<p->age<<endl;
plist->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<<"数据为空"<<endl;
}else{
cout<<"该条数据已被删除"<<endl;
cout<<"id:"<<p->id<<" name:"<<p->name<<" age:"<<p->age<<endl;
}
// 头删
}else if(choose=="5"){
p=(struct person *)plist->array_shift();
if(!p){
cout<<"数据为空"<<endl;
}else{
cout<<"该条数据已被删除"<<endl;
cout<<"id:"<<p->id<<" name:"<<p->name<<" age:"<<p->age<<endl;
}
// 尾删
}else if(choose=="6"){
p=(struct person *)plist->array_pop();
if(!p){
cout<<"数据为空"<<endl;
}else{
cout<<"该条数据已被删除"<<endl;
cout<<"id:"<<p->id<<" name:"<<p->name<<" age:"<<p->age<<endl;
}
// 清空
}else if(choose=="7"){
plist->array_foreach(deletePrint);
plist->array_clear();
cout<<"数组已清空"<<endl;
// 翻转数组
}else if(choose=="8"){
plist->array_reverse();
cout<<"数组已翻转"<<endl;
// 遍历数组
}else if(choose=="9"){
plist->array_foreach(myPrint);
// 在指定位置获取数组
}else if(choose=="10"){
int index=0;
cout<<"数组下标:";
cin>>index;
p=(struct person *)plist->array_index(index);
cout<<"id:"<<p->id<<" name:"<<p->name<<" age:"<<p->age<<endl;
}else if(choose=="q!"){
break;
}
getchar();
getchar();
}
// plist->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<<plist->array_length()<<endl;
// cout<<plist->array_size()<<endl;
// plist->array_foreach(myPrint);
// // list<person> *plist1=new list<person>(*plist);
// // 可通过,传参、赋值,的方式使用拷贝构造
// list<person> *plist1=new list<person>(5);
// // list<person> *plist2=new list<person>(5);
// *plist1=*plist;
// plist1->array_insert(0,&p8);
// cout<<plist1->array_length()<<endl;
// cout<<plist->array_length()<<endl;
}
int main(){
test();
system("pause");
return EXIT_SUCCESS;
}