线性结构的特点是:
1、线性表的类型定义
线性表(linear_list)是最常用且最简单的一种数据结构。
在稍复杂的线性表中,一个数据元素可以由若干个数据项(item)组成。在这种情况下,常把数据元素称为记录(record),含有大量记录的线性表又称为文件(file)。
EX2-1:
public static <AnyType> void union(DSAA0301_ArrayList<AnyType> LA, DSAA0301_ArrayList<AnyType> LB)
{
for(int i = 0; i < LB.size(); i++)
{
if(LA.LocateElem(LB.get(i)) == -1)
{
LA.add(LB.get(i));
}
}
}
EX2-2:
public static <AnyType> void mergeList(DSAA0301_ArrayList<AnyType> LA, DSAA0301_ArrayList<AnyType> LB, DSAA0301_ArrayList<AnyType> LC)
{
int i = 0;
int j = 0;
while(i < LA.size() && j < LB.size())
{
if(((Comparable<Object>)(LA.get(i))).compareTo((Comparable<Object>)(LB.get(j))) < 0)
{
LC.add(LA.get(i));
i++;
}
else
{
LC.add(LB.get(j));
j++;
}
}
while(i < LA.size())
{
LC.add(LA.get(i));
i++;
}
while(j < LB.size())
{
LC.add(LB.get(j));
j++;
}
}
2、线性表的顺序表示和实现
一般情况下,在第 i (1 ≤ i ≤ n)个元素之前插入一个元素时,需将第 n 至第 i(共 n - i + 1)个元素向后移动一个位置,算法如下:
public void add(int idx, AnyType x)
{
if(theItems.length == size())
{
ensureCapacity(size() * 2 + 1);
}
for(int i = theSize; i > idx; i--)
{
theItems[i] = theItems[i - 1];
}
theItems[idx] = x;
theSize++;
}
反之,线性表的删除是使长度为 n 的线性表(a1,...,ai-1,ai,ai+1,...,an)变成长度为 n - 1 的线性表(a1,...,an-1,ai+1,...,an)。
一般情况下,删除第 i (1 ≤ i ≤ n)个元素时,需将从第 i + 1 至第 n(共 n - i )个元素依次向前移动一个位置,算法如下:
public AnyType remove(int idx)
{
AnyType removedItem = theItems[idx];
for(int i = idx; i <size() - 1; i++)
{
theItems[i] = theItems[i + 1];
}
theSize--;
return removedItem;
}
3、线性表的链式表示和实现
1)线性链表
在单链表中,取得第 i 个数据元素必须从头指针出发寻找,双向链表可以从头指针或尾指针出发寻找,算法如下:
private Node<AnyType> getNode(int idx, int lower, int upper)
{
Node<AnyType> p;
if(idx < lower || idx >upper)
{
throw new IndexOutOfBoundsException();
}
if(idx < size() / 2)
{
p = beginMaker.next;
for(int i = 0; i < idx; i++)
{
p = p.next;
}
}
else
{
p = endMaker;
for(int i = size(); i > idx; i--)
{
p = p.prev;
}
}
return p;
}