Java链表的增删查改的实现与测试

本文介绍了一个简单的Java链表实现,包括节点添加、删除、查找等基本操作,并通过一个示例展示了链表的基本使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java实现链表主要依靠引用传递,引用可以理解为地址,链表的遍历多使用递归,这里我存在一个疑问同一个类的不同对象的的相同方法的方法内调用算不算递归,欢迎评论交流。

代码如下:

class mytype{

  private String name;
  private String people;
  private int age;
  public mytype(String name,String people,int age){//链表中的数据(可自定义)
    this.name=name;
    this.people=people;
    this.age=age;
  }
  public boolean equals(mytype data){//判断数据是否相同
    if(this==data){
      return true;
    }
    if(data==null){
      return false;
    }
    if(this.name.equals(data.name)&&this.people.equals(data.people)&&this.age==data.age){
      return true;
    }else{
      return false;
    }
  }

  public void setName(String name){
    this.name=name;
  }
  public String getName(){
    return this.name;
  }
  public void setPeople(String people){
    this.people=people;
  }
  public String getPeople(){
    return this.people;
  }
  public void setAge(int age){
    this.age=age;
  }
  public int getAge(){
    return this.age;
  }
  public String getInfo(){
    return "名字 :"+this.name+"\n"+
           "人物 :"+this.people+"\n"+
           "年龄 :"+this.age;
  }
}
class Link{
  private class Node{//内部类
    private Node next;
    private mytype data;
    public Node(mytype data){
      this.data=data;
    }


    public void addNode(Node newNode){//增加节点
      if(this.next==null){
        this.next=newNode;
      }else{
        this.next.addNode(newNode);
      }
    }


    public mytype getNode(int index){//按照角标返回数据

      if(index==Link.this.foot++){
        return this.data;
      }else{
        return this.next.getNode(index);
      }
    }


    public boolean iscontain(mytype data){//判断是否含有该数据
      if(this.data.equals(data)){
        return true;
      }else{
        if(this.next!=null){
          return this.next.iscontain(data);
        }else{
          return false;
        }
      }
    }


    public void removeNode(Node previous,mytype data){//删除节点
      if(this.data.equals(data)){
        previous.next=this.next;

      }else{
        this.next.removeNode(this,data);
      }
    }


    public void toArrayNode(){//转化数组
        Link.this.Larray[Link.this.foot ++]=this.data;
        if(this.next!=null){
          this.next.toArrayNode();
        }
      }


  }
  //内部类定义完毕
  private Node root;
  private int count=0;
  private int foot;
  private mytype [] Larray;


  public void add(mytype data){//增加节点
    if(data==null){
      System.out.print("增加数据失败,数据为空");//测试用
      return;
    }
    Node newNode=new Node(data);
    if(this.root==null){
      this.root=newNode;
      this.count++;
    }else{
      this.root.addNode(newNode);
      this.count++;
    }
  }

  public int length(){//链表长度
    return this.count;
  }


  public boolean isEmpty(){//是否为空链表
    if(this.count==0)return true;
    else return false;
  }


  public void clean(){//清空链表
    this.root=null;
    this.count=0;
  }


  public mytype get(int index){//索引返回节点所存的数据
    if(index>=this.count||index<0){
      System.out.print("越界错误");//测试用
      return null;
    }else{
      this.foot=0;
      return this.root.getNode(index);
    }
  }


  public boolean contains(mytype data){//判断链表数据是否含data
    if(data==null)
      return false;
    return this.root.iscontain(data);
  }

  public void remove(mytype data){//删除指定数据节点
    if(this.contains(data)){
      if(this.root.data.equals(data)){
        this.root=this.root.next;
        this.count--;

      }
      else{
        this.count--;
        this.root.next.removeNode(root,data);
      }
    }else{
      System.out.print("删除错误");//测试用

    }
  }

  public mytype[] toArray(){//把链表转化成对象数组
    if(this.count==0){
      return null;
    }
      this.foot=0;
      this.Larray=new mytype [this.count];
      this.root.toArrayNode();
      return this.Larray;

  }
}

public class linkdemo{
  public static void main(String [] args){
    Link l=new Link();
    mytype[] la;
    mytype dsome=new mytype("韩枫","dsome",21);
    mytype shao=new mytype("邵年","john",45);
    mytype hua=new mytype("华成风","jam",46);
    mytype duo=new mytype("哆鱼","duo",1000);
    mytype wang=new mytype("王冬","jack",21);
    mytype shi=new mytype("时寒","bob",3000);
    mytype yu=new mytype("于雪","keven",30);

    l.add(dsome);//测试增加节点
    l.add(shao);
    l.add(hua);
    l.add(wang);
    l.add(shi);
    l.add(duo);
    l.add(yu);

    System.out.println("链表长度:"+l.length());//链表长度
    la=l.toArray();
    for(int i=0;i<la.length;i++){
      System.out.println(la[i].getInfo());
    }
    System.out.println("是否包含多余:"+l.contains(duo)+"\n");
    System.out.println("删除多余后\n");
    l.remove(duo);
    la=l.toArray();
    for(int i=0;i<la.length;i++){//转化为数组之后输出
      System.out.println(la[i].getInfo());
    }

    System.out.println("\n利用索引方法输出全部数据");
    for(int i=0;i<l.length();i++){
      System.out.println(l.get(i).getInfo());
    }

    System.out.println("是否包含多余:"+l.contains(duo)+"\n");
    l.clean();
    System.out.println("执行清空操作后链表长度: "+l.length()+"\t是否为空链表:"+l.isEmpty());






  }
}

