顺序存储结构的线性表采用数组实现,优点是随机存取;缺点是删除时,需要移动数据,特别是当元素很多时,效率很低(针对此问题的解决方案是,采用间接寻址)。
在本文的代码实现中,借鉴了Java的ArrayList的思想,数组自动扩充(增倍)。
以下是采用C++语言的实现代码:
/**
* List.h
*/
#pragma once
/**
* @Descripton : 顺序存储结构的线性表,容量不足时,自动增倍
* @Date : 2011-10-29
* @Author : MJN
*/
template < class T >
class List
{
public:
List(int c = 10);
~List(void);
int getLength();
int getCapacity();
bool isEmpty();
T getData(int index);
void addData(T t);
void addData(T t, int index);
T deleteData(int index);
void clear();
void print();
private:
int len;
int capacity;
T *data;
void ready();
void arrayCopy(T *dst, int dstStart, const T *src, int srcStart, int n);
};
template < class T >
List< T >::List(int c)
{
capacity = (c >= 0 ? c : 0);
len = 0;
if (capacity > 0)
{
data = new T[capacity];
}
}
template < class T >
List< T >::~List(void)
{
if (data != NULL)
{
delete data;
}
}
template < class T >
void List< T >::clear()
{
if (data != NULL)
{
delete data;
}
len = 0;
capacity = 10;
data = new T[capacity];
}
template < class T >
int List< T >::getLength()
{
return len;
}
template < class T >
int List< T >::getCapacity()
{
return capacity;
}
template < class T >
bool List< T >::isEmpty()
{
return (len == 0);
}
template < class T >
T List< T >::getData(int index)
{
if (index < 0 || index >= len)
{
return NULL;
}
return data[index];
}
/*
* 检查容量是否不够,如果没有剩余,则自动增倍
*/
template < class T >
void List< T >::ready()
{
if (len >= capacity)
{
if (capacity == 0)
{
capacity = 10;
data = new T[capacity];
}
else
{
T *newData = new T[capacity * 2];
arrayCopy(newData, 0, data, 0, capacity);
delete data;
data = newData;
capacity *= 2;
}
}
}
/**
* 将数组src的n个数据拷贝到dst中
*/
template < class T >
void List< T >::arrayCopy(T *dst, int dstStart, const T *src, int srcStart, int n)
{
for (int i = 0; i < n; i++)
{
dst[dstStart + i] = src[srcStart + i];
}
}
/**
* 新数据附加到末尾
*/
template < class T >
void List< T >::addData(T t)
{
addData(t, len);
}
/**
* 在指定位置增加新数据
*/
template < class T >
void List< T >::addData(T t, int index)
{
if (index < 0 || index > len)
{
return;
}
ready();
for (int i = len - 1; i >= index; i--)
{
data[i + 1] = data[i];
}
data[index] = t;
len++;
}
/**
* 删除指定位置的数据
*/
template < class T >
T List< T >::deleteData(int index)
{
if (index < 0 || index >= len)
{
return NULL;
}
T temp = data[index];
for (int i = index + 1; i < len; i++)
{
data[i - 1] = data[i];
}
len--;
return temp;
}
/**
* 打印数组中的数据,仅用于测试
*/
template < class T >
void List< T >::print()
{
cout << "----" << endl;
for (int i = 0; i < len; i++)
{
cout << data[i] << endl;
}
}
在Microsoft Visual Studio 2010中,如果将模板类放在实现放在另一个文件中(如List.cpp),则会提示出错。
注:
1. 测试IDE:Microsoft Visual Studio 2010