线性表的实现
实现线性表的基本操作,以c#接口的形式表示线性表,接口中的方法成员表示基本操作。为了,使线性表对任何数据类型都适用,数据元素的类型都使用泛型的类型参数。在实际创建线性表时,元素的实际类型可以用应用程序中任何方便的数据类型来代替,比如用简单的整型或者用户自定义的更复杂的类型来代替。
线性表的接口如下所示:
/// <summary> /// 线性表接口,使用泛型 /// </summary> /// <typeparam name="T"></typeparam> public interface IListDS<T> { int GetLength();//求长度 void Clear();//清空操作 bool IsEmpty();//判断线性表表是否为空 bool IsFull();//判断顺序表是否为满 void Append(T item);//附加操作 void Insert(T item, int i);//插入操作 T Delete(int i);//删除操作 T GetElem(int i);//去元素 int Locate(T value);//按值查找 void showDataArray();//返回数组 /// <summary> /// 将线性表元素进行倒置 /// </summary> void Reverse(); }
线性表类SeqList<T>的实现如下:
public class SeqList<T> : IListDS<T> { private int maxsize;//线性表的容量 private T[] data;//数组,用于存储顺序表中的数据元素 private int last;//指示顺序表最后一个元素的位置 /// <summary> /// 索引器 /// </summary> /// <param name="index"></param> /// <returns></returns> public T this[int index] { get { return data[index]; } set { data[index] = value; } } /// <summary> /// 最后一个元素的位置属性 /// </summary> public int Last { get { return last; } } /// <summary> /// 容量属性 /// </summary> 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 false; return true; } public bool IsFull() { if (last == maxsize - 1) return true; else return false; } public void Append(T item) { if (IsFull()) { Console.WriteLine("List is full"); return; } else { data[++last] = item; } } public void Insert(T item, int i) { if (IsFull()) { Console.WriteLine("List is full"); return; } else if (i < 1 || i > last + 2) { Console.WriteLine("Position is error"); return; } if (i == last + 2)//在顺序表的表尾插入元素 { data[i-1] = item; } else { //在其他位置插入元素 //元素移动 for (int j = last; j >= i - 1; --j) { data[j + 1] = data[j]; } //将新的元素插入第i个位置上 data[i-1] = item; } //修改表长 ++last; } public T Delete(int i) { T tmp = default(T); //判断表是否为空 if (IsEmpty()) { Console.WriteLine("List is empty"); return tmp; } if (i < 1 || i > last + 1) { Console.WriteLine("Position is error!"); return tmp; } //删除的是最后一个元素 if (i == last + 1) { tmp = data[last--]; data[i-1] = default(T); return tmp; } else//删除的不是最后一个元素 { tmp = data[i - 1]; for (int j = i-1; j <=last; ++j) { data[j] = data[j + 1]; } } --last; return tmp; } public T GetElem(int i) { if (IsEmpty() || i < 1 || i > last + 1) { Console.WriteLine("List is empty or position is error!"); return default(T); } return data[i-1]; } public int Locate(T value) { if (IsEmpty()) { 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; } public void showDataArray() { Console.WriteLine("dataArray item is:"); foreach (T i in data) { Console.Write(i + " "); } Console.WriteLine(); } public void Reverse() { T tmp = default(T); int len = GetLength()-1; for (int i = 0; i<=len / 2; ++i) { tmp = data[i]; data[i] = data[len - i]; data[len - i] = tmp; } } }
主函数简单的调用:
static void Main(string[] args) { IListDS<int> list = new SeqList<int>(5); list.Append(1); list.Append(2); list.Append(3); list.Append(4); list.Append(5); //list.Append(6); // int length = list.GetLength(); // Console.WriteLine("the length is:"+length); // list.dataArray(); // Console.WriteLine("Insert array operate"); // list.Insert(4, 4); // Console.WriteLine("After insert the length is:" + list.GetLength()); // list.dataArray(); // Console.WriteLine("Delete operate"); // Console.WriteLine("After Delete the length is:" + list.GetLength()); //int d= list.Delete(3); //Console.WriteLine("删除的元素为:"+d); // list.dataArray(); list.showDataArray(); list.Reverse(); list.showDataArray(); Console.ReadKey(); }