资源描述
深 圳 大 学 实 验 报 告 课程名称: 数据结构实验与课程设计 实验项目名称: 实验一:顺序表的应用 学院: 计算机与软件学院 专业: 指导教师: 蔡平 报告人: 文成学号:2011150259班级:5 实验时间:2012-9-17 实验报告提交时间:2012-9-24 教务部制一、实验目的与要求:目的:1.掌握线性表的基本原理2.掌握线性表地基本结构3.掌握线性表地创建、插入、删除、查找的实现方法要求:1.熟悉C+语言编程2.熟练使用C+语言实现线性表地创建、插入、删除、查找的实现方法二、实验内容:Problem A: 数据结构实验1顺序表例程Description实现顺序表的创建、插入、删除、查找Input第一行输入顺序表的实际长度n第二行输入n个数据第三行输入要插入的新数据和插入位置第四行输入要删除的位置第五行输入要查找的位置Output第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开第二行输出执行插入操作后,顺序表内的所有数据,数据之间用空格隔开第三行输出执行删除操作后,顺序表内的所有数据,数据之间用空格隔开第四行输出指定位置的数据Sample Input611 22 33 44 55 66888 352Sample Output11 22 33 44 55 66 11 22 888 33 44 55 66 11 22 888 33 55 66 22HINT第i个位置是指从首个元素开始数起的第i个位置,对应数组内下标为i-1的位置Problem B: 数据结构实验1顺序表的数据交换Description实现顺序表内的元素交换操作Input第一行输入n表示顺序表包含的n个数据第二行输入n个数据,数据是小于100的正整数第三行输入两个参数,表示要交换的两个位置第四行输入两个参数,表示要交换的两个位置Output第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开第二行输出执行第一次交换操作后,顺序表内的所有数据,数据之间用空格隔开第三行输出执行第二次交换操作后,顺序表内的所有数据,数据之间用空格隔开注意加入交换位置的合法性检查,如果发现位置不合法,输出error。Sample Input511 22 33 44 552 40 1Sample Output11 22 33 44 55 11 44 33 22 55 errorHINT本题执行两次交换操作,注意写好输入接口。Problem C: 数据结构实验1顺序表的合并Description假定两个顺序表的数据已经按照从小到大的顺序排列,实现两个顺序表的合并Input第一行输入n表示顺序表A包含的n个数据第二行输入n个数据,数据是小于100的正整数第三行输入m表示顺序表B包含的n个数据第二行输入m个数据,数据是小于100的正整数Output输出合并后的顺序表内的所有数据,数据之间用空格隔开Sample Input311 33 55422 44 66 88Sample Output11 22 33 44 55 66 88 问题 D: 数据结构实验1顺序表的循环移位题目描述顺序表的移位是循环移位,例如顺序表:1,2,3,4,5,6。如果左移1位,即原来的头元素移动到末尾,其它元素向左移1位,变成2,3,4,5,6,1。同理,如果右移1位,即原来的尾元素移动到头,其它元素向右移1位,变成6,1,2,3,4,5。以下是移位的多个例子:原数据:1,2,3,4,5,6左移3位:4,5,6,1,2,3,与原数据对比右移4位:3,4,5,6,1,2,与原数据对比请编写程序实现顺序表的循环移位操作输入第一行输入n表示顺序表包含的n个数据第二行输入n个数据,数据是小于100的正整数第三行输入移动方向和移动的位数,左移方向为0,右移方向为1第三行输入移动方向和移动的位数,左移方向为0,右移方向为1输出第一行输出创建后,顺序表内的所有数据,数据之间用空格隔开第二行输出执行移位操作后,顺序表内的所有数据,数据之间用空格隔开第三行输出执行移位操作后,顺序表内的所有数据,数据之间用空格隔开如果发现输入的移动方向或位数不合法,不执行移位操作,输出error样例输入511 22 33 44 550 21 4样例输出11 22 33 44 55 33 44 55 11 22 44 55 11 22 33 三、 实验步骤与过程:思路:1. 顺序表类定义2.顺序表的创建、插入、删除、查找等功能的实现3.顺序表的测试运行源代码:A:#includeusing namespace std;class Listprivate:int *elem;/数组元素int listsize;/顺序表最大长度int length;/顺序表当前长度public:List(int size);/构造函数List();/析构函数int ListLength();/获取顺序表的实际长度int ListInsert(int i,int e);/插入一个元素int ListDelete(int i);/删除一个元素,返回删除的元素int GetElem(int i);/获取一个元素,返回元素值;List:List(int size)/构造函数listsize=size;length=0;elem=new intlistsize;List:List()/析构函数deleteelem;/回收空间int List:ListLength()/获取顺序表的实际长度return length;int List:ListInsert(int i,int e)/插入一个元素if (length=listsize)return 0;/顺序表已满if (ilength+1)return 0;/i值不合法if (i=length+1)elemlength=e;elsefor (int j=length;ji-1;j-)elemj=elemj-1;/位置i后面的元素全部后移一位elemi-1=e;length+;return 1;int List:ListDelete(int i)/删除一个元素,返回删除的元素if (length=0)return 0;if (ilength)return 0;int temp=elemi-1;for (int j=i-1;jlength;j+)/位置i后面的元素全部前移一位elemj=elemj+1;length-;return temp;int List:GetElem(int i)/获取一个元素,返回元素值if(ilength)return 0;return elemi-1;int main()int i,len,temp;List myList(20);/创建一个顺序表,最大长度为20cinlen;for(i=1;itemp;myList.ListInsert(i,temp);for(i=1;imyList.ListLength()+1;i+)/打印顺序表coutmyList.GetElem(i) ;coutelemj;/输入插入数以及插入的位置myList.ListInsert(j,elem);/执行插入操作for(i=1;imyList.ListLength()+1;i+)/打印插入后的结果coutmyList.GetElem(i) ;coutj;/输入删除的位置myList.ListDelete(j);/执行删除操作for(i=1;imyList.ListLength()+1;i+)/打印插入后的结果coutmyList.GetElem(i) ;coutj;coutmyList.GetElem(j)endl;/输出指定位置的数据return 0;B:#includeusing namespace std;class Listprivate:int *elem;/数组元素int listsize;/顺序表最大长度int length;/顺序表当前长度public:List(int size);/构造函数List();/析构函数int ListLength();/获取顺序表的实际长度int ListInsert(int i,int e);/插入一个元素int ListDelete(int i);/删除一个元素,返回删除的元素int GetElem(int i);/获取一个元素,返回元素值int swap(int a,int b);/交换二个元素;List:List(int size)/构造函数listsize=size;length=0;elem=new intlistsize;List:List()/析构函数deleteelem;int List:ListLength()/获取顺序表的实际长度return length;int List:ListInsert(int i,int e)/插入一个元素if (length=listsize)return 0;/顺序表已满if (ilength+1)return 0;/i值不合法if (i=length+1)elemlength=e;elsefor (int j=length;ji-1;j-)/位置i后面的元素全部后移一位elemj=elemj-1;elemi-1=e;length+;return 1;int List:ListDelete(int i)/删除一个元素,返回删除的元素if (length=0)return 0;if (ilength)return 0;int temp=elemi-1;for (int j=i-1;jlength;j+)/位置i后面的元素全部前移一位elemj=elemj+1;length-;return temp;int List:GetElem(int i)/获取一个元素,返回元素值if(ilength)return 0;return elemi-1;int List:swap(int a,int b)/交换二个元素if (alength | blength | a=b)coutlen;for(i=1;itemp;myList.ListInsert(i,temp);for(i=1;imyList.ListLength()+1;i+)/打印顺序表coutmyList.GetElem(i) ;coutxy;if (myList.swap(x,y)/交换这二个元素for(i=1;imyList.ListLength()+1;i+)/打印交换元素后的顺序表coutmyList.GetElem(i) ;coutxy;if (myList.swap(x,y)/交换这二个元素for(i=1;imyList.ListLength()+1;i+)/打印交换元素后的顺序表coutmyList.GetElem(i) ;coutendl;return 0;C:#includeusing namespace std;class Listprivate:int *elem;int listsize;/顺序表最大长度int length;/顺序表当前长度public:List(int size);/构造函数List();/析构函数int ListLength();/获取顺序表的实际长度int ListInsert(int i,int e);/插入一个元素int ListDelete(int i);/删除一个元素,返回删除的元素int GetElem(int i);/获取一个元素,返回元素值friend int func(List &a,List &b);/实现两个顺序表的合并;List:List(int size)/构造函数listsize=size;length=0;elem=new intlistsize;List:List()/析构函数deleteelem;/回收空间int List:ListLength()/获取顺序表的实际长度return length;int List:ListInsert(int i,int e)/插入一个元素if (length=listsize)return 0;/顺序表已满if (ilength+1)return 0;/i值不合法if (i=length+1)elemlength=e;elsefor (int j=length;ji-1;j-)elemj=elemj-1;/位置i后面的元素全部后移一位elemi-1=e;length+;return 1;int List:ListDelete(int i)/删除一个元素,返回删除的元素if (length=0)return 0;if (ilength)return 0;int temp=elemi-1;for (int j=i-1;jlength;j+)elemj=elemj+1;/位置i后面的元素全部前移一位length-;return temp;int List:GetElem(int i)/获取一个元素,返回元素值if(ilength)return 0;return elemi-1;int func(List &A,List &B)/实现两个顺序表的合并int a; for (int i=0;iB.ListLength();i+) a=-1;for(int j=0;jA.ListLength();j+)if (B.elemi=a;k-)/位置i后面的元素全部前移一位 A.elemk+1=A.elemk; A.elema=B.elemi;/将B.elemi插到位置i处 A.length+;/顺序表当前长度+1 return 0;int main()int i,len,temp;List myList1(100);/创建一个顺序表1,最大长度为100List myList2(100);/创建一个顺序表2,最大长度为100cinlen;/输入顺序表1长度for(i=1;itemp;myList1.ListInsert(i,temp);cinlen;/输入顺序表2长度for(i=1;itemp;myList2.ListInsert(i,temp);func(myList1,myList2);/将顺序表1与顺序表2合并for(i=1;imyList1.ListLength()+1;i+)/输出合并后的结果coutmyList1.GetElem(i) ;coutendl;return 0;D:#includeusing namespace std;class Listprivate:int *elem;int listsize;/顺序表最大长度int length;/顺序表当前长度public:List(int size);/构造函数List();/析构函数int ListLength();/获取顺序表的实际长度int ListInsert(int i,int e);/插入一个元素int ListDelete(int i);/删除一个元素,返回删除的元素int GetElem(int i);/查找一个元素,返回元素值int Move(int a,int b);List:List(int size)/构造函数listsize=size;length=0;elem=new intlistsize;List:List()/析构函数deleteelem;/回收空间int List:ListLength()/获取顺序表的实际长度return length;int List:ListInsert(int i,int e)/插入一个元素if (length=listsize)return 0;/顺序表已满if (ilength+1)return 0;/i值不合法if (i=length+1)elemlength=e;elsefor (int j=length;ji-1;j-)elemj=elemj-1;/位置i后面的元素全部后移一位elemi-1=e;length+;return 1;int List:ListDelete(int i)/删除一个元素,返回删除的元素if (length=0)return 0;if (ilength)return 0;int temp=elemi-1;for (int j=i-1;jlength;j+)elemj=elemj+1;/位置i后面的元素全部前移一位length-;return temp;int List:GetElem(int i)/查找一个元素,返回元素值if(ilength)return 0;return elemi-1;int List:Move(int a,int b)int i,j;int *p=new int2*length;/先构造一个2倍长度的空间for (i=0;ilength;i+)pi=elemi;for (j=0;jlength;j+,i+)pi=elemj;/实际上p指向的是elem*2的数组if (a=0)/若a=0,则向左移for(i=0;ilength;i+)elemi=pi+b;/将向左移b位后的结果给elemif (a=1)/若a=1,则向右移for(i=0;ilen;/输入顺序表长度for(i=1;itemp;myList.ListInsert(i,temp);for(i=1;imyList.ListLength()+1;i+)/打印顺序表coutmyList.GetElem(i) ;coutab;myList.Move(a,b);/循环移位for(i=1;imyList.ListLength()+1;i+)/打印顺序表coutmyList.GetElem(i) ;coutab;/循环移位myList.Move(a,b);for(i=1;imyList.ListLength()+1;i+)/打印顺序表coutmyList.GetElem(i) ;coutendl;return 0;四、实验结果及数据处理分析:A:实验基本达到实验要求B:实验基本达到实验要求C:实验基本达到实验要求D:实验基本达到实验要求五、实验结论与体会:从这个实验中我学会了线性表一些基本操作,例如插入、查找和删除。也复习了一边C+语言程序的规X。原先试了很多次都是出现错误,最后才发现太久没编程,犯了很多低级错误,从中体会到编程是需要时间和耐心的。 要求挺简单的,就是如此简单的插入、查找、删除、循环移位等。程序写完了,但是还发现程序中还有许多不完善的地方、不严谨的地方,如异常处理,在不按正确输入格式输入时,会出现程序错误或死了的情况。指导教师批阅意见:成绩评定: 指导教师签字: 年 月 日备注:注:1、报告内的项目或内容设置,可根据实际情况加以调整和补充。 2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。19 / 19
展开阅读全文