第二章 线性表
2.1线性表类型定义
线性表描述:A=(a1,a2,...an);A为线性表的名称,ai为线性表 的数据元素。
线性表的离散定义:B=<A,R>,A包含n个结点(a1,a2,...an),R中只包含一个关系,即线性关系,R={(ai-1,ai)|i=1,2,....,n},
一般的线性表的操作可以包含以下几种:
* public linklist() 建立一个空的线性表。
* public linklist(collection c) 将collection c中的数据依次建立一个线性表。
* public object getfirst() 返回线性表的第一个元素。
* public object getlast() 返回线性表的最后一个元素 。
* public object removefirst() 删除线性表的第一个元素,并返回该值。
* public object removelast() 删除线性表的最后一个元素 ,并返回该值。
* public void addfirst(object o) 将object o插入到链表的开头位置。
* public object addlast(object o) 将object o插入到链表的末尾位置
* public boolean contains(object o) 检查object o是否存在链表中,如果存在返回true,不存在返回false
* public int size() 返回线性表的元素个数
* public boolean add(object o) 将object o插入到链表的末尾位置,并返回true
* public boolean remove(object o) 将链表中第一次出现的元素删除,成功返回true,否则false;
* public addall(collection c) 将collection c中的数据依次插入到链表的末尾
* public addall(int index,collection c) 将collection c中的数据依次插入到链表的index位置,并将index位置之后的元素依次插入到collection c之后,链接成一个完整的线性表
* public void clear() 删除线性表中的所有元素
* public object get(int index) 返回线性表的index位置的元素
* public object set(int index, object element) 以object element取代线性表index位置的元素
* public void add(int index,object element) 将object element插入到线性表index位置之后。
* public object remove(int index) 删除线性表中的index位置的元素
* public int indexof(object o)返回object o在线性表中第一次出现的位置,若不存在返回-1
* public int lastindexof(object o)返回object o在线性表中最后一次出现的位置,若不存在返回-1
* public listiterator listiterator(int index)返回线性表index位置开始的元素的内容
使用抽象数据类型(ADT)定义线性表如下:
ADT list{
数据对象:D={ai|ai属于元素集合,i=1,2,....n,n>=0}
数据关系:R={<ai-1,ai>|ai-1,ai属于元素集合,i=1,2,....n,}
基本操作:{
就是以上的那些操作
}
}
2.2 线性表的顺序表示和实现
线性表的存储结果分为书序存储和非顺序存储。顺序存储也称为向量存储或一维数组存储。
1.顺序表(向量存储,一维数组存储),线性表中节点存放的物理顺序和逻辑顺序完全一致。
2.顺序表基本运算的实现
线性表顺序存储的结构容易实现存取数据元素,插入或删除数据元素比较繁琐
下面在数组中指定位置增加一个元素(java代码):
1 package com.datastruture.chapeter02; 2 3 import java.util.Arrays; 4 5 /** 6 * 7 * @ClassName: MyArray 8 * @Description: 数组的一些小练习 9 * @author mao 10 * @date 2017年3月19日 下午9:47:58 11 * 12 */ 13 public class MyArray { 14 15 public static void main(String[] args) { 16 17 int[] arr = new int[10]; 18 arr[0] = 0; 19 arr[1] = 1; 20 arr[2] = 2; 21 arr[3] = 3; 22 System.out.println(Arrays.toString(arr)); 23 int ele = 7; 24 int index = 2; 25 addElement(ele,arr,index); 26 System.out.println(Arrays.toString(arr)); 27 28 } 29 30 /** 31 * 32 * @Title: addElement 33 * @Description: 在数组指定位置增加一个元素 34 * @param @param ele 增加的元素 35 * @param @param arr 目标数组 36 * @param @param index 指定的位置 37 * @return void 38 * @throws 39 */ 40 public static void addElement(int ele, int[] arr,int index) { 41 //数组的长度不能改变,所以这种模拟不太合适,因为最后一个元素没有了 42 if(index>arr.length||index<0){ 43 System.out.println("下标不合法"); 44 }else{ 45 for (int i = arr.length-1; i >= index; i--) { 46 arr[i]=arr[i-1]; 47 } 48 arr[index]= ele; 49 } 50 } 51 52 53 54 }
结果(注:插入后应该修改线性表的长度,但上面是java代码,数组的长度一旦定义就不能改变了):
下面在数组中指定位置删除一个元素(java代码):
1 /** 2 * 3 * @Title: deleteElement 4 * @Description: 删除指定位置的元素 5 * @param @param arr 目标数组 6 * @param @param index 指定位置 7 * @return void 8 * @throws 9 */ 10 public static void deleteElement(int[] arr, int index) { 11 12 if(index>arr.length||index<0){ 13 System.out.println(index+"不存在!"); 14 }else if(arr.length<0){ 15 System.out.println("数组为空"); 16 }else{ 17 //删除和增加的操作正好相反,删除是把后边的一个值赋给前面一个值,i++循环 18 //增加是把前边的一个值赋给后面的一个值,且i--循环 19 for (int i = index; i < arr.length-1; i++) { 20 arr[i]=arr[i+1]; 21 } 22 } 23 24 }
结果:
在顺序存储的线性结构的线性表中插入或删除一个数据元素,平均约移动表中一半元素。若表长为n,则插入和删除算法的时间复杂度为O(n);
2.3 线性表的链式存储结构
2.3.1 单向链表
其中data是数据域,存放数据元素的值,next是指针域,存放相邻的下一个节点的地址,单向链表是指节点中的指针域只有一个沿着同一个方向的链式存储结构。