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

C#順序表,

編輯:C#入門知識

C#順序表,


1 數據是外部世界的載體,能夠被計算機處理加工。2數據元素是數據的基本單位,如,學生的姓名、性別、班級等等。

3數據對象是數據的一個集合,如 人類,狗類,等等屬於數據對象,對象裡又有數據元素

4數據類型,如整形,字符串,結構體等等,

5.數據結構通常分為4種,5.1集合 如HashSet<T>類主要是設計用來做高性能集運算的,(交集、並集、差集)

後續再談HashSet<>.

5.2線性結構 數據元素從在一對一的關系 如 數組、list<>、Stack<>、Queue<>

5.3樹形結構,如二叉樹等等。圖形結構,以後再說

第一天主要學習順序表,保存線性表的方式就是把表中的元素一個接一個的放進順序的存儲單元,這就是線性表的順序存儲。在內存中用一塊地址連續的存儲空間一次存放數據元素,稱為順序表。如圖

//自己實現順序表
    public class SeqList<T> //: IList<T>
    {
        private int maxsize; //順序表的容量

        public int Maxsize
        {
            get { return maxsize; }
        }
        private T[] data; //數組,用於存儲順序表中的數據元素
        private int last; //指示順序表最後一個元素的位置下標

        public int Last
        {
            get { return last; }
            set { last = value; }
        }

        // 索引器
        public T this[int index]
        {
            get { return data[index]; }
            set { data[index] = value; }
        }

        public SeqList( int size )
        {
            data = new T[size];
            maxsize = size;
            last = - 1;
        }
        // 順序表的長度由於數組是 0 基數組,即數組的最小索引為 0,所以,順序表的長度就是數
        // 組中最後一個元素的索引 last 加 1。
        public int GetLength()
        {
            return last + 1;
        }
        // 清空
        public void Clear( )
        {
            last = -1;
        }

        public bool IsEmpty( )
        {
            if ( last < 0 )
            {
                return true;
            }
            return false;
        }
        // 判斷順序表是否已滿
        public bool IsFull( )
        {
            if ( last == maxsize - 1 )// 元素下標從0開始
            {
                return true;
            }
            return false;
        }
        // 在順序表末尾添加新元素
        public void Appled(T item)
        {
            if ( !IsFull( ) )
            {
                data[++last] = item;
            }
            else
            {
                Console.WriteLine(" 順序表已滿無法添加 ");
            }
        }
        //在順序表的第i個數據元素的位置插入一個數據元素
        /*
            算法的時間復雜度分析:順序表上的插入操作,時間主要消耗在數據的移動
        上,在第i個位置插入一個元素,從ai到an都要向後移動一個位置,共需要移動n-i+1
        個元素,而i的取值范圍為 1≤i≤n+1,當i等於 1 時,需要移動的元素個數最多,
        為n個;當i為n+1 時,不需要移動元素。設在第i個位置做插入的概率為pi,則平
        均移動數據元素的次數為n/2。這說明:在順序表上做插入操作平均需要移動表
        中一半的數據元素,所以,插入操作的時間復雜度為O(n)。
         */
        public void Insert(T item, int i)
        {
            if ( i < 1 || i > last + 1 )
            {
                Console.WriteLine(" 位置非法 ");
                return;
            }
            if ( IsFull() )
            {
                Console.WriteLine(" 順序表已滿無法添加 ");
                return;
            }
            if (i == last + 2)// 判斷是不是末尾插入
            {
                data[ last + 1 ] = item;
            }
            else
            {
                // i後面的元素往後移
                for (int j = last; j >= i - 1; --j  )
                {
                    data[j + 1] = data[j];
                }
                //將新的數據元素插入到第i-1個位置上
                data[i - 1] = item; 
            }
            ++last;
        }
        //刪除順序表的第i個數據元素
        /*
         而i的取值范圍為 1≤i≤n,當i等於 1 時,需要移動
        的元素個數最多,為n-1 個;當i為n時,不需要移動元素。設在第i個位置做刪除
        的概率為pi,則平均移動數據元素的次數為(n-1)/2。這說明在順序表上做刪除操
        作平均需要移動表中一半的數據元素,所以,刪除操作的時間復雜度為O(n)
         */
        public T Delete(int i)
        {
            T temp = default(T);// default 為泛型代碼中的默認關鍵字
            if ( IsEmpty( ) )
            {
                Console.WriteLine("順序表為空");
                return temp;
            }
            if (i < 1 || i > last + 1 )
            {
                Console.WriteLine(" 位置非法 ");
                return temp;
            }
            if ( i == last + 1 )
            {
                data[last--] = temp;
            } 
            else
            {
                temp = data[i - 1];
                for (int j = i; j <= last; ++j )
                {
                    data[j] = data[j - 1];
                }
            }
            --last;
            return temp;
        }

        //獲得順序表的第i個數據元素
        public T GetElem(int i)
       { 
            if ( IsEmpty( ) || (i < 1) || ( i > last + 1 ) ) 
            { 
                Console.WriteLine("順序表為空 or 位置非法!"); 
                return default(T); 
            } 
            return data[i-1]; 
        } 
        //在順序表中查找值為value的數據元素
        public int Locate(T value)
        {
            if (IsEmpty( ))
            {
                Console.WriteLine("順序表為空");
                return -1;
            }
            for (int j = 0; j < last; ++j )
            {
                if ( data[j].Equals( value) )
                {
                    return j;
                }
            }
            return -1;
        }
        /*
         算法的時間復雜度分析:順序表中的按值查找的主要運算是比較,比較的次
        數與給定值在表中的位置和表長有關。當給定值與第一個數據元素相等時,比較
        次數為 1;而當給定值與最後一個元素相等時,比較次數為 n。所以,平均比較
        次數為(n+1)/2,時間復雜度為 O(n)
         */
        public void Reverse()
        {
            T temp = default(T);
            int len = GetLength();
            for (int i = 0; i <= len >> 1; ++i)
            {
                temp = data[i];
                data[i] = data[len - i];
                data[len - i] = temp;
            }
        }
    }

 

