用Java實現線性表的順序存儲結構

本文使用Java實現線性表的順序存儲結構,雖然Java提供了動態數組ArrayList,但是自己動手做做是不一樣的,歡迎交流想法!

一、源代碼

在Eclipse中新建一個Java project,包括兩個java源文件,SqList.java和SqListTest.java。

// SqList.java

/**

 * 線性表的動態分配順序存儲結構

 *

 * @author YangYong

 *

 */

public classSqList<T> {

  private final int LIST_INT_SIZE = 10; // 線性表存儲空間的初始分配量

  private Object[] elem = null; // 存儲空間基址

  private int size; // 當前表長

 

  /**

   * 操作結果:構造一個空的順序表

   */

  public SqList() {

     this.elem = new Object[LIST_INT_SIZE];// 存儲分配

     this.size = 0;// 空表長度爲0

  }

 

  /**

   * 初始條件:順序表L已存在操作結果:銷燬順序表

   *

   * @param L

   *           待銷燬的順序表

   * @return null

   */

  public SqList<T> destoryList(SqList<T> L) {

     // 提醒GC工作

     L = null;

     return L;

  }

 

  /**

   * 初始條件:順序表已存在操作結果:將順序表置爲空表

   */

  public void clearList() {

     // 提醒GC工作

     for (int i = 0; i < elem.length; i++)

       elem[i] = null;

     this.size = 0;

  }

 

  /**

   * 初始條件:順序表已存在

   *

   * @return操作結果:若順序表爲空,則返回true,否則返回false

   */

  public boolean listEmpty() {

     return this.size == 0;

  }

 

  /**

   * 初始條件:順序表已存在

   *

   * @return操作結果:返回順序表中元素個數

   */

  public int listSize() {

     return this.size;

  }

 

  /**

   * 初始條件:順序表已存在操作結果:將順序表空間擴充爲原來的2

   */

  private void expandCapacity() {

     // 擴充存儲空間位原來的2

     Object[]temp= newObject[this.size * 2];

     // 複製原有的順序表

     int i;

     for (i = 0; i < this.size; i++) {

       temp[i] = this.elem[i];

       // 提醒GC工作

       this.elem[i] = null;

     }

     // 提醒GC工作

     this.elem = null;

     this.elem = temp;

  }

 

  /**

   * 初始條件:順序表已存在操作結果:將一個元素添加到順序表尾,表長加1

   *

   * @param e

   *           待添加的元素

   */

  public void add(T e) {

     if (this.size == this.elem.length) {

       // 擴充存儲空間位原來的2

       this.expandCapacity();

       this.elem[this.size++] = e;

     }else

       this.elem[this.size++] = e;

  }

 

  /**

   * 初始條件:順序表已存在,1<=i<=length

   *

   * @param i

   * @return順序表中第i個元素的值

   */

  @SuppressWarnings("unchecked")

  public T getElem(int i) {

     if (i >= 1 && i <= this.size) {

       return (T) elem[i - 1];

     }else

       return null;

  }

 

  /**

   * 初始條件:順序表已存在,1<=i<=length+1 操作結果:在順序表中第i個位置之前插入新元素e,表長加1

   *

   * @param i

   * @param e

   * @return插入成功返回true,否則返回false

   */

  public boolean listInsert(int i, T e) {

     int j;

     if (i >= 1 && i <= this.size + 1) {

       if (this.size == this.elem.length) {

         // 擴充存儲空間位原來的2

         this.expandCapacity();

         // 移動原有元素

         for (j = this.size; j >= i; j--)

            this.elem[j] = this.elem[j - 1];

         this.elem[i - 1] = e; // 插入新元素

         this.size++; // 表長加1

       }else{

         // 移動原有元素

         for (j = this.size; j >= i; j--)

            this.elem[j] = this.elem[j - 1];

         this.elem[i - 1] = e; // 插入新元素

         this.size++; // 表長加1

       }

       return true;

     }else

       return false;

  }

 

  /**

   * 初始條件:順序表已存在且非空,1<=i<=length 操作結果,刪除順序表的第i個元素,並返回其值,表長減1

   *

   * @param i

   * @return

   */

  @SuppressWarnings("unchecked")

  public T listDelete(int i) {

     Objecttemp= null;

     int j;

     if (!this.listEmpty() &&(i >= 1&& i <= this.size)) {

       temp = this.elem[i - 1];

       for (j = i; j < this.size; j++)

         this.elem[j - 1] = this.elem[j];

       this.elem[this.size - 1] = null;

       this.size--;

     }

     return (T) temp;

  }

 

  /**

   * 初始條件:順序表已存在操作結果:遍歷順序表

   *

   * @return遍歷結果

   */

  public String traversalList(){

     Stringresult= newString();

     for (Object temp : this.elem)

       result += temp + " ";

     return result;

  }

}


// SqListTest.java

 

/**

 * 測試SqList<T>

 *

 * @author YangYong

 *

 */

import javax.swing.*;

import java.awt.BorderLayout;

import java.awt.Font;

import java.awt.GridLayout;

import java.awt.Toolkit;

import java.awt.event.*;

 

