📄 unpersongroup.java
字号:
package datastructure;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/
import java.awt.*;
//import java.awt.Color;
//import java.awt.Graphics;
class unPersonGroup {
// MAX_KEY表示链表节点的最大值为MAX_KEY
private final int MAX_KEY = 999;
//变量label1,label2分别用来标志链表La,Lb在合并中是否移向了下一个节点
//值为true时是,为false时不是,初始化值为true
private int label1;
private int label2;
///变量label3用来保存当链表La或Lb中所有元素已合并到链表Lc中时链表Lc的位置,初始化为0
private int label3;
//变量label4用来标记是否是调用了函数union(),初始化为0表示没有调用,不为0时表示调用了
private int label4;
//变量drawMode用来控制画图格式,初始化为2
private int drawMode;
/////////////////////////////////////////////////////////////////////
//// 分别用来存储链表La,Lb,Lc的各节点数据
private unLink linkArrayLa[];
private unLink linkArrayLb[];
private unLink linkArrayLc[];
//// 分别表示链表La,Lb,Lc的节点的个数
private int totalLinksLa;
private int totalLinksLb;
private int totalLinksLc;
///laCount,lbCount,lcCount分别表示链表La,Lb,Lc当前的节点位置
private int laCount;
private int lbCount;
private int lcCount;
//doneFlag记录链表合并是否完成,为真是表示已经完成
private boolean doneFlag;
private int totalLinks;
//类变量tempPers用来临时存放链表的数据
private unPerson tempPers;
private CodeAnimationPanel codePanel;
//变量codePart用来控制源代码的同步显示,初始化为0
private int codePart;
public unPersonGroup(int laSize, int lbSize,
CodeAnimationPanel codePanel) {
linkArrayLa = new unLink[laSize];
linkArrayLb = new unLink[lbSize];
linkArrayLc = new unLink[laSize + lbSize];
this.codePanel = codePanel;
label1 = 0;
label2 = 0;
label3 = 0;
label4 = 0;
laCount = 1;
lbCount = 1;
lcCount = 1;
doneFlag = false;
totalLinksLa = laSize;
totalLinksLb = lbSize;
totalLinksLc = totalLinksLa + totalLinksLb;
totalLinks = 0;
drawMode = 2;
// 使代码显示块初始显示为第三行
codePanel.highlight(3);
codePart = 0;
//初始化链表La,Lb
doFill(totalLinksLa, 1);
doFill(totalLinksLb, 2);
}
//getDoneFlag()函数用来返回标志链表合并是否完成的标记doneFlag的值
public boolean getDoneFlag() {
return doneFlag;
}
///该函数用来获取控制画图格式的drawMode的值
public void setDrawMode(int i) {
drawMode = i;
}
//makePerson(int i)函数用来设置链表节点值的大小为i的节点的颜色
private unPerson makePerson(int i) {
Color color;
int j = 100 + (int) (Math.random() * 154);
int k = 100 + (int) (Math.random() * 154);
int l = 100 + (int) (Math.random() * 154);
if (i == 0) {
//设置链表La,Lb,Lc的第一个节点的颜色为同一种颜色color
color = new Color(156, 120, 49);
}
else {
color = new Color(j, k, l);
}
return new unPerson(i, color);
}
///该函数用来初始化链表La,Lb,Lc
public void doFill(int i, int flag) {
totalLinks = i;
int k1 = 0;
int i2 = 0;
for (int l = 0; l < totalLinks; l++) {
int l1 = (int) ( (MAX_KEY - (float) i2) /
( (float) totalLinks - (float) l));
int j1 = (int) (Math.random() * (double) l1);
if (l == 0)
k1 = i2 = 0;
else {
k1 = k1 + j1;
i2 = k1;
}
tempPers = makePerson(k1);
if (flag == 1)
linkArrayLa[l] = new unLink(tempPers);
else if (flag == 2)
linkArrayLb[l] = new unLink(tempPers);
}
linkArrayLc[0] = linkArrayLa[0];
}
// 绘制链表的第 i 个节点
public void drawLink(Graphics g, int i, int tag) {
int j, k = 0, l = 0;
j = 32 + 57 * (i % 7);
if (tag == 1) {
k = 20 + 57 * (i / 7);
totalLinks = totalLinksLa;
}
else if (tag == 2) {
k = 50 + 57 * (i / 7) + 20 + 57 * (13 / 7);
totalLinks = totalLinksLb;
}
else if (tag == 3) {
k = 60 + 57 * (i / 7) + 20 + 57 * (27 / 7);
totalLinks = lcCount;
}
g.setColor(Color.black);
g.drawRect(j, k - 5, 35, 17);
if (tag == 1) {
l = linkArrayLa[i].persData.getHeight();
g.setColor(linkArrayLa[i].persData.getColor());
}
else if (tag == 2) {
l = linkArrayLb[i].persData.getHeight();
g.setColor(linkArrayLb[i].persData.getColor());
}
else if (tag == 3) {
l = linkArrayLc[i].persData.getHeight();
g.setColor(linkArrayLc[i].persData.getColor());
}
g.fill3DRect(j + 1, k - 4, 34, 16, true);
byte byte0;
if (l < 10)
byte0 = 11;
else if (l < 100)
byte0 = 5;
else
byte0 = 0;
g.setColor(Color.black);
if (i == 0) {
if (tag == 1)
g.drawString("La", j + byte0 + 2, (k + 17) - 8);
else if (tag == 2)
g.drawString("Lb", j + byte0 + 2, (k + 17) - 8);
else
g.drawString("Lc", j + byte0 + 2, (k + 17) - 8);
}
else
g.drawString(String.valueOf(l), j + byte0 + 10, (k + 17) - 8);
if (i < totalLinks - 1)
if (i % 7 != 6) {
g.drawLine(j + 35, (k + 8) - 4, j + 35 + 20, (k + 8) - 4);
smallArrow(g, j + 35 + 20, (k + 8) - 4);
}
else {
int i1 = (k + 8) - 4;
g.drawLine(j + 35, i1, j + 35 + 8, i1);
g.drawLine(j + 35 + 8, i1, j + 35 + 8, i1 + 34 + 4);
g.drawLine(j + 35 + 8, i1 + 34 + 4, 10, i1 + 34 + 4);
g.drawLine(10, i1 + 34 + 4, 10, i1 + 57);
g.drawLine(10, i1 + 57, 30, i1 + 57);
smallArrow(g, 30, i1 + 57);
}
}
// 绘制指向链表下一个节点的箭头
private void smallArrow(Graphics g, int i, int j) {
g.drawLine(i, j, i - 5, j - 3);
g.drawLine(i, j, i - 5, j + 3);
}
///// 绘制指向链表的箭头
public void drawArrow(Graphics g, int i, int tag1, boolean flag2) {
int j, k = 0;
j = 32 + 57 * (i % 7);
if (tag1 == 1) {
k = 20 + 57 * (i / 7);
}
else if (tag1 == 2) {
k = 50 + 57 * (i / 7) + 20 + 57 * (13 / 7);
}
else if (tag1 == 3) {
k = 60 + 57 * (i / 7) + 20 + 57 * (27 / 7);
}
if (flag2)
g.setColor(Color.red);
else
g.setColor(Color.lightGray);
int j1 = j + 17;
int k1 = (k + 17) - 3;
g.drawLine(j1, k1, j1, k1 + 25);
g.drawLine(j1 + 1, k1, j1 + 1, k1 + 25);
g.drawLine(j1, k1, j1 + 6, k1 + 10);
g.drawLine(j1 + 1, k1, j1 + 7, k1 + 10);
g.drawLine(j1, k1, j1 - 6, k1 + 10);
g.drawLine(j1 + 1, k1, j1 - 5, k1 + 10);
if (tag1 == 1)
g.drawString("pa", j1 - 15, k1 + 22);
else if (tag1 == 2)
g.drawString("pb", j1 - 15, k1 + 22);
else
g.drawString("pc", j1 - 15, k1 + 22);
}
public void draw(Graphics g) {
if (codePart == 7 || codePart == 9) {
drawLink(g, lcCount - 2, 3);
drawLink(g, lcCount - 1, 3);
if (drawMode == 1) {
if (label1 != 2 && label2 != 2) {
if (laCount <= totalLinksLa && label1 != 2)
laCount = (label1 == 1) ? laCount : (laCount + 1);
if (lbCount <= totalLinksLb && label2 != 2)
lbCount = (label2 == 1) ? lbCount : (lbCount + 1);
drawArrow(g, laCount - 2, 1, false);
drawArrow(g, lbCount - 2, 2, false);
drawArrow(g, lcCount - 2, 3, false);
drawArrow(g, laCount - 1, 1, true);
drawArrow(g, lbCount - 1, 2, true);
drawArrow(g, lcCount - 1, 3, true);
if (laCount <= totalLinksLa && label1 != 2)
laCount = (label1 == 1) ? laCount : (laCount - 1);
if (lbCount <= totalLinksLb && label2 != 2)
lbCount = (label2 == 1) ? lbCount : (lbCount - 1);
}
unLinkList.text6.setText(" NULL, 指向一个值为 " +
String.valueOf(linkArrayLc[1].persData.
getHeight()) +
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -