您的位置:首页 > 理论基础 > 数据结构算法

数据结构--线性表复习

2016-03-15 22:24 531 查看
  感觉做程序如果要走的足够远的话,数据结构的底子还得扎实,然大学毕业后好多年,忘了不少,故从今天起开始尽可能抽闲暇时间进行复习总结,博客里面难免有错误和不对的地方,希望能指出,当然我也会抽时间来回顾下,查漏补缺,写博客是个好习惯希望自己能坚持下去。
  
  数据的四种逻辑结构:
  
  1,集合:数据元素之间只有“同属于一个集合”关系;
  
  2,线性结构:数据元素直接存在一个对应一个的关系;
  
  3,树形结构:数据元素之间存在一个队多个的关系;
  
  4,图形结构和网状结构:数据元素之间存在多个对多个之间的关系。
  
  物理存储结构:
  
  1,顺序存储结构;
  
  2,链式存储结构。
  
  常用数据结构分类:
  
  1,线性结构-->主要是线性表;
  
  2,非线性结构-->主要是图和树。
  
  线性表定义和特征:
  
  定义:
  
  1,线性表长度为0为空表,否则数据元素长度为线性表长度。
  
  特征:
  
  1,线性表存在第一个 和 最后一个数据元素;
  
  2,除了第一个和最后一个都存在前驱元素和后驱元素。
  
  线性表之顺序存储结构:
  
  特征:在物理和逻辑上一致的存储结构。
  
  通常利用数组来标示线性表的结构。
  
  顺序线性表表底层采用数组来进行存储数据元素。
  
  实际代码演示之插入一个新元素:

  

import java.util.Arrays;

public class MyList<T> {
//定义数组的长度
private int DEFAULT_SIZE = 18;
//保存数组的长度。
private int capacity;
//定义一个数组用于保存顺序线性表的元素
private Object[] elementData;
//保存顺序表中元素的当前个数
private int size = 0;

public MyList() {
capacity = DEFAULT_SIZE;
//初始化数组默认长度
elementData = new Object[capacity];
}

//在线性顺序表的开始处添加一个元素。
public void add(T element)
{
insert(element , size);
}
/**
*
* @Title: insert
* @Description: TODO(向数组指定位置index插入某元素element)
* @param @param element 插入的元素
* @param @param index    插入元素的位置
* @return void    返回类型
* @throws
*/
private void insert(T element , int index) {
if (index < 0 || index > size)
{
throw new IndexOutOfBoundsException("线性表索引越界");
}
ensureCapacity(size + 1);
//将index处以后所有元素向后移动一格。
//从旧的elementData中复制数据,从index位置开始,复制给目标elementData数组从index+1到最后的元素,长度为size-index
//详情看http://blog.csdn.net/kesalin/article/details/566354
System.arraycopy(elementData , index , elementData
, index + 1 , size - index);
elementData[index] = element;
size++;
}
/**
*原来的数组+1
*/
private void ensureCapacity(int minCapacity) {
//如果数组的原有长度小于目前所需的长度
if (minCapacity > capacity)
{
//不断地将capacity * 2,直到capacity大于minCapacity为止
while (capacity < minCapacity)
{
capacity <<= 1;
}
//复制数组元素,返回新的数组对象
//详情看http://www.iteedu.com/plang/java/javadiary/24.php
elementData = Arrays.copyOf(elementData , capacity);
}
}

/**
* @Name toString
* @Description TODO(这里用一句话描述这个方法的作用)
* @return
* @see java.lang.Object#toString()
* @Date 2016-3-19 下午9:41:26
**/
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("MyList [elementData=")
.append(Arrays.toString(elementData))
.append("]");
return builder.toString();
}

}


  测试类:

  

public class Test {

public static void main(String[] args) {
MyList<String> list = new MyList<String>();
list.add("佐助");
list.add("鸣人");
list.add("卡卡西");
list.add("小樱");
list.add("日向");
list.add("我爱罗");
list.add("天天");
System.out.println(list.toString());

}

}


测试结果:

MyList [elementData=[佐助, 鸣人, 卡卡西, 小樱, 日向, 我爱罗, 天天, null, null, null, null, null, null, null, null, null, null, null]]
MyList [elementData=[佐助, 鸣人, 卡卡西, 小樱, 日向, 我爱罗, 天天, 佐井, null, null, null, null, null, null, null, null, null, null]]


默认长度18,向尾部插入新元素“佐井”

  修改insert方法为public

   将新元素插入中间:

list.insert("插入中间的元素", 3);
System.out.println(list.toString());


测试结果:

MyList [elementData=[佐助, 鸣人, 卡卡西, 插入中间的元素, 小樱, 日向, 我爱罗, 天天, 佐井, null, null, null, null, null, null, null, null, null]]


新的元素放入position为3的位置。

删除指定位置的数据:

//删除顺序线性表中指定索引处的元素
//删除的是index的元素

public T delete(int index)
{
if (index < 0 || index > size - 1)
{
throw new IndexOutOfBoundsException("线性表索引越界");
}
T oldValue = (T)elementData[index];
//数组长度-1
int numMoved = size - index - 1;
if (numMoved > 0)
{
/**
* 复制elementData中index+1位置开始到最后的数组,给从index到最后的元素,长度为numMoved
*/
System.arraycopy(elementData , index+1
19                 , elementData, index ,  numMoved);
         }
//清空最后一个元素,因为最后的元素是删除后(复制数据后残留的数据)
elementData[--size] = null;
         return oldValue;
}


测试:

public class Test {

public static void main(String[] args) {
MyList<String> list = new MyList<String>();
list.add("佐助");
list.add("鸣人");
list.add("卡卡西");
list.add("小樱");
list.add("日向");
list.add("我爱罗");
list.add("天天");
System.out.println(list.toString());
list.add("佐井");
System.out.println(list.toString());
list.insert("插入中间的元素", 3);
System.out.println(list.toString());
list.delete(3);//删除插入插入中间的数据
System.out.println(list.toString());
}

}


返回结果:

MyList [elementData=[佐助, 鸣人, 卡卡西, 小樱, 日向, 我爱罗, 天天, null, null, null, null, null, null, null, null, null, null, null]]
MyList [elementData=[佐助, 鸣人, 卡卡西, 小樱, 日向, 我爱罗, 天天, 佐井, null, null, null, null, null, null, null, null, null, null]]
MyList [elementData=[佐助, 鸣人, 卡卡西, 插入中间的元素, 小樱, 日向, 我爱罗, 天天, 佐井, null, null, null, null, null, null, null, null, null]]
MyList [elementData=[佐助, 鸣人, 卡卡西, 小樱, 日向, 我爱罗, 天天, 佐井, null, null, null, null, null, null, null, null, null, null]]


可见删除的是position位置为3的数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: