⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arraylist.h

📁 C# ArrayList C++模仿版
💻 H
📖 第 1 页 / 共 2 页
字号:
			i=0;
		}
		(*pf->length)+=(*pc->length);
		(*pf->size)+=1;
		pf->data[i]=(void*)pc;
		*pc->parent=pf;
		i++;
		l+=*pc->length;
		if(pcl!=NULL)
			*pcl=pc;
		pc=*pc->next;
	}
	pn=*pf->next;
	if(pfl!=NULL)
		*pfl=pn;
	while(pn!=NULL){
		pf=*pn->next;
		MT_Delete_Node(pn);
		pn=pf;
	}
	if(pch==NULL){
		MT_Delete_Node(pfh);
		pfh=NULL;
	}
	MT_OBJ o;
	o.length=l;
	o.pParent=pfh;
	o.pChild=pch;
	return o;
}

inline void MT_Ist(PMT_OBJ po,unsigned long i,void** ptrarray,unsigned long l)
{
	i--;
	if(ptrarray==NULL||l==0||po==NULL)
		return;
	if(po->length<=i&&i!=-1){
		if(po->length!=0)
			return;
		else
			if(i>=0)
				return;
	}
	PNODE_MT_ pfh=NULL,pfl=NULL,pch=NULL,pcl=NULL,pi=NULL;
	unsigned long k;
	//create
	if(po->length==0&&po->pParent==NULL&&po->pChild==NULL){
		pch=MT_Create_List(ptrarray,l,&pcl);
		*po=MT_Refresh_OBJ(NULL,pch,&pfl,&pcl);
		return;
	}
	//insert
	if(i==-1){
		pi=po->pChild;
		k=-1;
	}
	else{
		if((pi=MT_Get_Node(po,i,k))==NULL){
			return;
		}
	}
	MT_Insert_List(pi,k,ptrarray,l);
	*po=MT_Refresh_OBJ(po->pParent,po->pChild,&pfl,&pcl);
}

inline void MT_Ist(PMT_OBJ po,unsigned long i,PMT_OBJ poi)
{
	if(po==NULL||poi==NULL||poi->length==0)
		return;
	if(po->length<i){
		return;
	}
	PNODE_MT_ pfh=NULL,pfl=NULL,pch=NULL,pcl=NULL,pi=NULL;
	unsigned long k;
	if(po->length==0&&po->pParent==NULL&&po->pChild==NULL){
		pch=MT_Create_Node();
		MT_Insert_List(pch,0,poi->pChild);
		*po=MT_Refresh_OBJ(NULL,pch,&pfl,&pcl);
		return;
	}
	if(i==po->length){
		if((pi=MT_Get_Node(po,i-1,k))==NULL)
			return;
		if(*pi->length>=NODE_SIZE){
			*pi->next=MT_Create_Node();
			pi=*pi->next;
			k=0;
		}
		else
			k++;
	}
	else{
		if((pi=MT_Get_Node(po,i,k))==NULL)
			return;
	}
	MT_Insert_List(pi,k,poi->pChild);
	*po=MT_Refresh_OBJ(po->pParent,po->pChild,&pfl,&pcl);
}

inline void MT_Del(PMT_OBJ po,unsigned long i,unsigned long l)
{
	if(l==0||po==NULL)
		return;
	if(po->length<=i)
		return;
	PNODE_MT_ pfh=NULL,pfl=NULL,pch=NULL,pcl=NULL,pi=NULL;
	unsigned long k=0;
	if((pi=MT_Get_Node(po,i,k))==NULL)
		return;
	try{
		MT_Delete_List(pi,k,l);
		*po=MT_Refresh_OBJ(po->pParent,po->pChild,&pfl,&pcl);
	}
	catch(...){
		return;
	}
}

inline void MT_Clr(PMT_OBJ po)
{
	if(po==NULL)
		return;
	if(po->length==NULL||po->pParent==NULL||po->length==0)
		return;
	PNODE_MT_ pt=po->pChild,pb=NULL;
	while(pt!=NULL){
		pb=*pt->next;
		MT_Delete_Node(pt);
		pt=pb;
	}
	pt=po->pParent;
	while(pt!=NULL){
		pb=*pt->next;
		MT_Delete_Node(pt);
		pt=pb;
	}
	po->pChild=NULL;
	po->pParent=NULL;
	po->length=0;
}

