数据结构C#顺序表_第1页
数据结构C#顺序表_第2页
数据结构C#顺序表_第3页
数据结构C#顺序表_第4页
数据结构C#顺序表_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实 验 报 告 课程名称: 数据结构与数据库应用基础教程 系部名称: 专业班级: 学生姓名: 学 号: 指导教师: 黑龙江工程学院教务实验项目线性表的控制台程序及窗体实验日期2015-10-28实验地点实验楼612同组人数5实验类型 传统实验 现代实验 其 他 验证性 综合性 设计性 其 他 自立式 合作式 研究式 其 他一、 实验目的编写线性表中顺序表的控制台应用程序及其实现Windows窗体化。利用控制台应用程序实现求顺序表的长度,清空顺序表,判空顺序表,判满顺序表,在顺序表末尾添加元素,在顺序表i位置插入元素,删除顺序表的i个未知的元素,获取第i个数据元素,在顺序表中查找值为value的

2、数据元素。二、实验仪器设备Microsoft Visual Studio2010三、实验原理、内容及步骤利用Microsoft Visual Studio2010编写控制应用程序和Windows窗体。:(输入一个新的顺序表并提示生成成功):(顺序表先进行排序的操作):(顺序表生成的同时会提醒进行下一步骤的操作,并且以后的每一步操作都会提示。不过接下来的截图都会略过提示):(同时输入插入的元素数据和位置显示出结果):(不过在此窗体中要同时输入插入的元素和位置才可以生成正确的顺序表,不然会出现上图所示的错误):(输入要删除的元素的位置输出结果)四、实验中存在的问题、解决方法及进

3、一步的想法等1开始不知道怎么编写代码通过输入数据创建一个新的顺序表,后来通过请教同学知道了用追加(append)的方法创建一个新的顺序表。2.不知道怎么给顺序表排序,通过上网了解了可以用冒泡法进行排序。3.最后编写程序时不知道怎么把经过操作的程序结果输出,用for (int i = 0; i <= last; i+)就可以实现了。4.在开始做窗体的时候以为每做一个控件就要输入代码,结果发现没有这个必要,在用button控件的时候再把代码输入进去就行了。5.不知道用什么代码读取输入的顺序表,发现用new运算符可以实现。6.最后不知道报错的程序该写在哪里,还是请教同学才搞明白。五、教师评语成

4、 绩指导教师签字: 年 月 日注:1、此报告为参考格式,各栏项目可根据实际情况进行调整;2、实验成绩以优(90100)、良(8089)、中(7079)、及格(6069)、不及格(60以下)五个等级评定。附录控制台应用程序;using System;namespace 顺序表_CSharpclass Program#region 方法/ 程序主入口public static void Main(string args) Console.Write("请输入顺序表的长度:"); int b = Convert.ToInt32(Console.ReadLine(); / 创建并实

