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

📄 unpersongroup.java

📁 本软件是使用java 开发的
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -