《数据结构C顺序表.doc》由会员分享,可在线阅读,更多相关《数据结构C顺序表.doc(25页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实 验 报 告 课程名称: 数据结构与数据库应用基础教程 系部名称: 专业班级: 学生姓名: 学 号: 指导教师: 黑龙江工程学院教务实验项目线性表的控制台程序及窗体实验日期2015-10-28实验地点实验楼612同组人数5实验类型 传统实验 现代实验 其 他 验证性 综合性 设计性 其 他 自立式 合作式 研究式 其 他一、 实验目的编写线性表中顺序表的控制台应用程序及其实现Windows窗体化。利用控制台应用程序实现求顺序表的长度,清空顺序表,判空顺序表,判满顺序表,在顺序表末尾添加元素,在顺序表i位置插入元素,删除顺序表的i个未知的元素,获取第i个数据元素,在顺序表中查找值为value的
2、数据元素。二、实验仪器设备MicrosoftVisual Studio2010三、实验原理、内容及步骤利用MicrosoftVisual Studio2010编写控制应用程序和Windows窗体。:(输入一个新的顺序表并提示生成成功):(顺序表先进行排序的操作):(顺序表生成的同时会提醒进行下一步骤的操作,并且以后的每一步操作都会提示。不过接下来的截图都会略过提示):(同时输入插入的元素数据和位置显示出结果):(不过在此窗体中要同时输入插入的元素和位置才可以生成正确的顺序表,不然会出现上图所示的错误):(输入要删除的元素的位置输出结果)四、实验中存在的问题、解决方法及进一步的想法等1开始不知道
3、怎么编写代码通过输入数据创建一个新的顺序表,后来通过请教同学知道了用追加(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(); / 创建并实例化顺序表类,为了方便演示,此处使用整数 SeqList
5、 SL = new SeqList(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的容量!); Console.ReadKey(); break; SL.Append(m); Console.Write(是否继续为序列表La加入成员:
6、(是:y,否:n)); n = Console.ReadLine(); if (n = y) Console.Write(请输入序列表La新加入的成员:); while (n = y); / 保存用户输入的值的变量string input;int pos;int num;while (true)Console.WriteLine(请输入您要执行的操作编号:);Console.WriteLine(1.获取顺序表中当前数据元素的个数);Console.WriteLine(2.删除顺序表中所有数据元素);Console.WriteLine(3.在顺序表的尾部追加一个数据元素);Console.Wri
7、teLine(4.在顺序表指定位置插入一个数据元素);Console.WriteLine(5.删除顺序表中指定位置的数据元素);Console.WriteLine(6.获取顺序表中指定位置的数据元素);Console.WriteLine(7.在顺序表中对数据元素进行按值查找);Console.WriteLine(8.打印顺序表中所有数据元素);Console.WriteLine(9.查找顺序表中最大的数据元素);Console.WriteLine(10.对顺序表进行升序排序);Console.WriteLine(11.删除顺序表中重复的数据元素);input = Console.ReadLin
8、e();/ 对用户输入的操作编号进行处理switch (input)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);SL.PrintAllElem();break;case 4:Console.Wri
9、te(请输入一个整数:);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(请输入删除位置:);if(int.TryParse(Console.ReadLine(), out pos)Console.WriteLine(被删除的数据元素:0, SL.Delete(pos);break;cas
10、e 6:Console.Write(请输入一个整数:);if(int.TryParse(Console.ReadLine(), out pos) Console.WriteLine(指定位置的数据元素:0, SL.GetElem(pos);break;case 7:Console.Write(请输入一个整数:);if(int.TryParse(Console.ReadLine(), out num)Console.WriteLine(匹配的数据元素所在的索引:0, SL.Locate(num);break;case 8:SL.PrintAllElem();break;case 9:num =
11、FindMax(SL);if(num -1)Console.WriteLine(顺序表中最大的数据元素为:0, num);break;case 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(请输入一个合理的操作编号!);br
12、eak;/ 查找顺序表中最大的数据元素private static int FindMax(SeqList 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 SLi)max = SLi;/ 返回找到的最大值(或默认值)return max;/
13、对顺序表进行冒泡排序(升序)private static bool BubbleSort(SeqList SL)/ 判断顺序表是否为空if(SL.IsEmpty()Console.WriteLine(顺序表中不存在数据元素,无法执行排序操作!);return false;elseint len = SL.GetLength();/ 开始冒泡排序for (int i = 0; i i; j-)/ 比较前后两个数据元素大小(如果需要倒序排序,只需将小于改成大于)if(SLj SLj - 1)int tmp = SLj;SLj = SLj - 1;SLj - 1 = tmp;return true;
14、/ 判断顺序表是否为空if(SL.IsEmpty()Console.WriteLine(顺序表中不存在数据元素,无法执行倒置操作!);return false;else/ 定义存储数据的变量int tmp;int len = SL.GetLength();/ 通过对调头尾相对位置相同的数据元素实现倒置for (int i = 0; i (len / 2); i+)tmp = SLi;SLi = SLlen - i - 1;SLlen - i - 1 = tmp;return true;/ 删除顺序表中的重复元素private static bool DeleteRepeatElem(SeqLi
15、st SL)/ 判断顺序表是否为空if(SL.IsEmpty()Console.WriteLine(顺序表中不存在数据元素,无法执行删除操作!);return false;else/ 遍历顺序表中的数据元素,发现则将其标记为-999int len = SL.GetLength();int tmp;for (int i = 0; i i; j-)if(tmp = SLj)SLj = -999;/ 重新遍历顺序表,删除为-999的数据元素(因为要删除元素,所以必须从后向前遍历)/ 因为第一个数据元素不可能对自己重复,因此不需要检查for (int i = len - 1; i 0; i-) if(
16、SLi = -999)SL.Delete(i);return true;#endregion/ 定义一个泛型线性表的接口public interface IListDSint GetLength();/ 求线性表的长度(数据元素的个数)void Clear();/ 清空线性表中的数据元素bool IsEmpty();/ 判断线性表是否为空(空表)bool Append(T item);/ 附加一个数据元素到线性表的尾部bool Insert(T item, int i);/ 在线性表位置i处插入数据元素T Delete(int i);/ 删除线性表位置i的数据元素,并返回被删除的数据元素T G
17、etElem(int i);/ 取得线性表位置i的数据元素int Locate(T value);/ 按值查找在线性表中首个符合条件的数据元素/ 定义一个泛型顺序表类public class SeqList:IListDS#region 字段private int maxsize;/ 顺序表的最大容量private int last;/ 指定顺序表中最后一个数据元素的位置private T data;/ 用于存储顺序表中数据元素的一维数组#endregion#region 属性/ 索引器public T thisint indexgetreturn dataindex;setdataindex
18、 = value;/ 最后一个元素的位置属性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 vo
19、id Clear()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(顺序表中的数据元素已填满
20、,无法继续执行追加操作,操作失败!);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 last + 2)Console.WriteLine(插入元素的位置不正确,无法执行插入操作,操作
21、失败!);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 true;/ 删除表中位置i的元素public T Delete(int i)/ 定义要返回
22、的元素,并赋初值T tmp = default(T);/ 判断是否为空表if(IsEmpty()Console.WriteLine(顺序表中不存在数据元素,无法执行删除操作,操作失败!);/ 判断用户指定的插入位置是否合理else if(i last + 1)Console.WriteLine(删除元素的位置不正确,无法执行删除操作,操作失败!);/ 判断是否操作最后一个元素(无需进行元素移动)else if(i = last + 1)tmp = datalast-;/ FIXME/ 执行一般删除操作elsetmp = datai - 1;/ 向前移动元素for (int j = i; j l
23、ast; j+)dataj = dataj + 1;last-;/ 返回被操作的元素(或默认值)return tmp;/ 获得表中位置i的元素public T GetElem(int i)/ 定义要返回的元素,并赋初值T tmp = default(T);/ 判断是否为空表if(IsEmpty()Console.WriteLine(顺序表中不存在数据元素,无法执行获取操作,操作失败!);/ 判断用户指定的获取位置是否合理else if(i last + 1)Console.WriteLine(获取元素的位置不正确,无法执行获取操作,操作失败!);/ 执行获取操作elsetmp = datai
24、- 1;/ 返回被获取的元素(或默认值)return tmp;/ 在表中查找值为value的元素public int Locate(T value)/ 定义要返回的索引,-1表示未找到或查找失败【注意:此处i表示是索引,而非位置!】int i;/ 判断是否为空表if(IsEmpty()Console.WriteLine(顺序表中不存在数据元素,无法执行查找操作,操作失败!);i = -1;else/ 开始查找元素for (i = 0; i last)i = -1;/ 返回查找到的索引(或默认值)return i;#endregion#region 高级操作/ 打印表中所有的元素public v
25、oid PrintAllElem()/ 判断是否为空表if(IsEmpty()Console.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.Tex
26、t;using System.Windows.Forms;namespace 顺序表窗体 public class SeqList : IListDS #region 字段 private int maxsize;/ 顺序表的最大容量 private int last;/ 指定顺序表中最后一个数据元素的位置 private e data;/ 用于存储顺序表中数据元素的一维数组 #endregion #region 属性 / 索引器 public e thisint index get return dataindex; set dataindex = value; / 最后一个元素的位置属性
27、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 / 清空元素 public void
28、 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() MessageBox.
29、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 / 判断用户指定的插入位置是否合理 if (i last + 2) MessageBox.Show(插入元素的位置不正确,无法执行插入操作,操作失败!); return false; / 判断位置是否位于尾部,即等同于追加操作 else if (i = last + 2) datalast + 1 = item; last+; / 执行一般插入操作 else
限制150内