5、例化顺序表类,为了方便演示,此处使用整数 SeqList<int> SL = new SeqList<int>(b);/ 为了方便演示,此处直接使用5作为表最大容量 Console.Write("请输入序列表La的第1个成员:"); /把输入的元素追加到序列表La中; string n = null; do int m = Convert.ToInt32(Console.ReadLine(); if (SL.GetLength() + 1 > b) Console.WriteLine("您输入的序列表La的元素个数大于序列表La的容量

6、!"); Console.ReadKey(); break; SL.Append(m); Console.Write("是否继续为序列表La加入成员:(是:y,否:n)"); n = Console.ReadLine(); if (n = "y") Console.Write("请输入序列表La新加入的成员:"); while (n = "y"); / 保存用户输入的值的变量string input;int pos;int num;while (true)Console.WriteLine("请

7、输入您要执行的操作编号:");Console.WriteLine("1.获取顺序表中当前数据元素的个数");Console.WriteLine("2.删除顺序表中所有数据元素");Console.WriteLine("3.在顺序表的尾部追加一个数据元素");Console.WriteLine("4.在顺序表指定位置插入一个数据元素");Console.WriteLine("5.删除顺序表中指定位置的数据元素");Console.WriteLine("6.获取顺序表中指定位置的

8、数据元素");Console.WriteLine("7.在顺序表中对数据元素进行按值查找");Console.WriteLine("8.打印顺序表中所有数据元素");Console.WriteLine("9.查找顺序表中最大的数据元素");Console.WriteLine("10.对顺序表进行升序排序");Console.WriteLine("11.删除顺序表中重复的数据元素");input = Console.ReadLine();/ 对用户输入的操作编号进行处理switch (i

9、nput)case "1":Console.WriteLine("当前顺序表中的数据元素个数为:0", SL.GetLength();break;case "2":SL.Clear();Console.WriteLine("顺序表中的数据元素已经被全部删除!");break;case "3":Console.Write("请输入一个整数以追加在顺序表尾部:");if(int.TryParse(Console.ReadLine(), out num)SL.Append(num)

10、;SL.PrintAllElem();break;case "4":Console.Write("请输入一个整数:");if(int.TryParse(Console.ReadLine(), out num)Console.Write("请输入插入位置:");if(int.TryParse(Console.ReadLine(), out pos)if(SL.Insert(num, pos)SL.PrintAllElem();break;case "5":Console.Write("请输入删除位置:&qu

11、ot;);if(int.TryParse(Console.ReadLine(), out pos)Console.WriteLine("被删除的数据元素:0", SL.Delete(pos);break;case "6":Console.Write("请输入一个整数:");if(int.TryParse(Console.ReadLine(), out pos) Console.WriteLine("指定位置的数据元素:0", SL.GetElem(pos);break;case "7":Cons

12、ole.Write("请输入一个整数:");if(int.TryParse(Console.ReadLine(), out num)Console.WriteLine("匹配的数据元素所在的索引:0", SL.Locate(num);break;case "8":SL.PrintAllElem();break;case "9":num = FindMax(SL);if(num > -1)Console.WriteLine("顺序表中最大的数据元素为:0", num);break;case

13、"10":if(BubbleSort(SL)Console.WriteLine("顺序表升序排序完成!");break;case "11":if(Inversion(SL)Console.WriteLine("顺序表倒置完成!");break;case "12":if(DeleteRepeatElem(SL)Console.WriteLine("删除顺序表中的重复元素完成!");break;default:Console.WriteLine("请输入一个合理的操作编

14、号!");break;/ 查找顺序表中最大的数据元素private static int FindMax(SeqList<int> SL)/ 定义存储最大值的变量int max = -1;/ 判断顺序表是否为空if(SL.IsEmpty()Console.WriteLine("顺序表中不存在数据元素,无法执行查找操作!");else/ 设置最大值为顺序表中第一个数据元素,则可直接从第二个数据元素开始对比max = SL0;int len = SL.GetLength();for (int i = 1; i < len; i+)if(max <

15、; SLi)max = SLi;/ 返回找到的最大值(或默认值)return max;/ 对顺序表进行冒泡排序(升序)private static bool BubbleSort(SeqList<int> SL)/ 判断顺序表是否为空if(SL.IsEmpty()Console.WriteLine("顺序表中不存在数据元素,无法执行排序操作!");return false;elseint len = SL.GetLength();/ 开始冒泡排序for (int i = 0; i < len; i+)for (int j = len - 1; j >

16、 i; j-)/ 比较前后两个数据元素大小(如果需要倒序排序,只需将小于改成大于)if(SLj < SLj - 1)int tmp = SLj;SLj = SLj - 1;SLj - 1 = tmp;return true;/ 判断顺序表是否为空if(SL.IsEmpty()Console.WriteLine("顺序表中不存在数据元素,无法执行倒置操作!");return false;else/ 定义存储数据的变量int tmp;int len = SL.GetLength();/ 通过对调头尾相对位置相同的数据元素实现倒置for (int i = 0; i <

17、 (len / 2); i+)tmp = SLi;SLi = SLlen - i - 1;SLlen - i - 1 = tmp;return true;/ 删除顺序表中的重复元素private static bool DeleteRepeatElem(SeqList<int> SL)/ 判断顺序表是否为空if(SL.IsEmpty()Console.WriteLine("顺序表中不存在数据元素,无法执行删除操作!");return false;else/ 遍历顺序表中的数据元素,发现则将其标记为-999int len = SL.GetLength();int

18、tmp;for (int i = 0; i < (len - 1); i+)/ 判断是否为-999,为-999则不需要进行扫描,直接跳过if(SLi != -999)tmp = SLi;for (int j = len - 1; j > i; j-)if(tmp = SLj)SLj = -999;/ 重新遍历顺序表,删除为-999的数据元素(因为要删除元素,所以必须从后向前遍历)/ 因为第一个数据元素不可能对自己重复,因此不需要检查for (int i = len - 1; i > 0; i-) if(SLi = -999)SL.Delete(i);return true;#

19、endregion/ 定义一个泛型线性表的接口public interface IListDS<T>int GetLength();/ 求线性表的长度(数据元素的个数)void Clear();/ 清空线性表中的数据元素bool IsEmpty();/ 判断线性表是否为空(空表)bool Append(T item);/ 附加一个数据元素到线性表的尾部bool Insert(T item, int i);/ 在线性表位置i处插入数据元素T Delete(int i);/ 删除线性表位置i的数据元素,并返回被删除的数据元素T GetElem(int i);/ 取得线性表位置i的数据元

20、素int Locate(T value);/ 按值查找在线性表中首个符合条件的数据元素/ 定义一个泛型顺序表类public class SeqList<T>:IListDS<T>#region 字段private int maxsize;/ 顺序表的最大容量private int last;/ 指定顺序表中最后一个数据元素的位置private T data;/ 用于存储顺序表中数据元素的一维数组#endregion#region 属性/ 索引器public T thisint indexgetreturn dataindex;setdataindex = value;/

21、 最后一个元素的位置属性public int Lastgetreturn last;/ 最大容量属性public int Maxsizegetreturn maxsize;setmaxsize = value;#endregion#region 基本操作/ 构造方法public SeqList(int size)data = new Tsize;maxsize = size;last = -1;/ 当表中无元素时,表示为-1/ 求表中元素的个数public int GetLength()return last + 1;/ 最后一个元素索引值+1/ 清空元素public void Clear()

22、last = -1;/ 设置最后一个元素位置为-1在逻辑上清空元素,但在内存中并未清除/ 判断是否为空表public bool IsEmpty()if(last = -1)return true;elsereturn false;/ 判断表中元素是否已填满public bool IsFull()if(last = maxsize - 1)return true;elsereturn false;/ 在表的尾部追加元素public bool Append(T item)/ 判断表中数据是否已填满if(IsFull()Console.WriteLine("顺序表中的数据元素已填满,无法继

23、续执行追加操作,操作失败!");return false;elsedata+last = item;/ 先使最后位置递增1,以符合追加操作后的最后元素位置return true;/ 在表的位置i插入一个元素public bool Insert(T item, int i)/ 判断表中数据是否已填满if(IsFull()Console.WriteLine("顺序表中的数据元素已填满,无法继续执行插入操作,操作失败!");return false;else/ 判断用户指定的插入位置是否合理if(i < 1 | i > last + 2)Console.Wr

24、iteLine("插入元素的位置不正确,无法执行插入操作,操作失败!");return false;/ 判断位置是否位于尾部,即等同于追加操作else if(i = last + 2)datalast + 1 = item;last+;/ 执行一般插入操作else/ 先将位置i起所有元素向后拷贝for (int j = last; j >= i - 1; j-)dataj + 1 = dataj;/ 将新的元素赋给位置idatai - 1 = item;last+;/ 这里之所以使用i-1因为位置i的索引值为i-1/ 位置计数从1开始,而索引计数从0开始return

25、true;/ 删除表中位置i的元素public T Delete(int i)/ 定义要返回的元素,并赋初值T tmp = default(T);/ 判断是否为空表if(IsEmpty()Console.WriteLine("顺序表中不存在数据元素,无法执行删除操作,操作失败!");/ 判断用户指定的插入位置是否合理else if(i < 1 | i > last + 1)Console.WriteLine("删除元素的位置不正确,无法执行删除操作,操作失败!");/ 判断是否操作最后一个元素(无需进行元素移动)else if(i = las

26、t + 1)tmp = datalast-;/ FIXME/ 执行一般删除操作elsetmp = datai - 1;/ 向前移动元素for (int j = i; j < last; j+)dataj = dataj + 1;last-;/ 返回被操作的元素(或默认值)return tmp;/ 获得表中位置i的元素public T GetElem(int i)/ 定义要返回的元素,并赋初值T tmp = default(T);/ 判断是否为空表if(IsEmpty()Console.WriteLine("顺序表中不存在数据元素,无法执行获取操作,操作失败!");/

27、判断用户指定的获取位置是否合理else if(i < 1 | i > last + 1)Console.WriteLine("获取元素的位置不正确,无法执行获取操作,操作失败!");/ 执行获取操作elsetmp = datai - 1;/ 返回被获取的元素(或默认值)return tmp;/ 在表中查找值为value的元素public int Locate(T value)/ 定义要返回的索引,-1表示未找到或查找失败【注意:此处i表示是索引,而非位置!】int i;/ 判断是否为空表if(IsEmpty()Console.WriteLine("顺序

28、表中不存在数据元素,无法执行查找操作,操作失败!");i = -1;else/ 开始查找元素for (i = 0; i <= last; i+)/ 判断当前元素是否与value匹配if(value.Equals(datai)/ 当前元素与value匹配,直接跳出循环break;/ 判断查找索引是否超出表的最大索引值if(i > last)i = -1;/ 返回查找到的索引(或默认值)return i;#endregion#region 高级操作/ 打印表中所有的元素public void PrintAllElem()/ 判断是否为空表if(IsEmpty()Console

29、.WriteLine("顺序表中不存在数据元素,无法执行打印操作!");/ 执行打印操作elseConsole.WriteLine("打印顺序表中的数据元素:n");for (int i = 0; i <= last; i+)Console.Write(datai + " ");Console.WriteLine();#endregionWindows窗体程序:using System;using System.Collections.Generic;using System.Linq;using System.Text;usi

30、ng System.Windows.Forms;namespace 顺序表窗体 public class SeqList<e> : IListDS<e > #region 字段 private int maxsize;/ 顺序表的最大容量 private int last;/ 指定顺序表中最后一个数据元素的位置 private e data;/ 用于存储顺序表中数据元素的一维数组 #endregion #region 属性 / 索引器 public e thisint index get return dataindex; set dataindex = value;

31、/ 最后一个元素的位置属性 public int Last get return last; / 最大容量属性 public int Maxsize get return maxsize; set maxsize = value; #endregion #region 基本操作 / 构造方法 public SeqList(int size) data = new esize; maxsize = size; last = -1;/ 当表中无元素时,表示为-1 / 求表中元素的个数 public int GetLength() return last + 1;/ 最后一个元素索引值+1 / 清空

32、元素 public void Clear() last = -1;/ 设置最后一个元素位置为-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 bool Append(e item) / 判断表中数据是否已填满 if (IsFull

33、() MessageBox.Show("顺序表中的数据元素已填满,无法继续执行追加操作,操作失败!"); return false; else data+last = item;/ 先使最后位置递增1,以符合追加操作后的最后元素位置 return true; / 在表的位置i插入一个元素 public bool Insert(e item, int i) / 判断表中数据是否已填满 if (IsFull() MessageBox.Show ("顺序表中的数据元素已填满,无法继续执行插入操作,操作失败!"); return false; else / 判断

34、用户指定的插入位置是否合理 if (i < 1 | i > last + 2) MessageBox.Show("插入元素的位置不正确,无法执行插入操作,操作失败!"); return false; / 判断位置是否位于尾部,即等同于追加操作 else if (i = last + 2) datalast + 1 = item; last+; / 执行一般插入操作 else / 先将位置i起所有元素向后拷贝 for (int j = last; j >= i - 1; j-) dataj + 1 = dataj; / 将新的元素赋给位置i datai -

35、1 = item; last+; / 这里之所以使用i-1因为位置i的索引值为i-1 / 位置计数从1开始,而索引计数从0开始 return true; / 删除表中位置i的元素 public e Delete(int i) / 定义要返回的元素,并赋初值 e tmp = default(e ); / 判断是否为空表 if (IsEmpty() MessageBox.Show("顺序表中不存在数据元素,无法执行删除操作,操作失败!"); / 判断用户指定的插入位置是否合理 else if (i < 1 | i > last + 1) MessageBox.Sho

36、w("删除元素的位置不正确,无法执行删除操作,操作失败!"); / 判断是否操作最后一个元素(无需进行元素移动) else if (i = last + 1) tmp = datalast-;/ FIXME / 执行一般删除操作 else tmp = datai - 1; / 向前移动元素 for (int j = i; j < last; j+) dataj = dataj + 1; last-; / 返回被操作的元素(或默认值) return tmp; / 获得表中位置i的元素 public e GetElem(int i) / 定义要返回的元素,并赋初值 e t

37、mp = default(e ); / 判断是否为空表 if (IsEmpty() MessageBox.Show("顺序表中不存在数据元素,无法执行获取操作,操作失败!"); / 判断用户指定的获取位置是否合理 else if (i < 1 | i > last + 1) MessageBox.Show("获取元素的位置不正确,无法执行获取操作,操作失败!"); / 执行获取操作 else tmp = datai - 1; / 返回被获取的元素(或默认值) return tmp; / 在表中查找值为value的元素 public int L

38、ocate(e value) / 定义要返回的索引,-1表示未找到或查找失败【注意:此处i表示是索引,而非位置!】 int i; / 判断是否为空表 if (IsEmpty() MessageBox.Show("顺序表中不存在数据元素,无法执行查找操作,操作失败!"); i = -1; else / 开始查找元素 for (i = 0; i <= last; i+) / 判断当前元素是否与value匹配 if (value.Equals(datai) / 当前元素与value匹配,直接跳出循环 break; / 判断查找索引是否超出表的最大索引值 if (i > last) i = -1; / 返回查找到的索引(或默认值) return i; #endregion using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 顺序表窗体 public interfa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论