java实现线性表_java实现线性表及其算法

线性表

线性表是最简单和最常用的一种数据结构,它是有n个体数据元素(节点)组成的有限序列。其中,数据元素的个数n为表的长度,当n为零时成为空表,非空的线性表通常记为:

(a1,a2,… ,ai-1,ai, ai+1,…,an)

一. 线性表的顺序存储及算法

线性表的顺序存储指的是将线性表的数据元素按其逻辑次序依次存入一组地址连续的存储单元里,用这种方法存储的线性表称为顺序表。

1.顺序表的结构定义

public class SeqList {

/* 初始空间为10 */

private static final int LIST_SIZE = 10;

/* 数组data用来存放元素 */

private int[] data;

/* 当前表长,实际存储元素的个数 */

private int length;

}

2.插入运算

顺序表的插入运算是指在线性表的第i-1个元素和第i个元素之间插入一个新元素。由于顺序表逻辑上相邻的元素在物理结构上也相邻,其物理存储关系也要发生相应的变化。除非i=n+1,否则必须将原顺序表的第i个元素开始的所有元素分别向后移动1个位置。

/**

* 在顺序表list中第i个位置之前插入一个新元素node

* @param list 顺序表

* @param i 插入位置

* @param node 新元素

*/

public void insertList(SeqList list, int i, int node) {

if (i < 1 || i > list.length + 1) {

System.out.println("position error");

return;

}

if (list.length >= LIST_SIZE) {

System.out.println("overflow");

return;

}

for (int j = list.length - 1; j >= i - 1; j --) {

/* 从最后一个元素开始逐一后移 */

list.data[j+1] = list.data[j];

}

/* 插入新元素 */

list.data[i-1] = node;

/* 表长加1 */

list.length ++;

}

3.删除运算

顺序表的删除运算指的是将表中第i个元素删除,与插入运算相反,插入是向后移动元素,删除运算则是向前移动元素。

/**

* 在顺序表list中删除第i个元素,并返回被删除的元素

* @param list 顺序表

* @param i 元素位置

* @return node

*/

public int deleteList(SeqList list, int i) {

int node = 0;

if (i < 0 || i > list.length) {

System.out.println("position error");

return node;

}

node = list.data[i-1];

for (int j = i; j < list.length; j ++) {

/* 元素前移 */

list.data[j-1] = list.data[j];

}

list.length --;

return node;

}

4.顺序表逆置

先以表长的一半为循环控制次数,将表中最后一个元素同顺序顺数第一个元素交换,将倒数第二个元素同顺数第二个元素交换,以此类推,直至交换完为止。

/**

* 顺序表逆置

* @param list 原始顺序表

* @return 逆置后的顺序表

*/

public SeqList converts(SeqList list) {

int node;

int length = list.length/2;

for (int i = 0; i < length; i ++) {

/* 对称交换元素 */

int j = list.length - 1 - i;

node = list.data[i];

list.data[i] = list.data[j];

list.data[j] = node;

}

return list;

}

二. 线性表的链式存储及算法

链式存储结构存储线性表数据元素的存储空间可能是连续的,也可能是不连续的,因而链表的节点是不可以随机存取的,链式存粗是最常见的存储方式之一。

在使用链式存储结构表示每个数据元素时,除了存储元素本身的信息外,还需要一个存储指示后继元素存储位置的地址,利用这种存储方式表示的线性表称为链表。

5.单链表的结构定义

public class LinkList {

/* 数据域 */

private char data;

/* 后继元素 */

private LinkList next;

}

6.头插法建表算法

头插法是从一个空表开始,重复读入数据,生成新节点,将读入的数据存放到新节点的数据域中,然后将新节点插入到当前链表的表头上,直到结束为止。

/**

* 头插法创建表

* @param chars 字符数组

* @return 单链表

*/

public LinkList createListF(char[] chars) {

LinkList node;

LinkList head = null;

for (char ch : chars) {

/* 申请新节点 */

node = new LinkList();

node.data = ch;

/* 指向后继节点 */

node.next = head;

head = node;

}

/* 返回头节点 */

return head;

}

7.尾插法建表算法

头插法建表中节点的次序和输入时的顺序相反,若需要和输入次序一致,则可使用尾插法。

/**

* 尾插法建表

* @param chars 字符数组

* @return 单链表

*/

public LinkList createListR(char[] chars) {

LinkList node;

LinkList head = null;

LinkList rear = null;

for (char ch : chars) {

node = new LinkList();

node.data = ch;

if (head == null) {

/* 新节点为头节点 */

head = node;

} else {

/* 上一个节点指向新节点 */

rear.next = node;

}

/* 表尾指向新的节点 */

rear = node;

}

/* 返回头节点 */

return head;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值