動態數組的接口與實現(C++)

動態數組的接口與實現(已調試完成)

常用接口:

class ArrayList
{
private:
	int m_size;
	int * m_element;

	int m_capacity;

	static const int DEFAULT_CAPACITY = 10;
	static const int ELEMENT_NOR_FOUND = -1;

private:
	void ensureCapacity(int capacity);

public:
	//無參構造函數
	ArrayList();

	ArrayList(int capacity);

	
	~ArrayList();

public:
	//元素的數量
	int size();

	//數組是否爲空
	bool isEmpty();

	//是否包含某個元素
	bool contains(int element);

	//添加元素 到最後
	void add(int element);

	//返回對應位置的元素
	int get(int index);

	//設置index位置的元素
	int set(int index, int element);

	//往index位置添加元素
	void add(int index, int element);

	//刪除index位置的元素
	int remove(int index);

	//查看元素的位置
	int indexof(int element);

	//清除所有的元素
	void clear();

	//打印數組
	void printArray();

	//數組的長度
	int length();

	//刪除對應的元素
	void removeforE(int element);
};

接口的實現

#include "ArrayList.h"
ArrayList::ArrayList()
{
	this->m_element = new int[DEFAULT_CAPACITY];
	this->m_size = 0;
	this->m_capacity = DEFAULT_CAPACITY;
}

ArrayList::ArrayList(int capacity)
{
	capacity = (capacity < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capacity;
	this->m_element = new int[capacity];
	this->m_size = 0;
	this->m_capacity = capacity;
}

ArrayList::~ArrayList()
{
	if (this->m_element != NULL)
	{
		delete[] this->m_element;
		this->m_element = NULL;
	}
}

int ArrayList::size()
{
	return this->m_size;
}

bool ArrayList::isEmpty()
{
	/*if (this->m_size == 0)
	{
		return true;
	}
	else
	{
		return false;
	}*/
	return this->m_size == 0;
}

bool ArrayList::contains(int element)
{
	return indexof(element) != ELEMENT_NOR_FOUND;
}

void ArrayList::add(int element)
{
	add(this->m_size, element);
}

int ArrayList::get(int index)
{
	if (index < 0||index >= this->m_size)
	{
		printf("func get() err\n");
		return 0;
	}
	return this->m_element[index];
}

int ArrayList::set(int index, int element)
{
	if (index < 0 || index >= this->m_size)
	{
		printf("func set() err\n");
		return 0;
	}
	int oldelement = this->m_element[index];
	this->m_element[index] = element;

	return oldelement;
}

void ArrayList::add(int index, int element)
{
	if (index < 0 || index > this->m_size)
	{
		printf("func add(nt index, int element) err\n");
		return;
	}
	ensureCapacity(this->m_size+1);
	for (int i = this->m_size-1; i >= index; i--)
	{
		this->m_element[i + 1] = this->m_element[i];
	}
	this->m_element[index] = element;
	this->m_size++;
	return ;
}
int ArrayList::remove(int index)
{
	if (index < 0 || index >= this->m_size)
	{
		printf("func remove() err\n");
		return 0;
	}
	int oldelement = this->m_element[index];
	for (int i = index; i < this->m_size; i++)
	{
		this->m_element[i] = this->m_element[i + 1];
	}
	this->m_size--;
	return oldelement;
}

int ArrayList::indexof(int element)
{
	for (int i = 0; i < this->m_size; i++)
	{
		if (element == this->m_element[i])
		{
			return i;
		}
	}
	return ELEMENT_NOR_FOUND;
}

void ArrayList::clear()
{
	this->m_size = 0;
}

void ArrayList::printArray()
{
	for (int i = 0; i <this->m_size; i++)
	{
		if (i == 0)
		{
			printf("size = %d,  array:[%d,", this->m_size, this->get(i));
			continue;
		}
		if (i == this->m_size - 1)
		{
			printf("%d] \n", this->get(i));
			continue;
		}
		printf("%d,", this->get(i));
	}
}

int ArrayList::length()
{
	return this->m_capacity;
}


void ArrayList::ensureCapacity(int capacity)
{
	int oldCapacity = this->length();
	if (oldCapacity >= capacity)
	{
		return;
	}
	int newCapacity = oldCapacity + (oldCapacity >> 1);
	int * newelement = new int[newCapacity];
	for (int i = 0; i < this->m_size; i++)
	{
		newelement[i] = this->m_element[i];
	}
	delete[] this->m_element;
	this->m_element = newelement;
	this->m_capacity = newCapacity;
	cout << "擴容:" << oldCapacity << "—" << newCapacity << endl;
}

void ArrayList::removeforE(int element)
{
	/*int pos = 0;
	for (int i = 0; i < this->m_size; i++)
	{
		if (this->m_element[i] == element)
		{
			pos = i;
		}
	}
	int oldelement = this->m_element[pos];
	for (int i = pos; i < this->m_size; i++)
	{
		this->m_element[i] = this->m_element[i + 1];
	}
	this->m_size--;
	return oldelement;*/
	remove(indexof(element));
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章