inline MT_OBJ MT_Get(PMT_OBJ po,unsigned long i,unsigned long l)
{
	MT_OBJ o={0};
	if(po==NULL)
		return o;
	if(po->length<=i||l==0)
		return o;
	PNODE_MT_ pn,pt,ph;
	unsigned long k,len;
	pn=MT_Get_Node(po,i,k);
	pt=MT_Create_Node();
	ph=pt;
	if(l<(*pn->length)-k){
		*pt->length=l;
		*pt->size=l;
		memcpy(pt->data,&pn->data[k],l*sizeof(void*));
		o=MT_Refresh_OBJ(NULL,pt);
		return o;
	}
	len=(*pn->length)-k;
	memcpy(pt->data,&pn->data[k],len*sizeof(void*));
	*pt->length=len;
	*pt->size=len;
	*pt->next=MT_Create_Node();
	pt=*pt->next;
	l-=len;
	len=0;
	pn=*pn->next;
	while(pn!=NULL){
		len+=(*pn->length);
		if(len>=l){
			l-=len-(*pn->length);
			memcpy(pt->data,pn->data,l*sizeof(void*));
			*pt->length=l;
			*pt->size=l;
			o=MT_Refresh_OBJ(NULL,ph);
			return o;
		}
		memcpy(pt->data,pn->data,(*pn->length)*sizeof(void*));
		*pt->length=(*pn->length);
		*pt->size=(*pn->length);
		*pt->next=MT_Create_Node();
		pt=*pt->next;
		pn=*pn->next;
	}
	return o;
}

inline void MT_Ref(PMT_OBJ po)
{
	if(po==NULL)
		return;
	if(po->length==NULL||po->pParent==NULL)
		return;
	MT_Refresh_List(po->pChild);
	*po=MT_Refresh_OBJ(po->pParent,po->pChild);
}

///////////////////////////////////////////////////////////////////////////////////
//Template implement:

template<class Type>
inline void MT_CopyType(PMT_OBJ po)
{
	unsigned long i,j,fl,cl;
	PNODE_MT_ pf=NULL,pc=NULL;
	Type *pd=NULL,*pt=NULL;
	pf=po->pParent;
	while(pf!=NULL){
		fl=*pf->size;
		for(i=0;i<fl;i++){
			pc=(PNODE_MT_)pf->data[i];
			cl=*pc->size;
			for(j=0;j<cl;j++){
				pd=(Type*)pc->data[j];
				pt=new Type;
				*pt=*pd;
				pc->data[j]=(void*)pt;
			}
		}
		pf=*pf->next;
	}
}

template<class Type>
inline void MT_CopyType(void** pointer_array,unsigned long l)
{
	Type *pd=NULL,*pt=NULL;
	unsigned long i;
	for(i=0;i<l;i++){
		pt=new Type;
		pd=(Type*)pointer_array[i];
		*pt=*pd;
		pointer_array[i]=(void*)pt;
	}
}

template<class Type>
inline void MT_DelType(PMT_OBJ po)
{
	unsigned long i,j,fl,cl;
	PNODE_MT_ pf=NULL,pc=NULL;
	Type *pd=NULL,*pt=NULL;
	pf=po->pParent;
	while(pf!=NULL){
		fl=*pf->size;
		for(i=0;i<fl;i++){
			pc=(PNODE_MT_)pf->data[i];
			cl=*pc->size;
			for(j=0;j<cl;j++){
				pd=(Type*)pc->data[j];
				delete pd;
				pc->data[j]=NULL;
			}
		}
		pf=*pf->next;
	}
}

template<class Type>
ArrayList<Type>::ArrayList()
{
	MT_Init();
	try{ 
		free(m_pData);
	}
	catch(...){
	}
	m_pData=malloc(sizeof(MT_OBJ));
	memset(m_pData,0,sizeof(MT_OBJ));
};

template<class Type>
ArrayList<Type>::~ArrayList()
{
	Clear();
	free(m_pData);
};

template<class Type>
void* ArrayList<Type>::Get_Inside_Data()
{
	return m_pData;
};

template<class Type>
void ArrayList<Type>::Clone(ArrayList<Type>& al)
{
	PMT_OBJ po=(PMT_OBJ)al.Get_Inside_Data();
	Clear();
	PMT_OBJ pr=(PMT_OBJ)m_pData;
	*pr=MT_Get(po,0,po->length);
	MT_CopyType<Type>(pr);
};

template<class Type>
unsigned long ArrayList<Type>::GetLength()
{
	PMT_OBJ po=(PMT_OBJ)m_pData;
	return po->length;
};

template<class Type>
ArrayList<Type> ArrayList<Type>::GetSubList(unsigned long position,unsigned long length)
{
	PMT_OBJ po=(PMT_OBJ)m_pData;
	unsigned long lb=po->length;
	if(position>lb)
		position=lb;
	if(length+position>lb)
		length=lb-position;
	ArrayList<Type> al;
	MT_OBJ mo=MT_Get(po,position,length);
	MT_CopyType<Type>(&mo);
	memcpy(al.Get_Inside_Data(),&mo,sizeof(mo));
	return al;
};

template<class Type>
unsigned long ArrayList<Type>::GetSubList(unsigned long position,unsigned long length,Type** pointer_array,unsigned long array_length)
{
	PMT_OBJ po=(PMT_OBJ)m_pData;
	unsigned long lb=po->length;
	if(position>lb)
		position=lb;
	if(array_length<length)
		length=array_length;
	if(position+length>lb)
		length=lb-position;
	try{
		MT_Get(po,(void**)pointer_array,position,length);
		MT_CopyType<Type>((void**)pointer_array,length);
	}
	catch(...){
		return AL_FAILED;
	}
	return length;
};

template<class Type>
unsigned long ArrayList<Type>::Insert(unsigned long position,unsigned long length,Type** pointer_array,unsigned long array_length)
{
	PMT_OBJ po=(PMT_OBJ)m_pData;
	unsigned long lb=po->length;
	if(position>lb)
		position=lb;
	if(array_length<length)
		length=array_length;
	void** pa=(void**)malloc(sizeof(void*)*length);
	try{
		memcpy(pa,pointer_array,sizeof(void*)*length);
		MT_CopyType<Type>((void**)pa,length);
		MT_Ist(po,position,(void**)pa,length);
	}
	catch(...){
		free(pa);
		return AL_FAILED;
	}
	free(pa);
	return po->length-lb;
};

template<class Type>
unsigned long ArrayList<Type>::Insert(unsigned long position,ArrayList<Type>& al)
{
	PMT_OBJ po=(PMT_OBJ)m_pData;
	unsigned long lb=po->length;
	if(position>lb)
		position=lb;
	PMT_OBJ pi=(PMT_OBJ)al.m_pData;
	PMT_OBJ pt=(PMT_OBJ)malloc(sizeof(MT_OBJ));
	try{
		*pt=MT_Get(pi,0,pi->length);
		MT_CopyType<Type>(pt);
		MT_Ist(po,position,pt);
	}
	catch(...){
		free(pt);
		return AL_FAILED;
	}
	free(pt);
	return po->length-lb;
};

template<class Type>
unsigned long ArrayList<Type>::Remove(unsigned long position,unsigned long length)
{
	PMT_OBJ po=(PMT_OBJ)m_pData;
	unsigned long lb=po->length;
	if(position>lb)
		position=lb;
	if(position+length>lb)
		length=lb-position;
	PMT_OBJ pt=(PMT_OBJ)malloc(sizeof(MT_OBJ));
	try{
		*pt=MT_Get(po,position,length);
		MT_DelType<Type>(pt);
		MT_Clr(pt);
		MT_Del(po,position,length);
	}
	catch(...){
		free(pt);
		return AL_FAILED;
	}
	free(pt);
	return lb-po->length;
};

template<class Type>
void ArrayList<Type>::Clear()
{
	try{
		MT_DelType<Type>((PMT_OBJ)m_pData);
		MT_Clr((PMT_OBJ)m_pData);
	}
	catch(...){
	}
	memset(m_pData,0,sizeof(MT_OBJ));
};

template<class Type>
Type& ArrayList<Type>::operator[](unsigned long i)
{
	PMT_OBJ po=(PMT_OBJ)m_pData;
	unsigned long lb=po->length;
	if(i>=lb)
		i=lb-1;
	Type* p=NULL;
	try{
		p=(Type*)MT_Get(po,i);
	}
	catch(...){
	}
	return *p;
};

template<class Type>
void ArrayList<Type>::Refresh()
{
	PMT_OBJ po=(PMT_OBJ)m_pData;
	unsigned long lb=po->length;
	if(lb==0)
		return;
	try{
		MT_Ref(po);
	}
	catch(...){
	}
	return;
}

//////////////////////////////////////////////////
//Windows Test samples
/*
#include<windows.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<Psapi.h>
#pragma comment(lib,"Psapi.lib")

ArrayList<unsigned long>* makeAL()
{
	ArrayList<unsigned long> *pal=new ArrayList<unsigned long>;
	unsigned long *k=(unsigned long*)malloc(sizeof(unsigned long)*0x3000);
	unsigned long **p=(unsigned long**)malloc(sizeof(unsigned long*)*0x3000);
	unsigned long i;
	for(i=0;i<0x3000;i++){
		k[i]=i;
		p[i]=&k[i];
	}
	pal->Insert(0,0x3000,p,0x3000);
	free(p);
	free(k);
	return pal;
}

void main(){
	ArrayList<unsigned long> al1,*pal1,al2,*pal2;
	pal1=makeAL();
	HANDLE hProc=GetModuleHandle(NULL);
	PROCESS_MEMORY_COUNTERS pmc={0};
	DWORD sz=sizeof(pmc);
	pmc.cb=sz;
	pal2=new ArrayList<unsigned long>;
	*pal2=*pal1;
	*pal1+=*pal2;
	al1=*pal1;
	delete pal1;
	delete pal2;
	//al2=al1;
	al1.Refresh();
	unsigned long i,t1,t2=0;
	time_t t;
	srand((unsigned int)time(&t));
	char out[100]={0};
	for(i=0;i<100;i++){
		t1=(unsigned long)(rand()%0x6000);
		t2=al1[t1];
		wsprintfA(out,"Pos %x : %lx\n",t1,t2);
		OutputDebugStringA(out);
	}
}
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -