线性表-顺序存储(Java数据结构)

一、线性表

 一个线性表(Linear List)是由n(n≥0)个数据元素(结点,它可以是一个字母,数字,记录或更复杂的信息)所构成的有限序列。线性表逻辑地表示为:(a0,a1,…,an-1)。其中,n为线性表的长度,n=0时为空表。称i为ai在线性表中的位序号。

二、线性表的抽象数据类型

1、线性表的置空操作:  clear()

2、线性表判空操作:      isEmpty()

3、求线性表的长度:      length( )

4、取元素操作:             get( i )

5、插入操作:                 insert( i, x )

6、删除操作:                 remove( i)

7、查找操作:                 indexOf(x )

8、输出操作:                 display()

线性表抽象数据类型的Java接口描述:

public interface IList {
	public void clear(); // 将一个已经存在的线性表置成空表

	public boolean isEmpty(); // 判断当前线性表中的数据元素个数是否为0,若为0则函数返回true,否则返回false

	public int length(); // 求线性表中的数据元素个数并由函数返回其值

	public Object get(int i) throws Exception;// 读取到线性表中的第i个数据元素并由函数返回其值。其中i取值范围为:0≤i≤length()-1,如果i值不在此范围则抛出异常

	public void insert(int i, Object x) throws Exception;// 在线性表的第i个数据元素之前插入一个值为x的数据元素。其中i取值范围为:0≤i≤length()。如果i值不在此范围则抛出异常,当i=0时表示在表头插入一个数据元素x,当i=length()时表示在表尾插入一个数据元素x

	public void remove(int i) throws Exception;// 将线性表中第i个数据元素删除。其中i取值范围为:0≤i≤length()- 1,如果i值不在此范围则抛出异常

	public int indexOf(Object x);// 返回线性表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1
	
	public void display();// 输出线性表中的数据元素

}

三、线性表的顺序存储

线性表它包括顺序表,链式表,接下来介绍顺序表。

1、顺序存储指用一组地址连续的存储单元 依次存放 线性表中的数据元素的存储结构。用顺序存储的线性表就称为顺序表,所有数据元素的存储位置均取决于第一个数据元素的存储位置。

2、特点

①逻辑上相邻的数据元素,赋以相邻的存储位置;

②存储密度高;

③ 便于随机存取;

④不便于插入、删除操作。

3、顺序表接口的描述:

public class SqList implements IList {
	private Object[] listElem; // 线性表存储空间

	private int curLen; // 当前长度

	// 顺序表的构造函数,构造一个存储空间容量为maxSize的线性表
	public SqList(int maxSize) {
		curLen = 0; // 置顺序表的当前长度为0
		listElem = new Object[maxSize];// 为顺序表分配maxSize个存储单元
	}

	// 将一个已经存在的线性表置成空表
	public void clear() {
		curLen = 0; // 置顺序表的当前长度为0

	}

	// 判断当前线性表中数据元素个数是否为0,若为0则函数返回true,否则返回false
	public boolean isEmpty() {
		return curLen == 0;
	}

	// 求线性表中的数据元素个数并由函数返回其值
	public int length() {
		return curLen; // 返回顺序表的当前长度
	}

	// 读取到线性表中的第i个数据元素并由函数返回其值。其中i取值范围为:0≤i≤length()-1,如果i值不在此范围则抛出异常
	public Object get(int i) throws Exception {
		if (i < 0 || i > curLen - 1) // i小于0或者大于表长减1
			throw new Exception("第" + i + "个元素不存在"); // 输出异常

		return listElem[i]; // 返回顺序表中第i个数据元素
	}

	// 在线性表的第i个数据元素之前插入一个值为x的数据元素。其中i取值范围为:0≤i≤length()。如果i值不在此范围则抛出异常,当i=0时表示在表头插入一个数据元素x,当i=length()时表示在表尾插入一个数据元素x
	public void insert(int i, Object x) throws Exception {
		if (curLen == listElem.length) // 判断顺序表是否已满
			throw new Exception("顺序表已满");// 输出异常

		if (i < 0 || i > curLen) // i小于0或者大于表长
			throw new Exception("插入位置不合理");// 输出异常

		for (int j = curLen; j > i; j--)
			listElem[j] = listElem[j - 1];// 插入位置及之后的元素后移

		listElem[i] = x; // 插入x
		curLen++;// 表长度增1
	}

	// 将线性表中第i个数据元素删除。其中i取值范围为:0≤i≤length()- 1,如果i值不在此范围则抛出异常
	public void remove(int i) throws Exception {
		if (i < 0 || i > curLen - 1) // i小于1或者大于表长减1
			throw new Exception("删除位置不合理");// 输出异常

		for (int j = i; j < curLen - 1; j++)
			listElem[j] = listElem[j + 1];// 被删除元素之后的元素左移

		curLen--; // 表长度减1
	}

	// 返回线性表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1
	public int indexOf(Object x) {
		int j = 0;// j为计数器
		while (j < curLen && !listElem[j].equals(x))
			// 从顺序表中的首结点开始查找,直到listElem[j]指向元素x或到达顺序表的表尾
			j++;
		if (j < curLen)// 判断j的位置是否位于表中
			return j; // 返回x元素在顺序表中的位置
		else
			return -1;// x元素不在顺序表中
	}

	// 输出线性表中的数据元素
	public void display() {
		for (int j = 0; j < curLen; j++)
			System.out.print(listElem[j] + " ");
		System.out.println();// 换行

	}
}


四、顺序表应用举例:
编写一个顺序表类的成员函数,实现对顺序表循环右移k位的操作。即原来顺序表为(a1,a2,…,an-k,an-k+1,…, an),循环向右移动k位后变成(an-k+1,…, an ,a1,a2,…,an-k)。要求时间复杂度为O(n)。

1、编写一个顺序表类的成员函数,实现对顺序表循环右移k位的操作(函数如下)。在上面SqList类中加上下面函数,

public void shit(int k) {
		int n=curLen,p=0,i,j,l;
        Object temp;
     	for(i=1;i<=k;i++)
          if(n%i==0&&k%i==0) //求n和k的最大公约数p
              p=i;
        for(i=0;i<p;i++){
           j=i;
           l=(i+n-k)%n;
           temp=listElem[i];
           while(l!=i){
             listElem[j]=listElem[l];
             j=l;
             l=(j+n-k)%n;
           }// 循环右移一步
        listElem[j]=temp;
        }
 }

2、下面是实现类:
public class Result {
	public static void main(String[] args) throws Exception {
		SqList L = new SqList(10);
		for (int i = 0; i <= 8; i++)
			L.insert(i, i);
		System.out.println("右移前顺序表中的各个数据元素为:");
		L.display();
		L.shit(3);
		System.out.println("右移3位后顺序表中的各个数据元素为:");
		L.display();
	}
}
结果:

右移前顺序表中的各个数据元素为:
0 1 2 3 4 5 6 7 8
右移3位后顺序表中的各个数据元素为:
6 7 8 0 1 2 3 4 5

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值