using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ListMethod { //一旦定义了接口,实现接口的派生类中必须实现接口中定义的所有成员,一个都不能少。 public interface IListDS<T> { int GetLength(); void Clear(); bool IsEmpty(); void Append(T item); void Insert(T item, int i); T Delete(int i); T GetElem(int i); int Locate(T value); } public class seqList<T>:IListDS<T> { private int maxsize;//顺序表的容量 private T[] data;//数组,用于存储顺序表中的数据元素 private int last;//如果顺序表中有数据元素时,last的变化范围是0到maxsize-1,如果顺序表为空,last=-1 //定义一个索引器 public T this[int index] { get { return data[index]; } set { data[index] = value; } } //容量属性 public int Maxsize { get { return maxsize; } set { maxsize = value; } } //最后一个数据元素位置属性 public int Last { get { return last; } set { last = value; } } //顺序表长度属性 public int Length { get { return last + 1; } } //构造器 public seqList(int size) { data = new T[size]; maxsize = size; last = -1; } //给出接口的所有成员的实现 public int GetLength() { return last+1; } public void Clear() { last = -1; } public bool IsEmpty() { if (last == -1) return true; else return false; } public bool IsFull() { if (last == maxsize - 1) return true; else return false; } public void Append(T item) { if (IsFull()) Console.WriteLine("The list is full, you can't add new element to it anymore!"); else //注意这里的++last,先自加1,是表的长度新扩展一个元素的空间,再把该数据添加进去 data[++last] = item; } public T GetElem(int i) { if (IsEmpty()) { Console.WriteLine("The list is empty"); return default(T); } if (i < 1 || i > last + 1) { Console.WriteLine("The position is wrong"); return default(T); } else return data[i - 1]; } public T Delete(int i) { //default关键字主要用于泛型中,返回一个原始值。 //如果泛型被替换为string,返回一个空字符串。如果替换为int型,返回0;如果替换为对象,返回null。 T temp = default(T); if (this.IsEmpty()) { Console.WriteLine("the list is empty"); return temp; } else if(i<1||i>last+1) { Console.WriteLine("the delete position is wrong!"); return temp; } else if (i == last + 1) { //注意这里的last--,先使用,把这个元素取出后,通过last--使表长减1,即使清除不用的那个元素空间 temp = data[last--]; } else { temp = data[i - 1]; for (int j = i-1; j <= last; ++j) { data[j] = data[j + 1]; } } //总的结果,表长减1,返回被删除元素 --last; return temp; } //在顺序表的第i个数据元素的位置插入一个数据元素 //在第i个位置插入,实质就是在下标为i-1的位置插入 public void Insert(T item, int i) { if (IsFull()) { Console.WriteLine("The list is full"); return; } //last是个下标,i>last+2表示既超出了数组的长度,又不能是Append方法的重复 if (i < 1 || i > last + 2) { Console.WriteLine("The insert position is wrong"); return; } if(i==last+2) { data[last + 1] = item; } else { //把要插入的第i个位置以后的元素,依次向后移动一位 /* * for(int j=last;j>=i;j--) { data[j]=data[j-1]; } */ //上面的循环方式与下面的是不同的, //当j=last时,data[j+1]即为data[last+1], //隐含地将数组存放元素的位置向后增加一位, //从而给后续的移动提供空间。 for (int j = last; j >= i-1; --j) { data[j + 1] = data[j]; } data[i - 1] = item; } ++last; } public int Locate(T item) { if(IsEmpty()) { Console.WriteLine("The list is empty"); return -1; } int i; for (i = 0; i <= last; i++) { if (item.Equals(data[i])) { break; } } if(i>last) { return -1; } return i; } public override string ToString() { return base.ToString(); } } class Program { static void Main(string[] args) { seqList<int> SqL1 = new seqList<int>(10); //Random rdm = new Random(5); //int myint = rdm.Next(1, 10); //Console.WriteLine("{0}", myint); Console.WriteLine("The defined list is:"); for (int i = 1; i < SqL1.Maxsize; i++) { SqL1[i] = i; Console.Write("{0} ", SqL1[i]); ++SqL1.Last; } Console.WriteLine(); Console.WriteLine("The list's last index is {0}", SqL1.Last); SqL1.Insert(23, 15); SqL1.Append(11); for (int j = 1; j < SqL1.Maxsize; j++) { Console.Write("{0} ", SqL1[j]); } Console.ReadKey(); } } } /*定义一个索引符,索引符是一种特殊的属性,可以把它添加到类中,以提供类似于数组的访问.实际上,可以通过索引符来提供更加复杂的访问,因为我们可以定义和使用复杂的参数类型和方括号语法. 最常见的一个用法是: 对项执行简单的数字索引:*/ //Public class Animals:CollectionBase //{ // public Animal this[int animalIndex] // { // get // { // return (Animal)List[animalIndex]; // } // set // { // List[animalIndex] = value; // } // } // } /*this关键字与方括号中的参数一起使用,访问索引符时,将使用对象名,后跟放在方括号中的索引参数, 例如: myanimals[0] 在这里,对List属性使用一个索引符(即在IList接口上,可以访问CollectionBase中的ArrayList,ArrayList存储了项。*/