资源描述
深 圳 大 学 实 验 报 告
课程名称: 数据结构实验与课程设计
实验项目名称: 实验一:顺序表得应用
学院: 计算机与软件学院
专业:
指导教师: 蔡平
报告人: 文成 学号: 2011150259ﻩ 班级: 5
实验时间: 2012-9—17
实验报告提交时间: 2012—9-24
教务部制
一、实验目得与要求:
目得:
1、掌握线性表得基本原理
2、掌握线性表地基本结构
3、掌握线性表地创建、插入、删除、查找得实现方法
要求:
1、熟悉C++语言编程
2、熟练使用C++语言实现线性表地创建、插入、删除、查找得实现方法
二、实验内容:
Problem A: 数据结构——实验1——顺序表例程
Description
实现顺序表得创建、插入、删除、查找
Input
第一行输入顺序表得实际长度n
第二行输入n个数据
第三行输入要插入得新数据与插入位置
第四行输入要删除得位置
第五行输入要查找得位置
Output
第一行输出创建后,顺序表内得所有数据,数据之间用空格隔开
第二行输出执行插入操作后,顺序表内得所有数据,数据之间用空格隔开
第三行输出执行删除操作后,顺序表内得所有数据,数据之间用空格隔开
第四行输出指定位置得数据
Sample Input
6
11 22 33 44 55 66
888 3
5
2
Sample Output
11 22 33 44 55 66
11 22 888 33 44 55 66
11 22 888 33 55 66
22
HINT
第i个位置就是指从首个元素开始数起得第i个位置,对应数组内下标为i-1得位置
Problem B: 数据结构-—实验1——顺序表得数据交换
Description
实现顺序表内得元素交换操作
Input
第一行输入n表示顺序表包含得·n个数据
第二行输入n个数据,数据就是小于100得正整数
第三行输入两个参数,表示要交换得两个位置
第四行输入两个参数,表示要交换得两个位置
Output
第一行输出创建后,顺序表内得所有数据,数据之间用空格隔开
第二行输出执行第一次交换操作后,顺序表内得所有数据,数据之间用空格隔开
第三行输出执行第二次交换操作后,顺序表内得所有数据,数据之间用空格隔开
注意加入交换位置得合法性检查,如果发现位置不合法,输出error。
Sample Input
5
11 22 33 44 55
2 4
0 1
Sample Output
11 22 33 44 55
11 44 33 22 55
error
HINT
本题执行两次交换操作,注意写好输入接口。
Problem C: 数据结构——实验1——顺序表得合并
Description
假定两个顺序表得数据已经按照从小到大得顺序排列,实现两个顺序表得合并
Input
第一行输入n表示顺序表A包含得·n个数据
第二行输入n个数据,数据就是小于100得正整数
第三行输入m表示顺序表B包含得·n个数据
第二行输入m个数据,数据就是小于100得正整数
Output
输出合并后得顺序表内得所有数据,数据之间用空格隔开
Sample Input
3
11 33 55
4
22 44 66 88
Sample Output
11 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
样例输入
5
11 22 33 44 55
0 2
1 4
样例输出
11 22 33 44 55
33 44 55 11 22
44 55 11 22 33
三、 实验步骤与过程:
思路:
1. 顺序表类定义
2、顺序表得创建、插入、删除、查找等功能得实现
3、顺序表得测试运行
源代码:
A:
#include<iostream>
using namespace std;
class List
{
private:
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 int[listsize];
}
List::~List() //析构函数
{
ﻩdelete[]elem; //回收空间
}
int List::ListLength()ﻩ//获取顺序表得实际长度
{
ﻩreturn length;
}
int List::ListInsert(int i,int e)ﻩ//插入一个元素
{
if (length==listsize)
ﻩ return 0;ﻩ//顺序表已满
if (i<1 || i>length+1)
ﻩreturn 0; //i值不合法
ﻩif (i==length+1)
ﻩelem[length]=e;
else
ﻩﻩfor (int j=length;j>i—1;j-—)
elem[j]=elem[j-1]; //位置i后面得元素全部后移一位
ﻩelem[i—1]=e;
ﻩlength++;
return 1;
}
int List::ListDelete(int i) //删除一个元素,返回删除得元素
{
ﻩif (length==0)
ﻩ return 0;
ﻩif (i〈1 || i>length)
return 0;
int temp=elem[i—1];
ﻩfor (int j=i-1;j<length;j++)ﻩ//位置i后面得元素全部前移一位
ﻩﻩelem[j]=elem[j+1];
ﻩlength-—;
ﻩreturn temp;
}
int List::GetElem(int i) //获取一个元素,返回元素值
{
ﻩif(i<1 || i>length)
ﻩﻩreturn 0;
ﻩreturn elem[i—1];
}
int main()
{
ﻩint i,len,temp;
List myList(20);ﻩ//创建一个顺序表,最大长度为20
cin〉〉len;
ﻩfor(i=1;i〈len+1;i++)
ﻩ{
cin>〉temp;
myList、ListInsert(i,temp);
ﻩ}
ﻩfor(i=1;i<myList、ListLength()+1;i++)ﻩ//打印顺序表
ﻩcout〈〈myList、GetElem(i)〈〈” ”;
cout〈〈endl;
ﻩint elem,j; ﻩ
cin>>elem>〉j;ﻩ//输入插入数以及插入得位置
myList、ListInsert(j,elem);ﻩ //执行插入操作
for(i=1;i<myList、ListLength()+1;i++) //打印插入后得结果
ﻩcout<〈myList、GetElem(i)<<” ";
ﻩcout<〈endl;
ﻩcin>>j; //输入删除得位置
ﻩmyList、ListDelete(j); ﻩ//执行删除操作
for(i=1;i〈myList、ListLength()+1;i++) //打印插入后得结果
cout<<myList、GetElem(i)<〈" ";
ﻩcout<<endl;
cin>〉j;
ﻩcout<<myList、GetElem(j)〈<endl; //输出指定位置得数据
return 0;
}
B:
#include<iostream〉
using namespace std;
class List
{
private:
ﻩ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 s a,int b);ﻩﻩ//交换二个元素
};
List::List(int size)//构造函数
{
ﻩlistsize=size;
ﻩlength=0;
elem=new int[listsize];
}
List::~List()//析构函数
{
ﻩdelete[]elem;
}
int List::ListLength()//获取顺序表得实际长度
{
ﻩreturn length;
}
int List::ListInsert(int i,int e) //插入一个元素
{
if (length==listsize)
return 0; //顺序表已满
ﻩif (i<1 || i〉length+1)
ﻩ return 0;ﻩ//i值不合法
if (i==length+1)
elem[length]=e;
else
ﻩfor (int j=length;j〉i—1;j-—)ﻩ//位置i后面得元素全部后移一位
ﻩ elem[j]=elem[j-1];
elem[i-1]=e;
ﻩlength++;
ﻩreturn 1;
}
int List::ListDelete(int i)//删除一个元素,返回删除得元素
{
ﻩif (length==0)
return 0;
ﻩif (i<1 || i>length)
ﻩreturn 0;
ﻩint temp=elem[i—1];
ﻩfor (int j=i—1;j<length;j++)ﻩﻩ//位置i后面得元素全部前移一位
ﻩelem[j]=elem[j+1];
ﻩlength——;
return temp;
}
int List::GetElem(int i) ﻩ//获取一个元素,返回元素值
{
ﻩif(i<1 || i>length)
ﻩreturn 0;
ﻩreturn elem[i-1];
}
int List::s a,int b) //交换二个元素
{
if (a<1 || a〉length || b〈1 || b〉length || a==b)
ﻩ{ﻩ
ﻩcout〈<"error”;ﻩ//输入不合法,则报错
ﻩ return 0;
ﻩ}
else
{
ﻩint temp=elem[a-1]; ﻩ//交换元素
elem[a-1]=elem[b-1];
elem[b-1]=temp;
ﻩ}
return 1;
}
int main()
{
int i,len,temp;
List myList(100);ﻩ//创建一个顺序表,最大长度为100
ﻩcin>〉len;
for(i=1;i<len+1;i++)
{
ﻩﻩcin〉〉temp;
myList、ListInsert(i,temp);
}
ﻩfor(i=1;i<myList、ListLength()+1;i++)ﻩ//打印顺序表
ﻩﻩcout〈〈myList、GetElem(i)<<" ”;
ﻩcout〈<endl;
ﻩint x,y; //输入交换元素得位置
ﻩcin〉>x〉>y;
ﻩif (myList、s))ﻩ//交换这二个元素
ﻩ{
for(i=1;i<myList、ListLength()+1;i++)//打印交换元素后得顺序表
ﻩcout<<myList、GetElem(i)<<" ”;
cout〈<endl;
ﻩ}
cin〉〉x>〉y;
ﻩif (myList、s))ﻩ//交换这二个元素
{
for(i=1;i<myList、ListLength()+1;i++)//打印交换元素后得顺序表
cout〈〈myList、GetElem(i)<<” ";
ﻩcout<〈endl;
}
return 0;
}
C:
#include〈iostream〉
using namespace std;
class List
{
private:
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 int[listsize];
}
List::~List()ﻩﻩ//析构函数
{
ﻩdelete[]elem;//回收空间
}
int List::ListLength() //获取顺序表得实际长度
{
ﻩreturn length;
}
int List::ListInsert(int i,int e)ﻩ//插入一个元素
{
ﻩif (length==listsize)
ﻩ return 0;ﻩ//顺序表已满
if (i<1 || i>length+1)
ﻩreturn 0; //i值不合法
ﻩif (i==length+1)
ﻩelem[length]=e;
else
ﻩfor (int j=length;j〉i-1;j--)
ﻩ elem[j]=elem[j—1];ﻩ//位置i后面得元素全部后移一位
elem[i-1]=e;
length++;
ﻩreturn 1;
}
int List::ListDelete(int i)ﻩ//删除一个元素,返回删除得元素
{
ﻩif (length==0)
ﻩﻩreturn 0;
ﻩif (i<1 || i〉length)
return 0;
int temp=elem[i—1];
ﻩfor (int j=i—1;j<length;j++)
ﻩ elem[j]=elem[j+1];ﻩ//位置i后面得元素全部前移一位
ﻩlength—-;
ﻩreturn temp;
}
int List::GetElem(int i)ﻩ//获取一个元素,返回元素值
{
ﻩif(i<1 || i〉length)
ﻩﻩreturn 0;
ﻩreturn elem[i—1];
}
int func(List &A,List &B)ﻩ//实现两个顺序表得合并
{
ﻩint a;
for (int i=0;i<B、ListLength();i++)
ﻩ{
a=—1;
ﻩfor(int j=0;j<A、ListLength();j++)
ﻩ{
ﻩﻩﻩif (B、elem[i]<A、elem[j])//寻找插入得位置
ﻩﻩ{
ﻩ ﻩa=j;
ﻩﻩﻩﻩbreak;
ﻩ }
}
ﻩ if(a==—1)
ﻩ {
ﻩﻩﻩA、elem[A、length]=B、elem[i];ﻩ//B、elem[i]就是最大得,插到末尾
ﻩﻩ A、length++; //顺序表当前长度+1
ﻩ}
ﻩelse
ﻩ {
ﻩ for(int k=A、length—1;k>=a;k—-)//位置i后面得元素全部前移一位
ﻩﻩﻩ A、elem[k+1]=A、elem[k];
A、elem[a]=B、elem[i];//将B、elem[i]插到位置i处
ﻩ A、length++; //顺序表当前长度+1
ﻩ }
}
ﻩreturn 0;
}
int main()
{
int i,len,temp;
ﻩList myList1(100); //创建一个顺序表1,最大长度为100
ﻩList myList2(100);ﻩ//创建一个顺序表2,最大长度为100
cin>〉len;//输入顺序表1长度
for(i=1;i<len+1;i++)//输入数据
ﻩ{
cin>>temp;
ﻩ myList1、ListInsert(i,temp);
}
cin〉>len;//输入顺序表2长度
ﻩfor(i=1;i<len+1;i++)//输入数据
ﻩ{
cin>>temp;
ﻩmyList2、ListInsert(i,temp);
ﻩ}
ﻩfunc(myList1,myList2);ﻩ//将顺序表1与顺序表2合并
for(i=1;i<myList1、ListLength()+1;i++)ﻩ//输出合并后得结果
ﻩ cout〈〈myList1、GetElem(i)<〈" ";
ﻩcout<<endl;
return 0;
}
D:
#include<iostream〉
using namespace std;
class List
{
private:
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 int[listsize];
}
List::~List()ﻩﻩ//析构函数
{
ﻩdelete[]elem;//回收空间
}
int List::ListLength() //获取顺序表得实际长度
{
ﻩreturn length;
}
int List::ListInsert(int i,int e) //插入一个元素
{
ﻩif (length==listsize)
ﻩ return 0;ﻩ//顺序表已满
if (i<1 || i>length+1)
ﻩreturn 0; //i值不合法
ﻩif (i==length+1)
ﻩ elem[length]=e;
ﻩelse
for (int j=length;j>i-1;j--)
elem[j]=elem[j—1];ﻩ//位置i后面得元素全部后移一位
elem[i-1]=e;
ﻩlength++;
ﻩreturn 1;
}
int List::ListDelete(int i)ﻩ//删除一个元素,返回删除得元素
{
if (length==0)
ﻩﻩreturn 0;
ﻩif (i<1 || i>length)
ﻩﻩreturn 0;
int temp=elem[i-1];
ﻩfor (int j=i-1;j<length;j++)
ﻩ elem[j]=elem[j+1];ﻩ//位置i后面得元素全部前移一位
ﻩlength——;
return temp;
}
int List::GetElem(int i)ﻩ//查找一个元素,返回元素值
{
if(i〈1 || i>length)
ﻩﻩreturn 0;
return elem[i-1];
}
int List::Move(int a,int b)
{
ﻩint i,j;
ﻩint *p=new int[2*length];//先构造一个2倍长度得空间
for (i=0;i<length;i++)
ﻩp[i]=elem[i];
for (j=0;j〈length;j++,i++)
ﻩﻩp[i]=elem[j]; //实际上p指向得就是elem*2得数组
ﻩif (a==0)//若a==0,则向左移
ﻩ for(i=0;i<length;i++)
ﻩelem[i]=p[i+b];//将向左移b位后得结果给elem
ﻩif (a==1)//若a==1,则向右移
for(i=0;i<length;i++)
ﻩ elem[i]=p[i+length-b];//将向右移b位后得结果给elem
ﻩreturn 0;
}
int main()
{
ﻩint i,len,temp;
ﻩList myList(100);ﻩ//创建一个顺序表,最大长度为100
ﻩcin>>len;//输入顺序表长度
for(i=1;i<len+1;i++)//输入数据
{
cin〉>temp;
myList、ListInsert(i,temp);
ﻩ}
for(i=1;i〈myList、ListLength()+1;i++)//打印顺序表
ﻩcout<<myList、GetElem(i)<<" ";
ﻩcout<<endl;
int a,b;
ﻩcin〉>a〉〉b;
myList、Move(a,b);ﻩ//循环移位
ﻩfor(i=1;i〈myList、ListLength()+1;i++)//打印顺序表
cout<<myList、GetElem(i)<〈" ”;
cout<<endl;
cin>〉a>>b; //循环移位
myList、Move(a,b);
for(i=1;i〈myList、ListLength()+1;i++)//打印顺序表
ﻩcout〈<myList、GetElem(i)<<" ”;
cout<<endl;
return 0;
}
四、实验结果及数据处理分析:
A:
实验基本达到实验要求
B:
实验基本达到实验要求
C:
实验基本达到实验要求
D:
实验基本达到实验要求
五、实验结论与体会:
从这个实验中我学会了线性表一些基本操作,例如插入、查找与删除。也复习了一边C++语言程序得规范。原先试了很多次都就是出现错误,最后才发现太久没编程,犯了很多低级错误,从中体会到编程就是需要时间与耐心得。
要求挺简单得,就就是如此简单得插入、查找、删除、循环移位等。程序写完了,但就是还发现程序中还有许多不完善得地方、不严谨得地方,如异常处理,在不按正确输入格式输入时,会出现程序错误或死了得情况.
指导教师批阅意见:
成绩评定:
指导教师签字:
年 月 日
备注:
注:1、报告内得项目或内容设置,可根据实际情况加以调整与补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。
展开阅读全文