程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> C#實現順序表

C#實現順序表

編輯:關於C#

這幾天需要實現各種數據結構(泛型).主要實現線性表和鏈表。

線性表是由n(n>=0)個相同類型的數據元素構成的有限序列。除第一個元素外,其余元素只有一個直接前驅;除最後一個元素外,其余元素只有一個直接後繼。

順序表是把表中元素一個接一個地放進一快地址連續的空間,因此順序表的實現有數組來完成。

由於這次需要實現多種數據結構,各種數據結構都有相同的方法,比如求長度,清空等。因此定義一個公共接口:

namespace DateStructrues
{
  public interface IDS<T>
  {
    int Count { get;}     //求長度
    void Clear(); //清空操作
    bool IsEmpty{get;}   //判斷線性表是否為空
  }
}

線性表接口:

namespace DateStructrues.Lists
{
  interface IListDS<T> : IDS<T>
  {
    void Append(T item); //附加操作
    void Insert(T item, int index); //插入操作
    T Delete(int index); //刪除操作
    T GetElement(int index); //取表元
    int Locate(T value); //按值查找
  }
}

實現順序表:

using System;
namespace DateStructrues.Lists
{
  public class SeqList<T> : IListDS<T> where T:IComparable<T>
  {
    #region Files
    T[] data; //數組,存入順序表
    int maxsize; //最大值
    int last; //最後一個元素
    #endregion

    #region Properties
    /// <value>
    /// 按索引訪問或設置data數組
    /// </value>
    /// <param name="index">索引值</param>
    /// <returns>泛型數組</returns>
    public T this[uint index]
    {
      get
      {
        return data[index];
      }
      set
      {
        data[index] = value;
      }
    }

    /// <value>
    /// 訪問或設置線性表最大容量
    /// </value>
    public int Maxsize
    {
      get
      {
        return maxsize;
      }
      set
      {
        maxsize = value;
      }
    }
    #endregion

    #region Constructions
    /// <summary>
    /// 無參構造器
    /// </summary>
    public SeqList() : this(20) { }
    /// <summary>
    /// 有參構造器
    /// </summary>
    /// <param name="size">數組初始大小</param>
    public SeqList(int size)
    {
      data = new T[size];
      maxsize = size;
      last = -1;
    }
    #endregion

    #region Methods
    /// <summary>
    /// 判斷線性表是否為滿
    /// </summary>
    public virtual bool IsFull
    {
      get
      {
        if (last == maxsize - 1)
        {
          return true;
        }
        else
        {
          return false;
        }
      }
    }

    /// <summary>
    ///重寫ToString方法,方便測試.測試完成,刪除該方法.
    /// </summary>
    /// <returns></returns>
    public override string ToString()
    {
      for (int i = 0; i <= last; ++i)
      {
        Console.WriteLine(data[i]);
      }
      return "OK";
    }

    /// <summary>
    /// 順序查找
    /// </summary>
    /// <param name="data"></param>
    /// <returns></returns>
    public virtual int SeqSearch(T key)
    {
      Insert(key, 1);
      int i=0;
      for (i = last; !key.Equals(data[i]); --i) ;
      return i;
    }
    #endregion

    #region IListDS<T> members
    /// <summary>
    /// 在線性表末尾添加一個元素
    /// 如果線性表已滿,退出
    /// 否則data[++last] = item
    /// </summary>
    /// <param name="item">要添加到線性表末尾的值</param>
    public virtual void Append(T item)
    {
      if (last == maxsize - 1)
      {
        Console.WriteLine("List is full");
      }
      data[++last] = item;
    }

    /// <summary>
    /// 對線性表進行插入操作
    /// </summary>
    /// <param name="item">要插入的值</param>
    /// <param name="index">線性表的索引值</param>
    public virtual void Insert(T item, int intLocation)
    {
      //判斷表是否滿
      if (last == maxsize - 1)
      {
        Console.WriteLine("List is full");
        return;
      }
      //判斷插入的位置是否正確
      else if ((intLocation < 1) || (intLocation > last + 2))
      {
        Console.WriteLine("Position is error!");
        return;
      }
      //在順序表的表尾插入數據元素
      else if (intLocation == last + 2)
      {
        data[intLocation - 1] = item;
      }
      //在表的其它位置插入數據元素
      else 
      {
        //移動元素
        for (int i = last; i >= intLocation - 1; --i)
        {
          data[i + 1] = data[i];
        }
        //將新的數據元素插入到第i個位置上
        data[intLocation - 1] = item;
        //修改表長
        ++last;
      }
    }

