using System; using System.Collections.Generic; using System.Text; namespace 线性结构 { /* 作者:it小金 */ //线性表接口 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;//顺序表最大的容量 public T[] data;//数组,存储顺序表中的数据元素 private int last;//指示顺序表最后一个元素的下标 public T this[int index]//索引器 { get { return data[index]; } set { data[index] = value; } } public int Last { get { return last; } } public int Maxsize { get { return maxsize; } set { maxsize = value; } } 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 (this.IsFull()) { Console.WriteLine("此顺序表已满,不可在进行插入操作"); } else { last = last + 1; data[last] = item; } } //在顺序表的第i个数据元素的位置插入一个数据元素 public void Insert(T item, int i) { if (IsFull()) { Console.WriteLine("线性表已满"); return; } if(i<1 || i>last+2)//这里的位置指的是逻辑位置,因为data[0]就是第一个位置,所以i不能比1还要小,last代表最后一个元素的下标,而实际位置是last+1,所以last+2就是在已有位置后新增的一个,所以不能在大于它了 { Console.WriteLine("插入位置错误!"); return; } if (i == last + 2)//此时是顺序表的表尾(实际的位置,因为没添加前表尾是last+1) { data[i-1] = item; } else { for (int j =last; j >=i-1;j--) { data[j + 1] = data[j]; } data[i-1] = item; } ++last; } //删除顺序表的第i个数据元素 public T Delete(int i) { T tmp = default(T); if (this.IsEmpty())//判断顺序表是否为空 { Console.WriteLine("此表为空,不能在进行删除操作"); return default(T); } if (i < 1 || i > last + 1)//判断删除位置是否正确 { Console.WriteLine("删除位置不正确"); return tmp; } if (i == last + 1)//删除最后一个位置上的元素 { last = last - 1; tmp = data[last]; return tmp; } else { for (int j = i; j < last + 1; j++) { data[j] = data[j + 1]; } tmp = data[last - 1]; last = last = 1; return tmp; } } //获得顺序表的第i个数据元素 public T GetElem(int i) { if (IsEmpty() || (i<1) || (i>last+1)) { Console.WriteLine("表为空或查找位置不存在"); return default(T); } return data[i-1]; } //在顺序表中查找值为value的数据元素 public int Locate(T value) { if (IsEmpty()) { Console.WriteLine("表为空!"); return -1; } int i = 1; for (i = 1; i <= last+1; ++i) { if (value.Equals(data[i-1])) { break; } } if (i > last) { return -1; } return i; } } class Program { static void Main(string[] args) { SeqList<string> sl = new SeqList<string>(5); Console.WriteLine("顺序表最大长度为:"+sl.Maxsize.ToString());//顺序表最大长度 sl.Append("a"); sl.Append("c"); sl.Append("d"); sl.Insert("b", 2);//在第二个位置上添加元素"b" for (int i = 0; i <= sl.Last; i++) { Console.WriteLine("第{0}个元素是:"+sl.data[i].ToString(),i+1); } Console.WriteLine("删除元素后的表内容"); sl.Delete(4);//删除第四个元素"d",此时应该剩下a,b,c三个原色 for (int i = 0; i <= sl.Last; i++) { Console.WriteLine("第{0}个元素是:" + sl.data[i].ToString(), i + 1); } Console.WriteLine("取出第2个元素:{0}", sl.GetElem(2).ToString()); Console.WriteLine("查找'b'在表中实际位置:"+sl.Locate("b")); Console.ReadLine(); } } }