List<T>他是表示通過索引訪問的對象的強制類型列表。提供搜索、排序、插入、刪除等操做

通過學習線性表我們知道了,List<T>實現了順序表的功能,但List<T>是一個動態存儲數據的鏈表,這就是順序表的缺點,明天我們學習單鏈表

本人希望和各位較多,互相想學習,下面簡單介紹List<>

作用:
泛型最常見的用途是泛型集合
我們在創建列表類時,列表項的數據類型可能是int,string或其它類型,如果對列表類的處理方法相同,
就沒有必要事先指定數據類型,留待列表類實例化時再指定。相當於把數據類型當成參數,這樣可以最
大限度地重用代碼,保護類型的安全以及提高性能。

 

List的一般用法
所屬命名空間: System.Collections.Generic
public class List<T>:IList<T>,Icollection<T>,IEnumerable<T>,IList,Icollection,Ienumerable
List<T>是ArrayList類的泛型等效類,該類使用大小可按需動態增加的數組實現IList<T>泛型接口

 

(1)聲明 List<T>mlist = new List<T>();
 eg: string[] Arr = {"a","b","c"};
     List<string> mlist = new List<string>(Arr);

 

(2)添加一個元素 List.Add(T item) 
   eg: mlist.Add("d");

 

(3)添加集合元素
   eg: string[] Arr2 ={"f","g"."h"};
       mlist.AddRange(Arr2);

 

(4)在index位置添加一個元素 Insert(int index,T item)
   eg: mlist.Insert(1,"p");

 

(5)遍歷List中元素

  foreach(T element in mlist) T的類型與mlist聲明時一樣
     {
       Console.WriteLine(element);
          }

    eg:
    foreach(string s in mlist)
          {
             Console.WriteLine(s);
           }

 

(6)刪除元素

    List.Remove(T item) 刪除一個值
    eg: mlist.Remove("a");

    List.RemoveAt(int index);刪除下標為index的元素
    eg: mlist.RemoveAt(0);
    
    List.RemoveRange(int index,int count); 下標index開始,刪除count個元素
    eg:mlist.RemoveRange(3,2);

 

 

