线性表的构成形式-数组(顺序结构)与链表(链式结构)

本文介绍了线性表的两种实现方式——数组(顺序结构)和链表(链式结构)。数组利用连续内存空间存储相同类型的数据,支持随机访问,但在插入和删除操作上效率较低。链表则不需要连续内存,插入和删除操作更灵活,但不支持随机访问。文章详细探讨了数组的访问越界问题、动态扩容以及数组与容器的区别,并对比了单链表、双向链表和循环链表的特点。
摘要由CSDN通过智能技术生成

1.线性表与非线性表

线性表以实现方式分为顺序结构(数组)链式结构(链表)
这里的线性是指的逻辑上的线性,即只要数据的保存满足了一对一关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接没有例外;就可以说这是一个线性表,而非线性表参考图、数,往往数据间的关系是一对多、多对一等。

2.数组

数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。
好的,这里存在着三个关键词,线性表连续内存空间、以及相同类型数据。我们一个个看。
线性表我们前面已经说过了,现在来看看连续内存空间以及相同类型数据:正是因为这两个限制,它才有了一个堪称“杀手锏”的特性:“随机访问”。但有利就有弊,这两个限制也让数组的很多操作变得非常低效,比如要想在数组中删除、插入一个数据,为了保证连续性,就需要做大量的数据搬移工作。
当计算机需要随机访问数组中的某个元素时,它会首先通过下面的寻址公式,计算出该元素存储的内存地址:

a[i]_address=base_address+i*data_type_size

具体实现:

public class Array<E>{
   //数组底层实现
	private E[] data;
	private int size;
	public Array(int capacity){
   
		data=(E[])new Object[capacity];
		size=0;
	}
	public Array(){
   //无参数构造函数,默认容量为10
		this(10);
	}
	private void resize(int newcapacity){
   
		E[] newdata=(E[])new Object[newcapacity];
		for(int i=0;i<size;i++){
   
			newdata[i]=data[i];
		}
		data=newdata;
	}
	public void insertElem(int index,E value){
   //增
		if(index<0||index>size){
   
			throw new IllegalArgumentException("越界!");
		}
		//Java的arrayList动态扩充为1.5倍
		if(size==data.length){
   
			resize(2*data.length);
		}
		for(int i=size;i>index;i--){
   
			data[i]=data[i-1];
		}
		data[index]=value;
		size++;
	}
	public E deleteElem(int index){
   //删
		if(index<0||index>size){
   
			throw new IllegalArgumentException("越界!");
		}
		E a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值