一、线性表
一、线 性 表
1、存在唯一的一个被称做“第一个”的数据元素;
2、存在唯一的一个被称做“最后一个”的数据元素;
3、除去第一个元素外,每一个元素有且仅有一个前驱元素;
4、除去最后一个元素外,每一个元素有且仅有一个后继元素。
线性表的存储可以顺序顺序和链式两种方式来实现!
操作:
1、线性表的初始化
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 初始化线性表 /// </summary> public void InitList() { a = new int[LIST_INIT_SIZE]; _length = 0; }
2、线性表的销毁
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 销毁一个线性表 /// </summary> public void DistroyList() { a=new int[0]; _length = 0; }
3、线性表清除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 将线性表置为空表 /// </summary> public void ClearList() { InitList(); }
4、返回线性表的长度
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 返回线线性表的长度 /// </summary> /// <returns></returns> public int ListLength() { return _length; }
5、返回线性表第i个元素
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 返回线性表第i个元素 /// </summary> /// <param name="i"></param> /// <returns></returns> public int GetElem(int i) { if (i <= 0 || i > _length) return ERRORCODE; return a[i-1]; }
6、按照一定的规则查找数据元素e的位置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 满足线性表中第一个与元素e按照CompareDelgate类型定义的规则来比较的元素位置 /// 如果查找不到,则返回-1 /// </summary> /// <param name="e"></param> /// <param name="compare"></param> /// <returns></returns> public int LocateElem(int e, CompareDelgate compare) { int i; for (i = 0; i < _length; i++) { if (compare(e, a[i])) { break; } } if (i == _length) i = -1; return i; }
7、查找数据元素e的前一个元素
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 返回元素e前面的一个元素,如果e是第一个元素或者e不存在线性表中,则返回-1 /// </summary> /// <param name="e"></param> /// <returns></returns> public int PriorEelem(int e) { int i; for (i = 0; i < _length; i++) { if (a[i] == e) { break; } } if (i != 0 && i < _length) return a[i - 1]; return -1; }
8、查找数据元素e的后一个元素
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 返回元素e前面的一个元素,如果e是第一个元素或者e不存在线性表中,则返回-1 /// </summary> /// <param name="e"></param> /// <returns></returns> public int PriorEelem(int e) { int i; for (i = 0; i < _length; i++) { if (a[i] == e) { break; } } if (i != 0 && i < _length) return a[i - 1]; return -1; }
9、线性表的插入
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 在第j个元素后面插入元素e /// </summary> /// <param name="e"></param> /// <param name="j"></param> public void InsertList(int e, int j) { if (_length + 1 == LIST_INIT_SIZE + LISTINCREMENT * Count) { //扩容,需要测试一下C#数组的特点,这种算法的效率是不是比较低 int[]b=new int[_length]; for (int i = 0; i < _length; i++) { b[i] = a[i]; } Count++; a = new int[LIST_INIT_SIZE + LISTINCREMENT * Count]; for (int i = 0; i < _length; i++) { a[i] = b[i]; } } for (int i = j; i < _length-1; i++) { int tenp = a[i]; a[i] = e; e = a[i + 1]; } a[_length] = e; _length++; }
10、删除数据元素
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 删除第i个元素,并返回其值 /// </summary> /// <param name="i"></param> /// <returns></returns> public int DeleList(int i) { if (i <= 0 || i > _length) { return ERRORCODE; } int temp= a[i]; for (int j = i - 1; j < _length; j++) { a[j] = a[j + 1]; } _length--; return temp; }
11、线性表的编遍历
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 用vist方法,对线性表的每一个元素都访问一边 /// </summary> /// <param name="vist"></param> public void ListTraverse(VistDelegate vist) { for (int i = 0; i < _length; i++) { vist(a[i]); } }
12、为了测试,随机生成一个线性表
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 生成一个长度为n的线行线,内容全部是随机数 /// </summary> /// <param name="len"></param> public void CreateRadomList(int len) { Thread.Sleep(100); //系统休息100毫秒,这样可以保证每次生成的随机数不一样 //参照http://www.cnblogs.com/falla/archive/2010/01/29/1659399.html Random rd = new Random(); InitList(); for (int i = 0; i < len; i++) { int temp = ((int)(rd.NextDouble()*10000))%1000; InsertList(temp, i + 1); } }
1、例2-1 实现两个线性表的合并
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
for (int i = 1; i < bList.Length + 1; i++) { if (aList.LocateElem(bList.GetElem(i), myequal) == -1)//说明线性表a中不包括bList[i] { aList.InsertList(bList.GetElem(i), aList.Length);//每次都插入到最后一个位置 } }
2、将两个按值非递减顺序排列的线性表归并成一个新的按值非递减顺序的线性表
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
for (; a <=cList.Length && b <= dList.Length; ) { if (cList.GetElem(a) < dList.GetElem(b)) { eList.InsertList(cList.GetElem(a), eList.Length); a++; } else { eList.InsertList(dList.GetElem(b), eList.Length); b++; } } for (; a <= cList.Length; a++) { eList.InsertList(cList.GetElem(a), eList.Length); } for (; b <= dList.Length; b++) { eList.InsertList(dList.GetElem(b), eList.Length); }