(7)判斷某個元素是否在該List中

    List.Contains(T item) 返回true或false
    eg:
    if(mlist.Contains"("g"))
       Console.WriteLine("g存在列表中");
    else
       mlist.Add("g");

 

(8)給List裡面元素排序 List.Sort() 默認是元素每一個字母按升序
   eg: mlist.Sort();

 

(9)給List裡面元素順序反轉 List.Reverse() 可以與List.Sort()配合使用

 

(10)List清空 List.Clear()
   eg: mlist.Clear();

(11)獲得List中元素數目 List.Count() 返回int值
   eg: mlist.count();

 


List進階,強大方法

 

(1)List.FindAll方法:檢索與指定謂詞所定義的條件相匹配的所有元素 
    
    class program
    {
       static void Main(stirng[] args)
       {
         student stu = new student();
         stu.Name="arron";
         List<student> students= new List<student>();
         students.Add(stu);
         students.Add(new student("candy"));
         FindName myname = new FindName("arron");
         foreach(student s in students.FindAll(new Predicate<student>(myname.IsName)))
         { Console.WriteLine(s);}
       }

    public class student
    {
       public string Name{get;set;}
       public student(){}
       public override string ToString()
        {
            return string.Format("姓名:{0}",Name);
         }
     }

    public class FindName
    {
      private string _name;
      public FindName(string Name)
      {  this._name=Name;}
      public bool IsName(student s)
       { return (s.Name==_name)?true:false;}
    }

 


(2)List.Find方法 搜索與指定謂詞所定義的條件相匹配的元素,並返回整個List中的第一個匹配元素

  eg:

    //Predicate是對方法的委托,如果傳遞給它的對象與委托定義的條件匹配,則該方法返回true,當前List的元素
  被逐個傳遞給Predicate委托,並在List中間前移動,從第一個元素開始,到最後一個元素結束,當找到匹配項
  時處理停止

  第一種方法 委托給拉姆達表達式:
  eg:  
     string listFind = mlist.Find(name=>
       {
          if(name.length>3)
             return true;
          return false;
       });

    第二種方法 委托給一個函數
    eg:
     public bool ListFind(string name)

        {

            if (name.Length > 3)

            {

                return true;

            }

            return false;

        }

      這兩種方法的結果是一樣的

 

 

(3) List.FindLast方法  public T FindLast(Predicate<T> match);確定是否 List 中的每個元素都與指定的謂詞所定義的條件相匹配。用法與List.Find相同。


(4) List.TrueForAll方法:  確定是否 List 中的每個元素都與指定的謂詞所定義的條件相匹配。

 public bool TrueForAll(Predicate<T> match);

 

(5) List.Take(n):  獲得前n行 返回值為IEnumetable<T>,T的類型與List<T>的類型一樣

E.g.:

IEnumerable<string> takeList=  mList.Take(5);

          foreach (string s in takeList)

          {

              Console.WriteLine("element in takeList: " + s);

          }

       這時takeList存放的元素就是mList中的前5個

 

(6) List.Where方法:檢索與指定謂詞所定義的條件相匹配的所有元素。跟List.FindAll方法類似。

E.g.:

            IEnumerable<string> whereList = mList.Where(name =>

                {

                    if (name.Length > 3)

                    {

                        return true;

                    }

                    else

                    {

                        return false;

                    }

                });

         foreach (string s in subList)

         {

             Console.WriteLine("element in subList: "+s);

         }

         這時subList存儲的就是所有長度大於3的元素

 

 

(7)List.RemoveAll方法:移除與指定的謂詞所定義的條件相匹配的所有元素。

public int RemoveAll(Predicate<T> match);

E.g.:

            mList.RemoveAll(name =>

                {

                    if (name.Length > 3)

                    {

                        return true;

                    }

                    else

                    {

                        return false;

                    }

                });

            foreach (string s in mList)

            {

                Console.WriteLine("element in mList:     " + s);

            }

      這時mList存儲的就是移除長度大於3之後的元素。

 

 參考之 http://www.cnblogs.com/ustc_msra_ase/articles/1890395.html

 

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