public class ArrayList<E> {
private E[] elementData;
private int size;
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "
+ initialCapacity);
this.elementData = (E[]) new Object[initialCapacity];
}
public ArrayList() {
this(10);
}
public void ensureCapacity(int minCapacity) {
int oldCapacity = elementData.length;
if (minCapacity > oldCapacity) {
Object oldData[] = elementData;
int newCapacity = (oldCapacity * 3) / 2 + 1;
if (newCapacity < minCapacity)
newCapacity = minCapacity;
elementData = (E[]) new Object[newCapacity];
System.arraycopy(oldData, 0, elementData, 0, size);
}
}
public int size() {
return size;
}
public boolean isEmpty() {
return size == 0;
}
public boolean contains(Object elem) {
return indexOf(elem) >= 0;
}
public int indexOf(Object elem) {
if (elem == null) {
for (int i = 0; i < size; i++)
if (elementData[i] == null)
return i;
} else {
for (int i = 0; i < size; i++)
if (elem.equals(elementData[i]))
return i;
}
return -1;
}
public int lastIndexOf(Object elem) {
if (elem == null) {
for (int i = size - 1; i >= 0; i--)
if (elementData[i] == null)
return i;
} else {
for (int i = size - 1; i >= 0; i--)
if (elem.equals(elementData[i]))
return i;
}
return -1;
}
public E get(int index) {
RangeCheck(index);
return elementData[index];
}
public E set(int index, E element) {
RangeCheck(index);
E oldValue = elementData[index];
elementData[index] = element;
return oldValue;
}
public boolean add(E o) {
ensureCapacity(size + 1);
elementData[size++] = o;
return true;
}
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
ensureCapacity(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size
- index);
elementData[index] = element;
size++;
}
public E remove(int index) {
RangeCheck(index);
E oldValue = elementData[index];
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index,
numMoved);
elementData[--size] = null; // Let gc do its work
return oldValue;
}
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
private void fastRemove(int index) {
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index + 1, elementData, index,
numMoved);
elementData[--size] = null;
}
public void clear() {
for (int i = 0; i < size; i++)
elementData[i] = null;
size = 0;
}
protected void removeRange(int fromIndex, int toIndex) {
int numMoved = size - toIndex;
System
.arraycopy(elementData, toIndex, elementData, fromIndex,
numMoved);
int newSize = size - (toIndex - fromIndex);
while (size != newSize)
elementData[--size] = null;
}
private void RangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: "
+ size);
}
}
分享到:
相关推荐
线形表是数据结构中的基础概念,它是一种线性组织数据的方式,包括顺序表和链表两种主要形式。在这个“严版线形表实现含部分课后习题”项目中,我们关注的是在VC++6.0环境下如何实现这两种线形表的数据结构,并解决...
线形表的主要特点是以线性的顺序存储元素,即每个元素有一个前驱和一个后继(对于第一个元素,前驱是空;对于最后一个元素,后继是空)。这种结构使得线形表的操作相对简单和直观。 1. **创建线形表**:在C#中,...
顺序表是线形表的一种,它的逻辑结构特征是:元素之间的关系是一对一的关系,每个元素都有其唯一的索引。 二、顺序表的逻辑结构特征 顺序表的逻辑结构特征包括: * 元素之间是一对一的关系 * 每个元素都有其唯一...
线形表是一种线性的数据组织形式,其中的元素按照特定的顺序排列,每个元素都有一个唯一的索引或位置。线形表可以是动态的,允许在表的任何位置插入或删除元素,也可以是静态的,一旦创建就不能改变大小。 数据结构...
数据结构基础知识-线形表 数据结构是一门核心课程,介于数学、电脑硬件和电脑软件三者之间。它随着电脑的产生和发展而发展起来,旨在解决问题选择出一种好的数据结构和设计一个好的算法。数据结构的基本概念包括...
数据结构实验一顺序表的实现 数据结构实验是一种基本的数据结构实验,它是计算机科学和信息技术专业学生的基础实验。顺序表是数据结构中的一个基本结构,它是一种线性表,元素在内存中连续存储。顺序表的实现是数据...
线性结构中的线形表,包括栈和队列,是数据结构的基础概念,它们在计算机科学和编程中扮演着重要角色。线性表是数据的一种有序存储方式,而栈和队列则是线性表的特殊形式,具有特定的访问规则。 栈是一种后进先出...
顺序表的优点是访问速度快,因为元素的物理位置与逻辑位置一致。然而,插入和删除操作可能涉及大量的元素移动,效率较低。 2. **链式存储结构**包括单链表、循环链表和双向链表。这些结构通过链接元素来保存顺序,...
* 线形表的类型定义:线形表是一种基本的数据结构,分为顺序表和链式表两种。 * 线形表的顺序表示和实现:顺序表是将数据元素存储在连续的内存空间中,通过索引来访问元素。 * 线形表的链式表示和实现:链式表是将...
printf("*********************顺序表****************************"); printf("\n"); SequenceList(); printf("\n\n\n"); printf("*********************单链表****************************"); printf...
2. **掌握顺序表的基本操作**:熟悉顺序表的各种基本操作。 3. **掌握串的基本操作**:熟练使用字符串进行各种操作。 #### 设计内容和要求 - **建立两个字符串String1和String2**:创建两个不同的字符串。 - **将...
线形表可以采用顺序存储结构(数组)或链式存储结构(链表)。 2. **存储结构的选择**:选择存储结构取决于具体需求。顺序存储结构适用于元素数量确定且便于随机访问,而链式存储结构适用于元素数量不确定或频繁...
- A、顺序表:顺序表不适合递归调用,因为它没有特定的数据结构支持递归调用的回溯过程。 - B、线形链表:线性链表同样不支持递归调用所需的特定结构。 - C、堆栈:递归调用过程中会不断创建新的函数调用记录,...
1. 网络结构:如星形、环形、总线形等。 2. 信道访问:控制数据包在共享信道上的传输方式。 3. 通信协议:定义数据交换的规则和格式。 4. 信号发送技术:保证信号的准确传输。 5. 传输介质:如双绞线、光纤等。 6. ...
- 对于临时性挖方边坡,其坡度应根据地质条件、边坡高度和土体稳定性确定,如表-2所示。 - 当挖方经过不同土层或深度较大时,边坡可设计成折线形或台阶形,以保证稳定性。 - 开挖顺序和路线的确定至关重要,以...
线形表是最基本的数据结构之一,包括顺序表和链表。顺序表是在内存中连续存储的一组元素,可以通过下标快速访问。链表则由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表允许在任意位置插入和删除...
数据结构第二章知识点 本章节主要介绍了线形表的存储结构,包括循环单链表、双链表和静态链表等。下面是本章节的知识点总结: 知识点 1:循环单链表从任意一个结点...顺序表的存储密度是 1,而链表的存储密度小于 1。
- 第1题:虽然通常数组存储的线性表确实是顺序表,但不能说用数组存储的线形表一定是顺序表,因为还存在其他可能性,比如数组还可以用于实现栈、队列等数据结构。**错误**。 - 第2题:队列是一种允许在一端(队尾...
线形表是一种线性排列的数据元素集合,包括顺序表和链表。顺序表在内存中连续存储,操作简便但插入删除可能涉及大量元素移动;链表则通过指针连接元素,插入删除更灵活但需额外空间。 栈和队列是两种特殊的数据结构...
顺序表是将线形表中的元素一个一个存储到一片相邻的区域中。单链表是线形表中的接点通过指针链接成为链表。静态链表是链表中的接点在编译时就已经确定了其存储位置。 字符串部分介绍了字符串的基本概念、定长顺序串...