    /// <summary>
    /// 對線性表進行刪除操作
    /// </summary>
    /// <param name="index">要刪除元素的索引</param>
    /// <returns>被刪除的元素</returns>
    public virtual T Delete(int intLocation)
    {
      T result = default(T);
      //判斷順序表為空
      if (last == -1)
      {
        Console.WriteLine("List is empty");
        return result;
      }
      //判斷刪除的位置是否正確
      else if ((intLocation < 1) || (intLocation > last + 1))
      {
        Console.WriteLine("Position is error!");
        return result;
      }
      //刪除的是最後一個元素
      else if (intLocation == last + 1)
      {
        result = data[last--];
        return result;
      }
      //刪除的不是最後一個元素
      else
      {
        result = data[intLocation - 1];
        //元素移動
        for (int j = intLocation; j <= last; ++j)
        {
          data[j - 1] = data[j];
        }
      }
      --last; //修改表長
      return result;
    }

    /// <summary>
    /// 取出指定線性表索引位置的元素
    /// </summary>
    /// <param name="index"></param>
    /// <returns></returns>
    public virtual T GetElement(int intLocation)
    {
      T result = default(T);
      //判斷順序表為空
      if (last == -1)
      {
        Console.WriteLine("List is empty");
        return result;
      }
      //判斷刪除的位置是否正確
      else if ((intLocation < 1) || (intLocation > last + 1))
      {
        Console.WriteLine("Position is error!");
        return result;
      }
      return data[intLocation - 1];
    }

    /// <summary>
    /// 按給定元素在線性表中進行查找
    /// </summary>
    /// <param name="value">要查找的元素</param>
    /// <returns>查找結果的索引值</returns>
    public virtual int Locate(T value)
    {
      //判斷線性表是否為空
      if (last == -1)
      {
        Console.WriteLine("List is Empty");
        return -1;
      }
      int i = 0;
      //遍歷線性表進行查找
      for (i = 0; i <= last; ++i)
      {
        if (value.Equals(data[i]))
        {
          break;
        }
      }
      //線性表內沒有匹配元素
      if (i > last)
      {
        return -1;
      }
      return i;
    }

    /// <summary>
    /// 按索引更新線性表元素
    /// </summary>
    /// <param name="newItem">更新後的元素</param>
    /// <param name="intLocation">要更新的索引位置</param>
    public virtual void Update(T newItem, int intLocation)
    {
      //判斷線性表是否為空
      if (last == -1)
      {
        Console.WriteLine("List is Empty");
      }
      //判斷刪除的位置是否正確
      else if ((intLocation < 1) || (intLocation > last + 1))
      {
        Console.WriteLine("Position is error!");
      }
      else
      {
        data[intLocation - 1] = newItem;
      }
    }

    /// <summary>
    /// 按元素值更新線性表元素
    /// </summary>
    /// <param name="newItem">更新後的元素</param>
    /// <param name="oldItem">更新前的元素</param>
    public virtual void Replace(T newItem, T oldItem)
    {
      //判斷線性表是否為空
      if (last == -1)
      {
        Console.WriteLine("List is Empty");
      }
      int i = 0;
      //遍歷線性表進行查找
      for (i = 0; i <= last; ++i)
      {
        if (oldItem.Equals(data[i]))
        {
          data[i] = newItem;
        }
      }
      //線性表內沒有匹配元素
      if (i > last)
      {
        Console.WriteLine("List have no oldItem");
      }
    }
    #endregion

    #region IDS<T> members
    /// <summary>
    /// 獲取線性表長度
    /// </summary>
    public virtual int Count
    {
      get
      {
        return last + 1;
      }
    }
    /// <summary>
    /// 對線性表執行清空操作
    /// </summary>
    public virtual void Clear()
    {
      last = -1;
    }
    /// <summary>
    /// 判斷線性表是否為空
    /// </summary>
    /// <returns></returns>
    public virtual bool IsEmpty
    {
      get
      {
        if (last == -1)
        {
          return true;
        }
        else
        {
          return false;
        }
      }
    }
    #endregion
  }
}

剛完成,還未經過測試.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved