7月22日的第十七天

这是c#数据结构一书中的一个例子,线性表。实现了一个接口IList,再基于这个接口创建一个SeqList的类,能实现c#中的List类的一般功能,增删,判空,判满,追加,得到某一项的索引,数组的长度,清空等。平常也经常使用List,但并不知道它内部实现的细节。通过这个小例子,想也更清晰了些。就是对在内存中有一块连续存储空间的数组进行操作的一个类。

  
  
  
  
  1. public interface IListDS<T>{  
  2.     int GetLength();  
  3.     void Clear();  
  4.     bool IsEmpty();  
  5.     void Append(T item);  
  6.     void Insert(T item,int i);  
  7.     T Delete(int i);  
  8.     T GetElem(int i);  
  9.     int Locate(T value);  
  10. }  
  11.  
  12. public class SeqList<T>:IListDS<T>{  
  13.     private int maxsize;  
  14.     private T[] data;  
  15.     private int last;  
  16.       
  17.     public T this[int index]{  
  18.         get{  
  19.             return data[index];  
  20.         }  
  21.         set{  
  22.             data[index]=value;  
  23.         }  
  24.     }  
  25.     public int Last{  
  26.         get{  
  27.             return last;  
  28.         }  
  29.           
  30.     }  
  31.     public int Maxsize{  
  32.         get{return maxsize;}  
  33.         set{maxsize=value;}  
  34.     }  
  35.     public SeqList(int size){  
  36.         data=new T[size];  
  37.         maxsize=size;  
  38.         last=-1;  
  39.     }  
  40.       
  41.     public int GetLength(){  
  42.         return last+1;  
  43.     }  
  44.     public void Clear(){  
  45.         last=-1;  
  46.     }  
  47.       
  48.     public bool IsEmpty(){  
  49.         if(last==-1){  
  50.             return true;  
  51.         }else{  
  52.             return false;  
  53.         }  
  54.     }  
  55.     public bool IsFull(){  
  56.         if(last==maxsize-1){  
  57.             return true;  
  58.         }else{  
  59.             return false;  
  60.         }  
  61.     }  
  62.       
  63.     public void Append(T item){  
  64.         if(IsFull){  
  65.             Console.WriteLine("List is full");  
  66.             return;  
  67.         }  
  68.         data[++last]=item;  
  69.     }  
  70.       
  71.     public void Insert(T item,int i){  
  72.         if(IsFull){  
  73.             Console.WriteLine("List is full");  
  74.             return;  
  75.         }  
  76.         if(i<1 || i>last+2){  
  77.             Console.WriteLine("Position is error");  
  78.             return;  
  79.         }  
  80.         if(i==last+2){  
  81.             data[last+1]=item;  
  82.         }  
  83.         else{  
  84.             for(int j=last;j>i-1;--j){  
  85.                 data[j+1]=data[j];  
  86.             }  
  87.             data[j-1]=item;  
  88.         }  
  89.         ++last;  
  90.     }  
  91.       
  92.     public T Delete(int i){  
  93.         T tmp=default(T);  
  94.         if(IsEmpty()){  
  95.             Console.WriteLine("List is empty");  
  96.             return tmp;  
  97.         }  
  98.         if(i<1 || i>last+1){  
  99.             Console.WriteLine("Position is error");  
  100.             return tmp;  
  101.         }  
  102.         if(i==last+1){  
  103.             tmp=data[last--];  
  104.         }else{  
  105.             tmp=data[i-1];  
  106.             for(int j=i;j<=last;++j){  
  107.                 data[j]=data[j+1];  
  108.             }  
  109.         }  
  110.         --last;  
  111.         return tmp;  
  112.     }  
  113.       
  114.     public T GetElem(int i){  
  115.         if(IsEmpty() || (i<1) || (i>last+1)){  
  116.             Console.WriteLine("List is empty or Position is error");  
  117.             return default(T);  
  118.         }  
  119.         return data[i-1];  
  120.     }  
  121.       
  122.     public int Locate(T value){  
  123.         if(IsEmpty()){  
  124.             Console.WriteLine("List is empty");  
  125.             return -1;  
  126.         }  
  127.         int i=0;  
  128.         for(i;i<=last;++i){  
  129.             if(value.Equals(data[i])){  
  130.                 break;  
  131.             }  
  132.         }  
  133.         if(i>last){  
  134.             return -1;  
  135.         }  
  136.         return i;  
  137.     }  
  138.       

如果说里面还有些不清晰的知识点那就是索引器,和泛型中使用的default关键字了。对于索引器,使用的还不够熟悉。default查了一下,如果T是引用类型,则返回null,如果T是数值类型,则返回零。

 

本文出自 “菜园里的小小鸟呀” 博客,谢绝转载!

你可能感兴趣的:(数据结构,泛型,C#,线性表)