📄 unlinklist.java
字号:
package datastructure;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2004</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
//import java.util.*;
public class unLinkList
extends Panel
implements Runnable, ActionListener {
private Thread runner;
private unPersonGroup thePersonGroup;
//演示控制按钮
public JButton newButton;
public JButton runButton;
public JButton stepButton;
public JButton stayButton;
/////////////////////////////////////////
// private unFrame frame;
//控制演示速度
private GlobalControls controlsPanel;
private int controls;
//laSize,lbSize用来确定链表La,Lb的大小
private int laSize;
private int lbSize;
//runFlag用来控制线程runner的执行,runFlag为true时执行,为false时不执行
private boolean runFlag;
//用来控制代码的同步显示
private CodeAnimationPanel codePanel;
//panel用来添加代码显示面板和panel1面板,设置为BorderLayout布局
Panel panel;
//panel1用来添加显示变量值变化情况的文本框,设置为GridLayout布局
JPanel panel1;
// 以下文本框用于显示演示过程中算法变量的变化
private JTextField text77 = new JTextField(" 变 量 名 ");
private JTextField text7 = new JTextField("变量当前值(data , next) ");
private JTextField text11 = new JTextField(" pa");
static JTextField text1;
private JTextField text22 = new JTextField(" pb");
static JTextField text2;
private JTextField text33 = new JTextField(" pc");
static JTextField text3;
private JTextField text44 = new JTextField(" La");
static JTextField text4;
private JTextField text55 = new JTextField(" Lb");
static JTextField text5;
private JTextField text66 = new JTextField(" Lc");
static JTextField text6;
public unLinkList() {
random();
init();
}
//函数random()用来随机生成链表La,Lb的大小
public void random() {
runFlag = false;
laSize = (int) (Math.random() * 7 + 3);
lbSize = (int) (Math.random() * 7 + 3);
}
public void init() {
String as[] = {
"void Union( LinkList & La,LinkList & Lb,LinkList & Lc)",
"{ // 链表La,Lb的元素都是按值递增排列",
" pa=La->next ; pb=Lb->next ; Lc=pc=La ;",
" while( pa && pb ) //链表La,Lb都不为空",
" {",
" if( pa->data==pb->data )",
" { pc->next=pa ;",
" pa=pa->next ; pb=pb->next ;}",
" else if ( pa->data<pb->data )",
" { pc->next=pa ; pa = pa->next ;}",
" else { pc->next=pb ; pb=pb->next; }",
" }",
" if ( !pa )",
" { pc->next = pb ; }",
" else { pc->next = pa ; } ",
"}"};
codePanel = new CodeAnimationPanel(as);
panel = new Panel();
panel.setLayout(new BorderLayout());
this.setLayout(new BorderLayout());
this.setBackground(Color.lightGray);
controlsPanel.delay = 900;
newButton = new JButton("新 建");
newButton.addActionListener(this);
runButton = new JButton("执 行");
runButton.addActionListener(this);
stepButton = new JButton("单 步");
stepButton.addActionListener(this);
stayButton = new JButton("暂 停");
stayButton.addActionListener(this);
newButton.setToolTipText("建立演示数据");
stayButton.setToolTipText("暂停演示");
runButton.setToolTipText("执行演示");
stepButton.setToolTipText("单步执行演示");
thePersonGroup = new unPersonGroup(laSize, lbSize, codePanel);
controlsPanel = new GlobalControls();
panel1 = new JPanel();
panel1.setLayout(new GridLayout(7, 2));
text1 = new JTextField(" ");
text2 = new JTextField(" ");
text3 = new JTextField(" ");
text4 = new JTextField(" ");
text5 = new JTextField(" ");
text6 = new JTextField(" ");
text77.setEditable(false);
text7.setEditable(false);
text11.setEditable(false);
text1.setEditable(false);
text22.setEditable(false);
text2.setEditable(false);
text33.setEditable(false);
text3.setEditable(false);
text44.setEditable(false);
text4.setEditable(false);
text55.setEditable(false);
text5.setEditable(false);
text66.setEditable(false);
text6.setEditable(false);
panel1.add(text77);
panel1.add(text7);
panel1.add(text11);
panel1.add(text1);
panel1.add(text22);
panel1.add(text2);
panel1.add(text33);
panel1.add(text3);
panel1.add(text44);
panel1.add(text4);
panel1.add(text55);
panel1.add(text5);
panel1.add(text66);
panel1.add(text6);
panel.add(codePanel, BorderLayout.NORTH);
panel.add(panel1, BorderLayout.CENTER);
this.add(panel, BorderLayout.EAST);
//启动线程runner
//start();
repaint();
}
public void paint(Graphics g) {
thePersonGroup.draw(g);
}
public void update(Graphics g) {
paint(g);
}
public void actionPerformed(ActionEvent actionevent) {
if (actionevent.getSource() == newButton) {
random();
runFlag = false;
thePersonGroup = new unPersonGroup(laSize, lbSize, codePanel);
runButton.setEnabled(true);
stepButton.setEnabled(true);
//启动线程runner
//start();
repaint();
}
else if (actionevent.getSource() == runButton) {
runFlag = true;
start();
}
else if (actionevent.getSource() == stepButton) {
stop();
runFlag = false;
thePersonGroup.union();
thePersonGroup.setDrawMode(1);
repaint();
if (thePersonGroup.getDoneFlag()) {
runFlag = false;
runButton.setEnabled(false);
stepButton.setEnabled(false);
JOptionPane.showConfirmDialog(this,
" 算法演示完成!\n 单击相关按钮重新开始\n",
"演示完成", JOptionPane.DEFAULT_OPTION);
stop();
}
}
else if (actionevent.getSource() == stayButton) {
runFlag = false;
}
}
// 启动线程runner
public void start() {
if (runner == null) {
runner = new Thread(this);
runner.start();
}
}
public void run() {
while (Thread.currentThread() == runner) {
if (runFlag) {
thePersonGroup.union();
thePersonGroup.setDrawMode(1);
repaint();
try {
controls = controlsPanel.delay;
if (controls <= 20)
controls = 20;
Thread.sleep(controls);
}
catch (InterruptedException _ex) {}
if (thePersonGroup.getDoneFlag()) {
runFlag = false;
runButton.setEnabled(false);
stepButton.setEnabled(false);
JOptionPane.showConfirmDialog(this,
" 算法演示完成!\n \n 单击相关按钮重新开始\n",
"演示完成", JOptionPane.DEFAULT_OPTION);
stop();
}
}
}
}
//终止线程
public void stop() {
if (runner != null) {
runner.yield();
runner = null;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -