链表工具类

@SuppressWarnings("all")
public class LinkList<E> implements ILink<E> {
    
	private class Node<E>{
		private E data; 		//存储的数据
		private Node next;		//下一个节点
		
		public Node(E data){	//构造方法,在实例化的时候存储数据
			this.data = data;
		}
		
		//添加数据
		public void addNode(Node next){	//保存新的数据
			if (this.next == null) {
				this.next = next;
			}else{
				this.next.addNode(next);
			}
		}
		
		//设置成数组
		public void toArrayNode(){
			//从内部类获取外部类的私有成员 没次加一保证下一次拿到的是加一的foot
			LinkList.this.returnData[LinkList.this.foot++] = this.data;	
			if (this.next != null) {//如果还有下一个节点  继续调这个方法
				this.next.toArrayNode();
			}
		}
		
		//根据索引查询数据
		public E getNode(int index){
			//从内部类获取外部类的私有成员 没次加一保证下一次拿到的是加一的foot
			if(LinkList.this.foot++ == index){	//索引相同
				return this.data;	//返回当前数据
			}else{
				return (E) this.next.getNode(index);	//递归调用
			}
		}
		
		//根据索引修改数据
		public void setNode(int index,E data){
			//从内部类获取外部类的私有成员 没次加一保证下一次拿到的是加一的foot
			if(LinkList.this.foot++ == index){	//索引相同
				this.data = data;
			}else{
				this.next.setNode(index, data);//递归调用
			}
		}
		
		//判断数据是否存在
		public boolean containsNode(E data){
			if (this.data.equals(data)) {	//判断数据是否相等
				return true;		//返回true
			}else{	
				if (this.next == null) {	//判断是否还有下一个节点
					return false;	//返回false
				}
			}
			return this.next.containsNode(data);	//递归调用
		}
		
		//删除节点
		public void removeNode(Node previous,E data){
			if (this.data.equals(data)) {
				previous.next = this.next;	//上一个节点的下一个节点变成要删除节点的下一个
			}else{
				if (this.next != null) {	//有后续节点
					this.next.removeNode(this, data);	//向后继续寻找data数据相等的节点
				}
			}
		}
	}
	//-----------------以下是LinkList的成员属性--------------
	private Node root;			//作为链表的根节点
	private int count;			//作为链表的长度/数量
	private int foot;			//数组下标
	private Object[] returnData;	//返回的数组
	
	//-----------------以下是ILink方法---------------------
	//添加
	@Override
	public void add(E data) {
		if (data == null) {		//保存数据为null
			return;				//结束方法直接返回
		}
		
		Node<E> next = new Node<E>(data);		//创建一个新的节点
		if (this.root == null) {		//没有根节点
			this.root = next;			//第一个节点做为根节点
		}else{	//根节点存在
			this.root.addNode(next);	//当有了根节点,就往下一个节点添加
		}
		
		this.count++;		//每添加一个对象都会加一
	}
	
	//长度
	@Override
	public int size(){
		return this.count;
	}
	
	//判断是否为空
	@Override
	public boolean isEmpty() {
		return this.count == 0;		//true为空,false非空
	}
	
	//数据集合
	@Override
	public Object[] toArray() {
		if (this.isEmpty()) {		//判断谁为空
			return null;			//直接返回
		}
		
		this.foot = 0;				//下标归零
		this.returnData = new Object[this.count];	//因为记录了长度 直接用就行了
		this.root.toArrayNode();	//利用Node进行递归数据获取
		//因为数组是引用类型  所以在上面这个方法获取就行了
		return this.returnData;
	}
	
	//遍历
	@Override
	public void printList() {
		Node<E> next = this.root;		//获取第一个数据
		
		while (true) {					//无限循环
			if (next == null) {			//为null
				break;					//跳出循环
			}
			
			System.out.println(next.data);	//输出数据
			next = next.next;			//获取下一个节点
		}
	}
	
	//根据下标获取数据
	@Override
	public E get(int index){
		if(index >= this.count){	//索引应该在指定范围之内
			return null;
		}
		//索引数据的获取应该有Node类完成 
		this.foot = 0;//重置索引的下标
		return (E) this.root.getNode(index);
	}
	
	//根据下标修改数据
	@Override
	public void set(int index, E data) {
		if(index >= this.count){	//索引应该在指定范围之内
			return;
		}
		//索引数据的获取应该有Node类完成 
		this.foot = 0;//重置索引的下标
		this.root.setNode(index, data);
	}
	
	//判断数据是否存在
	@Override
	public boolean contains(E data) {
		if (data == null) {		//为null返回false
			return false;
		}
		return this.root.containsNode(data);	
	}
	
	//删除数据
	@Override
	public void remove(E data) {
		if (this.contains(data)) {		//判断是否存在
			if (this.root.data.equals(data)) {		//根节点处理
				this.root = this.root.next;			//根引用根的下一个节点
			}else{					//如果不是根节点
				this.root.removeNode(this.root, data);
			}
		}
	}
	
	//清空
	@Override
	public void clean() {
		this.root =null;	//后续的节点都没了
		this.count = 0;		//数组长度清零
	}
}

interface ILink<E>{
	
	public void add(E data);		//添加
	public int size();				//长度
	public boolean isEmpty();		//判断链表是否为空
	public Object[] toArray();		//数据集合
	public E get(int index);		//根据索引取得数据
	public void set(int index,E data);	//根据索引修改数据
	public boolean contains(E data);	//判断数据是否存在
	public void remove(E data);		//删除数据
	public void clean();			//清空
	
	public void printList();		//遍历
}
C语言版本的直观链表创建和读取工具,隐藏了链表的操作细节 可以非常方便地在单片机等平台做FIFO应用,前提是不要用的太嗨,在极小内存的平台上建立好多个FIFO 支持多线程程序,目前尚未发现BUG /*---------------------------- 版本 : V0.01 作者 : ICARUS 日期 : 2019年6月3日 ------------------------------*/ //--------------------------------------------------------------------------------------------// 内置函数 int SL_Create( ) 创建一个数据链表,返回其在系统内的ID值,创建不成功则返回 SL_R_ERR int SL_Delete(int ID) 删除某个使用SL_Create()函数创建过的链表 int SL_InsertInturn(int ID,char* chain,int len,char ** NewNode) 向链表序号为ID的链表尾部插入chain为首地址,长度为len的数据块,数据块在系统中的内存地址将被NewNode返回,若想得到该内存地址,用(*NewNode) 使用示例: char * NewNode; SL_InsetInturn(5,"Hey,boy",strlen("HeyBoy\r\n"),&NewNode;); printf("%s",*NewNode); //------------------------------------------------------------------------------------------// int SL_ReadInturn(int ID,char * chain) 从链表序号为ID的链表头部读取数据到chain中,若返回值大于0,则返回值为数据长度,否则读取失败或链表中已无数据可读。 这一读操作会把数据节点从链表中移除 使用示例: int ReadLen; char chain[1500]; ReadLen = SL_ReadInturn(5,chain); if(ReadLen > 0) { ..... } 注意:由于时间原因,没有来得及修改SL_NodeModify()函数的实现,代码中注释掉的部分请先不要使用,请等待下一版本发布 使用时配合自定义的数据类型效果更佳。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值