简单十字链表java实现

简单十字链表java实现

首先说一下关于十字链表的认识,其实简单来说,就是一个改进版本的二维数组,同时,他可以在实现图之类的数据结构上大有用处。今天按照自己对十字链表的理解,简单实现了一下。之所以说简单,主要是输入的时候要按照二维数组的存放顺序去输入;当然,还有一点是因为我没完整实现十字链表抽象数据结构的所有操作集。

import java.util.Scanner;
/**
* 十字链表结点类
* @author john
*
*/
class CrossLNode{
private int col,row,data;//记录该结点的行列以及数据,这里的col,row就是a[i][j]中的i和j.而a就是数组的入口地址,会用头结点来表示。
private CrossLNode right,down;//结点指针变量,分别指向行和列的后一个结点
public int getCol() {
return col;
}
public void setCol(int col) {
this.col = col;
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public CrossLNode getRight() {
return right;
}
public void setRight(CrossLNode right) {
this.right = right;
}
public CrossLNode getDown() {
return down;
}
public void setDown(CrossLNode down) {
this.down = down;
}
}
/**
* 十字链表的实现
* @author john
*
*/
public class CrossLink {
public CrossLNode rowCursor;
public CrossLNode colCursor;
CrossLNode head = new CrossLNode();
public void initCrossLink(){
System.out.println("输入十字链表的行数");
head.setRow(new Scanner(System.in).nextInt());
System.out.println("输入十字链表的列数");
head.setCol(new Scanner(System.in).nextInt());
System.out.println("输入非零元的个数");
head.setData(new Scanner(System.in).nextInt());
rowCursor = head;
colCursor = head;
for(int i = 0 ; i <head.getRow();i++){
CrossLNode rowHead = new CrossLNode();
rowHead.setData(i);
rowCursor.setDown(rowHead);
rowCursor = rowHead;
}//完成行头结点指针变量的初始化
for(int i = 0 ; i <head.getCol();i++){
CrossLNode colHead = new CrossLNode();
colHead.setData(i);
colCursor.setRight(colHead);
colCursor = colHead;
}//完成列头结点指针变量的初始化。
for(int i=0;i<head.getData();i++){//输入非零结点。
CrossLNode node = new CrossLNode();
System.out.println("输入该结点所在的行数");
node.setRow(new Scanner(System.in).nextInt());
System.out.println("输入该结点所在的列数");
node.setCol(new Scanner(System.in).nextInt());
System.out.println("输入该结点的值");
node.setData(new Scanner(System.in).nextInt());
CrossLNode cursor=head.getRight();
while(cursor.getData()!=node.getCol()){
cursor = cursor.getRight();
}
if(cursor.getDown()==null){//判断是否是第一次插入
cursor.setDown(node);
}else{
while(cursor.getDown()!=null){//直接插入到尾部
cursor = cursor.getDown();
}
cursor.setDown(node);
}
cursor = head.getDown();
System.out.println(cursor.getCol()+cursor.getRow()+cursor.getData());
while(cursor.getData()!=node.getRow()){
cursor = cursor.getDown();
}
if(cursor.getRight()==null){//判断是否是第一次插入
cursor.setRight(node);
}else{
while(cursor.getRight()!=null){//直接插入到尾部
cursor = cursor.getRight();
}
cursor.setRight(node);
}
}
}
/**
* 按行打印
*/
public void print(){
CrossLNode cursor =head;
for(cursor=cursor.getDown();cursor!=null;cursor=cursor.getDown()){
CrossLNode rowCursor =cursor;
for(rowCursor=rowCursor.getRight();rowCursor!=null;rowCursor=rowCursor.getRight()){
System.out.print(rowCursor.getData()+" ");
}
}
System.out.println();
}
/**
* 按列打印
*/
public void print2(){
CrossLNode cursor =head;
for(cursor=cursor.getRight();cursor!=null;cursor=cursor.getRight()){
CrossLNode colCursor =cursor;
for(colCursor=colCursor.getDown();colCursor!=null;colCursor=colCursor.getDown()){
System.out.print(colCursor.getData()+" ");
}
}
System.out.println();
}
public static void main(String[] args) {
CrossLink crossLink = new CrossLink();
crossLink.initCrossLink();
crossLink.print();
crossLink.print2();
}
}