测试效果如下:

D:\code\java>javac linkdemo.java

D:\code\java>java linkdemo
链表长度:7
名字 :韩枫
人物 :dsome
年龄 :21
名字 :邵年
人物 :john
年龄 :45
名字 :华成风
人物 :jam
年龄 :46
名字 :王冬
人物 :jack
年龄 :21
名字 :时寒
人物 :bob
年龄 :3000
名字 :哆鱼
人物 :duo
年龄 :1000
名字 :于雪
人物 :keven
年龄 :30
是否包含多余:true

删除多余后

名字 :韩枫
人物 :dsome
年龄 :21
名字 :邵年
人物 :john
年龄 :45
名字 :华成风
人物 :jam
年龄 :46
名字 :王冬
人物 :jack
年龄 :21
名字 :时寒
人物 :bob
年龄 :3000
名字 :于雪
人物 :keven
年龄 :30

利用索引方法输出全部数据
名字 :韩枫
人物 :dsome
年龄 :21
名字 :邵年
人物 :john
年龄 :45
名字 :华成风
人物 :jam
年龄 :46
名字 :王冬
人物 :jack
年龄 :21
名字 :时寒
人物 :bob
年龄 :3000
名字 :于雪
人物 :keven
年龄 :30
是否包含多余:false

执行清空操作后链表长度0 是否为空链表:true


数据结构单链表插入、删除和修改实验报告 一、实验目的 1.理解数据结构中带头结点单链表的定义和逻辑图表示方法。 2.掌握单链表中结点结构的JAVA描述。 3.熟练掌握单链表的插入、删除和查询算法的设计JAVA实现。 4.熟练掌握简单的演示菜单人机交互设计方法。 二、实验内容 1. 编制一个演示单链表插入、删除、查找等操作的程序。 三、实验步骤 1.需求分析 本演示程序用JAVA编写,完成单链表的生成,任意位置的插入、删除,以及确定某一元素在单链表中的位置。 ① 输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。在所有输入中,元素的值都是整数。 ② 输出的形式:在所有三种操作中都显示操作是否正确以及操作后单链表的内容。其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。   ③ 程序所能达到的功能:完成单链表的生成(通过插入操作)、插入、删除、查找操作。 ④ 测试数据:  A. 插入操作中依次输入11,12,13,14,15,16,生成一个单链表    B. 查找操作中依次输入12,15,22返回这3个元素在单链表中的位置    C. 删除操作中依次输入2,5,删除位于2和5的元素 2.概要设计 1)为了实现上述程序功能,需要定义单链表的抽象数据类型:   ADT LinkList {    数据对象:D={ai|ai∈IntegerSet,i=0,1,2,…,n,n≥0}    数据关系:R={|ai,ai+1 ∈D}    基本操作: (1)insert 初始化状态:单链表可以不为空集;操作结果:插入一个空的单链表L。   (2)decelt     操作结果:删除已有的单链表的某些结点。 (3)display     操作结果:将上述输入的元素进行排列显示。    (4)modify     操作结果:将上述输入的某些元素进行修改。    (5)save     操作结果:对上述所有元素进行保存。    (6)load     操作结果:对上述元素进行重新装载。   }   2)本程序包含7个函数:   ① 主函数main()   ② 保存单链表函数save()   ③ 重载操作菜单函数load()   ④ 显示单链表内容函数display ()   ⑤ 插入元素函数insert ()   ⑥ 删除元素函数decelt ()   ⑦ 修改元素函数modify()   各函数间关系如下: 3.详细设计   实现概要设计中定义的所有的数据类型,对每个操作给出伪码算法。对主程序和其他模块也都需要写出伪码算法。   1) 结点类型和指针类型   typedef struct node {    int data;    struct node *next;   }Node,*singleLIST.java;   2) 单链表的基本操作   为了方便,在单链表中设头结点,其data域没有意义。 bool insert(singleLIST) (伪码算法)   bool modify(singleLIST) (伪码算法)   void delect(singleLIST)   (伪码算法)   void display()   (伪码算法) 3) 其他模块伪码算法 4.调试分析   (略) 5.使用说明 程序名为 ,运行环境为Windows。程序执行后显示   ========================   0----EXIT   1----INSERT   2----DELETE   3----DISPLAY 4----MODIFY 5----EXIST =======================   SELECT:   在select后输入数字选择执行不同的功能。要求首先输入足够多的插入元素,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后单链表的内容。 选择5:退出程序   选择1:显示"INSERT =" ,   要求输入要插入的位置和元素的值(都是整数)。   选择2:显示"DELETE =" ,   要求输入要删除元素的位置,执行成功后返回元素的值。   选择3:显示"MODIFY = " , 选择要修改的对象,执行成功后返回新的元素值。 选择4:显示"DIAPLAY= "   显示所有单链表中的元素,自动进行排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值