实验一:线性表的基本操作


实验一:线性表的基本操作

一、实验目的:

  1、熟悉Java 上机环境,掌握Java语言编程方法,熟练运用Java语言实现数据结构设计和算法设计。

2、掌握线性表的顺序存储结构和链式存储结构的定义与基本操作,并能用Java语言实现线性表基本功能。

3、掌握利用线性表编写算法解决实际问题的方法。

 

二、实验内容:

  1、编写一个Java语言程序,实现带头结点的单链表存储及基本操作。

     实验步骤:

①、在Java编辑环境中新建程序,参考书本P48/P41内容,输入完整程序内容,并保存和编译;

②、运行程序,输出操作菜单;

③、依次实现单链表插入、删除、追加、查找、取元素、判空、求长度等;

 

  2、编写一个Java语言程序,利用线性表实现约瑟夫环问题,参考书本程序示例【例2.1】、【例2.2】,完善该程序并运行。

    实验步骤:

①、在Java编辑环境中新建程序,根据【例2.1】、【例2.2输入完整程序内容,并保存和编译;

    ②、运行程序,输入约瑟夫环长度number、起始位置start、计数值distance;

    ③、依次输入约瑟夫环中number个数据元素;

    ④、输出约瑟夫环执行过程。

 

三、操作步骤

实验一:线性表的基本操作_第1张图片

 实验一:线性表的基本操作_第2张图片

/*

 * 任务

 * 编写一个Java语言程序,实现带头结点的单链表存储及基本操作。

     实验步骤:

①、在Java编辑环境中新建程序,参考书本P48/P41内容,输入完整程序内容,并保存和编译;

②、运行程序,输出操作菜单;

③、依次实现单链表插入、删除、追加、查找、取元素、判空、求长度等;

 */

public class SinglyList {

//头指针,指向单链表的头结点

public Node head;

public T[] values;

//构造空单链表

public SinglyList(){

this.head=new Node();//创造头结点,data和next为空

}

public SinglyList(T[] values){

this();//调用自身的构造方法 SinglyList();

//rear指向单链表的最后一个结点

Node rear=this.head;

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

rear.next=new Node(values[i],null);

rear=rear.next;

}

}

//判断是否为空

public boolean isEmpty(){

return this.head.next==null;

}

//判断单链表的长度

public int getLength(){

int i=-1;

for(Node p=this.head;p!=null;p=p.next){

i++;

}

return i;

}

//存取单链表中指定元素的值

public T get(int i){

Node p=this.head.next;//p=a0

int j;

for(j=0;p!=null && j<i;j++)//条件为该表不为空表并且j

p=p.next;

return(j>=0 && p!=null)? p.data : null;

}

//返回单链表中所有元素的描述字符串,形式为(,)

public String toString(){

String str=this.getClass().getName()+"(";

for(Node p=this.head.next;p!=null;p=p.next){

str =str+ p.data.toString();

if(p.next != null)

str += ",";

}

return str+")";

}

//插入

/*

 * 1.插入x作为第i个元素,x!=null,返回插入点

 * 2.对序号i进行容错措施,若i<0则插入x在最前,若x>n则插入x在最后

 */

public Node insert(T x,int i){

if(x==null)

throw new NullPointerException("x==null");

Node front=this.head;//front.next=a0

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

front=front.next;

}

front.next=new Node(x,front.next);

return front.next;

}

//删除,并且返回被删除元素

public T remove(int i){

Node front=this.head;

for(int j=0;j<i;j++)

front=front.next;

T old=front.next.data;

front.next.data=front.next.next.data;

front.next=front.next.next;

return old;

}

//返回第一次出现t的位置

public int search(String t){

int i=-1;

for(Node p=this.head;p!=null;p=p.next){

if(p.data == t)

break;

i++;

}

return i;

}

 

 

public class Node {

public Node next;

public T data;

Node(){

}

Node(T data,Node next){

this.data=data;

this.next=next;

}

}

 

 

 

 

以上为主要程序方法

以下为测试部分,程序的运行:

public static void main(String []args ){

String[] t ={"a0","a1","a2","a3","a4","a5"};

SinglyList sing=new SinglyList(t);

System.out.println("依次实现单链表插入、删除、追加、查找、取元素、判空、求长度等");

System.out.println("该表是否为空:"+sing.isEmpty());

System.out.println("打印该表的元素 "+sing.toString());

System.out.println("该表的长度为"+sing.getLength());

System.out.println();

System.out.println();

System.out.println("对该表进行插入操作");

System.out.println("将元素x插入第0个位置"+sing.insert("x", 0));

System.out.println("将元素y插入第4个位置"+sing.insert("y", 4));

System.out.println("将元素z插入最后一个位置"+sing.insert("z",sing.getLength()));

System.out.println("打印该表的元素 "+sing.toString());

System.out.println("该表的长度为"+sing.getLength());

System.out.println();

System.out.println();

System.out.println("返回该单链表中第3个元素 "+sing.get(2));

System.out.println("删除第3个元素"+sing.remove(2));

System.out.println("返回该单链表中第3个元素 "+sing.get(2));

System.out.println("打印该表的所有元素 "+sing.toString());

System.out.println("查找第一次出现a4的元素的位置"+sing.search("a4"));

}

}

 

 实验一:线性表的基本操作_第3张图片

import java.util.ArrayList;

/*

 * 约瑟夫环的思想

 * 1.先确定链表的长度、数数的起点位置(由数组控制)、步长(独特算法)

 * 2.步长可以实现将所有的数变成“连接的”,由队列排列变成了一个圆排列,每隔一定步长删掉一个人

 */

public class Josephus_2_1 {

 

public Josephus_2_1(int number,int start,int distance){

System.out.println("Josephus("+number+","+start+","+distance+")");

//创建顺序表实例,类型是string,可以通过number确定表长

ArrayList list=new ArrayList(number);

for(int i=0;i<number;i++)

list.add((char)('A'+i)+"");

 

System.out.println(list.toString());

int i=start;

while(list.size()>1){

i=(i+distance-1)%list.size();

System.out.print("删除"+list.remove(i).toString()+" ");

System.out.println(list.toString());

}

System.out.println("被赦免者是"+list.get(0).toString());

}

public static void main(String[] args) {

// TODO Auto-generated method stub

new Josephus_2_1(8,2,3);

}

}

 

四、实验收获和建议:

 

你可能感兴趣的:(数据结构)