public classSqListTest {

  private JFrame frame = null;

  private JPanel[] panel = null;

  private JScrollPane sc = null;

  private JButton[] button = null;

  private JLabel[] label = null;

  private JTextField[] textField = null;

  private JTextArea textArea = null;

  SqList<Integer>list= null;

 

  public static void main(String[] args) {

     newSqListTest().myHandler();

  }

 

  public SqListTest() {

     frame = new JFrame("順序表的基本操作");

     frame.setLayout(new GridLayout(2, 1));

     int i;

     panel = new JPanel[2];

     button = new JButton[10];

     label = new JLabel[4];

     textField = new JTextField[4];

     for (i = 0; i < textField.length; i++) {

       textField[i] = new JTextField();

       textField[i].setFont(new Font(Font.DIALOG, Font.BOLD, 15));

     }

     textArea = new JTextArea();

     textArea.setFont(new Font(Font.DIALOG, Font.BOLD, 15));

     textArea.setEditable(false);

     panel[0] = new JPanel();

     panel[0].setLayout(new GridLayout(6, 3));

     button[0] = new JButton("順序表初始化");

     panel[0].add(button[0]);

     button[1] = new JButton("銷燬順序表");

     panel[0].add(button[1]);

     button[2] = new JButton("順序表置空");

     panel[0].add(button[2]);

     button[3] = new JButton("順序表判空");

     panel[0].add(button[3]);

     button[4] = new JButton("求表長");

     panel[0].add(button[4]);

     button[5] = new JButton("遍歷順序表");

     panel[0].add(button[5]);

     label[0] = new JLabel("添加的元素值:");

     button[6] = new JButton("添加元素");

     panel[0].add(label[0]);

     panel[0].add(textField[0]);

     panel[0].add(button[6]);

     label[1] = new JLabel("取的位置:");

     button[7] = new JButton("取元素");

     panel[0].add(label[1]);

     panel[0].add(textField[1]);

     panel[0].add(button[7]);

     label[2] = new JLabel("插入的元素值(插入位置輸入取的位置文本框中)");

     button[8] = new JButton("插入元素");

     panel[0].add(label[2]);

     panel[0].add(textField[2]);

     panel[0].add(button[8]);

     label[3] = new JLabel("刪除位置:");

     button[9] = new JButton("刪除元素");

     panel[0].add(label[3]);

     panel[0].add(textField[3]);

     panel[0].add(button[9]);

     panel[1] = new JPanel();

     panel[1].setLayout(new BorderLayout());

     sc = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);

     panel[1].add(sc);

     frame.add(panel[0]);

     frame.add(panel[1]);

     int width, height;

     width = Toolkit.getDefaultToolkit().getScreenSize().width;

     height = Toolkit.getDefaultToolkit().getScreenSize().height;

     frame.setBounds((width - 1000) >>> 2,(height- 808) >>> 2, 1000, 808);

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

     frame.setResizable(false);

     frame.setVisible(true);

  }

 

  public void myHandler() {

     button[0].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         list = new SqList<>();

         textArea.append("\n初始化成功!");

       }

     });

     button[1].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         list = list.destoryList(list);

         textArea.append("\n銷燬成功!");

       }

     });

     button[2].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         try {

            list.clearList();

            textArea.append("\n置空成功!");

         }catch(NullPointerException e1) {

            textArea.append("\n空指針異常!");

         }

       }

     });

     button[3].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         try {

            if (list.listEmpty())

              textArea.append("\n順序表爲空!");

            else

              textArea.append("\n順序表非空!");

         }catch(NullPointerException e1) {

            textArea.append("\n空指針異常!");

         }

       }

     });

     button[4].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         try {

            textArea.append("\n表長爲:" + list.listSize());

         }catch(NullPointerException e1) {

            textArea.append("\n空指針異常!");

         }

       }

     });

     button[5].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         try {

            textArea.append("\n遍歷結果爲:" + list.traversalList());

         }catch(NullPointerException e1) {

            textArea.append("\n空指針異常!");

         }

       }

     });

     button[6].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         try {

            int t = Integer.valueOf(textField[0].getText());

            list.add(t);

            textArea.append("\n添加成功!");

         }catch(NumberFormatException e1) {

            textArea.append("\n數據格式不對!");

         }catch(NullPointerException e1) {

            textArea.append("\n空指針異常!");

         }

       }

     });

     button[7].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         try {

            int t = Integer.valueOf(textField[1].getText());

            Objectobj= list.getElem(t);

            if (obj != null)

              textArea.append("\n讀取成功!數據爲:" + obj);

            else

              textArea.append("\n讀取位置不合法!");

         }catch(NumberFormatException e1) {

            textArea.append("\n數據格式不對!");

         }catch(NullPointerException e1) {

            textArea.append("\n空指針異常!");

         }

       }

     });

     button[8].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         try {

            int t1 = Integer.valueOf(textField[1].getText());

            int t2 = Integer.valueOf(textField[2].getText());

            if (list.listInsert(t1, t2))

              textArea.append("\n插入成功!");

            else

              textArea.append("\n插入失敗!");

         }catch(NumberFormatException e1) {

            textArea.append("\n數據格式不對!");

         }catch(NullPointerException e1) {

            textArea.append("\n空指針異常!");

         }

       }

     });

     button[9].addActionListener(new ActionListener() {

       @Override

       public voidactionPerformed(ActionEvent e) {

         try {

            int t = Integer.valueOf(textField[3].getText());

            Objectobj= list.listDelete(t);

            if (obj != null)

              textArea.append("\n刪除成功!數據爲:" + obj);

            else

              textArea.append("\n刪除位置不合法!");

         }catch(NumberFormatException e1) {

            textArea.append("\n數據格式不對!");

         }catch(NullPointerException e1) {

            textArea.append("\n空指針異常!");

         }

       }

     });

  }

}

二、運行結果與測試


程序啓動

測試


發佈了42 篇原創文章 · 獲贊 65 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章