Java数据结构(一) ---链表

来源:互联网 发布:网络弊大于利的辩论词 编辑:程序博客网 时间:2024/05/09 09:01
总共分为3个文件:

Node.java                         ---声明节点里的内容

NodeList.java                  --声明链表类

NodeListTest.java          --测试主函数

//###############链表类中的节点类######################//文件名: Node.java//内容为姓名和号码//2011年8月11日//write by chenjunpublic class Node{public String name;public String number;}

//###############链表类######################//文件名: NodeList.java//节点内容为姓名和号码//2011年8月11日//write by chenjun//节点的下标从0开始计算,节点的序列号从1开始!public class NodeList{private int maxNode = 10;//data 链表最大的节点数private Node node[] = new Node[maxNode];//节点//private String name[] = new String[maxNode];//private String number[] = new String[maxNode];private int next[] = new int[maxNode];//下一个节点的下标, 如果是-2表示该节点为空,如果是-1表示为链表的尾部private int head = 0;//链表头,默认是0;//默认构造方法public NodeList(){for(int i = 0 ; i < this.maxNode ; i++){this.next[i] = -2;this.node[i] = new Node();}}public NodeList(int maxNode){this.maxNode = maxNode;for(int i = 0 ; i < this.maxNode ; i++){this.next[i] = -2;this.node[i] = new Node();}}//查找一个空的节点,返回空节点的下标,如果没有空节点,返回-1private int searchFree(){for(int k = 0 ; k < maxNode ; k ++){if(this.next[k] == -2)return k;}return -1;}//找到末节点下标,如果是空链表,则返回-1private int findEnd(){int pointer = this.head;if(this.next[pointer] == -2){return -1;}while(this.next[pointer] != -1){pointer = this.next[pointer];}return pointer;}//查找链表第n个节点,并返回其的下标,如果第n个节点不存在,则返回-1private int findIndex(int n){if(n < 1)return -1;int pointer = this.head;for(int i = 0 ; i < n - 1 ; i++){if(this.next[pointer] == -1 || this.next[pointer] == -2){return -1;}pointer = this.next[pointer];}return pointer;}//增加链表节点,返回新节点的下标,如果创建节点失败,则返回-1private int creatNode(String name , String number){int n = this.searchFree();if (n == -1){System.out.println("链表的节点已经到达最大的数!");return n;}this.node[n].name = name;this.node[n].number = number;return n;}//普通的增加一个节点到链表末尾public void add(String name , String number){int newNodeIndex = this.creatNode(name , number);//新节点下标if(newNodeIndex == -1)return;//查找末节点,如果不是空链表,将末节点指向新的节点int endIndex = this.findEnd();if(endIndex != -1){this.next[endIndex] = newNodeIndex;}this.next[newNodeIndex] = -1;}//增加一个节点到链表首部public void addToHead(String name , String number){int newNodeIndex = this.creatNode(name , number);if(newNodeIndex == -1)return;if(newNodeIndex == head){this.next[newNodeIndex] = -1;}else{this.next[newNodeIndex] = head;this.head = newNodeIndex;}}//增加一个节点到某个固定的序列号下public void addToMiddle(String name , String number , int index){if (index < 1){System.out.println("不能插入到序列号小于1的节点!");return;}else if(index == 1)this.addToHead(name , number);else{int n = this.findIndex(index - 1);//查找前一个节点if(n == -1){//前一个节点不存在System.out.println("插入的序列号过大或者过小!");return;}int newNodeNum = this.creatNode(name , number);if(newNodeNum == -1)return;this.next[newNodeNum] = this.next[n];this.next[n] = newNodeNum;}}//删除指定序列号的节点public void del(int index){int pointer = findIndex(index);//要删除的节点的下标int back = findIndex(index + 1);//后一节点的下标int front = findIndex(index - 1);//前一节点的下标if(pointer == -1){System.out.println("您想删除的节点不存在!");return;}//如果是删除末节点if(back == -1 && front != -1){this.next[pointer] = -2;this.next[front] = -1;this.node[pointer] = new Node();}//如果是删除首节点if(back != -1 && front == -1){this.head = this.next[pointer];this.next[pointer] = -2;this.node[pointer] = new Node();}//如果是删除中间节点if(back != -1 && front != -1){this.next[back] = this.next[pointer];this.next[pointer] = -2;this.node[pointer] = new Node();}//删除只有一个节点的首节点if(back == -1 && front == -1){this.next[pointer] = -2;this.node[pointer] = new Node();}System.out.println("节点删除成功!");}//打印数据public void print(){//从表头开始打印System.out.println("链表里的节点:");int n = this.head;for(int i = 1 ; i <= maxNode ; i++){if(this.next[n] == -2){System.out.println("链表为空!");return;}System.out.print(i + ". ");System.out.println("姓名: " + this.node[n].name + " 号码: " + this.node[n].number);if(this.next[n] == -1){return;}n = this.next[n];}}}

//###############链表类测试主程序######################//文件名:NodeListTest.java//节点内容为姓名和号码//2011年8月11日//write by chenjun//节点的下标从0开始计算,节点的序列号从1开始!import java.io.*;import java.lang.*;import java.util.*;public class NodeListTest{public static void main(String args[]){NodeList nodeList = new NodeList();System.out.println("########### 数据结构链表练习        ###########");while(true){nodeList.print();System.out.println("########### 1.输出所有节点          ###########");System.out.println("########### 2.插入数据到链表尾部    ###########");System.out.println("########### 3.插入数据到链表头      ###########");System.out.println("########### 4.插入数据到指定序列号  ###########");System.out.println("########### 5.删除某个节点          ###########");System.out.println("########### 0.退出                  ###########");System.out.print("########### 请输入您的选择: ");InputStream is = System.in;Scanner scanner = new Scanner(is);String stringEvent = scanner.next();int event = Integer.parseInt(stringEvent);if(event == 0){break;}else if(event == 1){nodeList.print();}else if(event == 2){System.out.print("请输入姓名:");String name = scanner.next();System.out.print("请输入号码:");String number = scanner.next();nodeList.add(name , number);}else if(event == 3){System.out.print("请输入姓名:");String name = scanner.next();System.out.print("请输入号码:");String number = scanner.next();nodeList.addToHead(name , number);}else if(event == 4){System.out.print("想插入的序列号: ");int index = scanner.nextInt();System.out.print("请输入姓名:");String name = scanner.next();System.out.print("请输入号码:");String number = scanner.next();nodeList.addToMiddle(name , number , index);}else if(event == 5){System.out.print("请输入想删除的序列号: ");int index = scanner.nextInt();nodeList.del(index);}else{System.out.println("您输入的功能不存在!");}System.out.println("");}}}


	
				
		
原创粉丝点击