数据结构--线性表复习
2016-03-15 22:24
531 查看
感觉做程序如果要走的足够远的话,数据结构的底子还得扎实,然大学毕业后好多年,忘了不少,故从今天起开始尽可能抽闲暇时间进行复习总结,博客里面难免有错误和不对的地方,希望能指出,当然我也会抽时间来回顾下,查漏补缺,写博客是个好习惯希望自己能坚持下去。
数据的四种逻辑结构:
1,集合:数据元素之间只有“同属于一个集合”关系;
2,线性结构:数据元素直接存在一个对应一个的关系;
3,树形结构:数据元素之间存在一个队多个的关系;
4,图形结构和网状结构:数据元素之间存在多个对多个之间的关系。
物理存储结构:
1,顺序存储结构;
2,链式存储结构。
常用数据结构分类:
1,线性结构-->主要是线性表;
2,非线性结构-->主要是图和树。
线性表定义和特征:
定义:
1,线性表长度为0为空表,否则数据元素长度为线性表长度。
特征:
1,线性表存在第一个 和 最后一个数据元素;
2,除了第一个和最后一个都存在前驱元素和后驱元素。
线性表之顺序存储结构:
特征:在物理和逻辑上一致的存储结构。
通常利用数组来标示线性表的结构。
顺序线性表表底层采用数组来进行存储数据元素。
实际代码演示之插入一个新元素:
测试类:
测试结果:
默认长度18,向尾部插入新元素“佐井”
修改insert方法为public
将新元素插入中间:
测试结果:
新的元素放入position为3的位置。
删除指定位置的数据:
测试:
返回结果:
可见删除的是position位置为3的数据
数据的四种逻辑结构:
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的数据
相关文章推荐
- 复杂数据结构(二)树
- 数据结构(个人学习)
- 数据结构(2):线性表的链式表示和实现
- 数据结构(1):线性表的顺序表示和实现
- 第三周周赛——基础数据结构结业场(坚持就会有AK,题目出自codeforces 633C,633D,631B,651A,651C以及poj1577)
- Python之数据结构篇
- Tsinghua OJ 数据结构编程作业:祖玛(Zuma)
- 数据结构与算法面试题80道(37)
- 【数据结构与算法】内部排序之三:堆排序(含完整源码)
- java 数据结构
- FFmpeg数据结构
- MySQL索引背后的数据结构及算法原理
- 数据结构与算法面试题80道(36)
- 数据结构,传值
- 数据结构(RMQ):UVAoj 11235 Frequent values
- 可视化的数据结构 - 各种算法动画演示
- 数据结构笔记-----树
- 【数据结构】重新面对数据结构
- 数据结构课设 求前缀表达式的值
- 数据结构(Data Structure)——1、栈(Stack)