⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unlinklist.java

📁 本软件是使用java 开发的
💻 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 + -