1、深 圳 大 学 实 验 报 告 课程名称: 数据结构实验与课程设计 实验项目名称: 实验一:顺序表得应用 学院: 计算机与软件学院 专业: 指导教师: 蔡平 报告人: 文成 学号:
2、 2011150259ﻩ 班级: 5 实验时间: 2012-9—17 实验报告提交时间: 2012—9-24 教务部制 一、实验目得与要求: 目得: 1、掌握线性表得基本原理 2、掌握线性表地基本结构 3、掌握线性表地创建、插入、删除、查找得实现方法 要求: 1、熟悉C++语言编程 2、熟练使用C++语言实现线性表地创建、插入、删除、查找得实现方法 二、实验内容: Problem A: 数
3、据结构——实验1——顺序表例程 Description 实现顺序表得创建、插入、删除、查找 Input 第一行输入顺序表得实际长度n 第二行输入n个数据 第三行输入要插入得新数据与插入位置 第四行输入要删除得位置 第五行输入要查找得位置 Output 第一行输出创建后,顺序表内得所有数据,数据之间用空格隔开 第二行输出执行插入操作后,顺序表内得所有数据,数据之间用空格隔开 第三行输出执行删除操作后,顺序表内得所有数据,数据之间用空格隔开 第四行输出指定位置得数据 Sample Input 6 11 22 33 44 55 66 888 3 5 2 Sam
4、ple 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 第一行输出创建后
5、顺序表内得所有数据,数据之间用空格隔开 第二行输出执行第一次交换操作后,顺序表内得所有数据,数据之间用空格隔开 第三行输出执行第二次交换操作后,顺序表内得所有数据,数据之间用空格隔开 注意加入交换位置得合法性检查,如果发现位置不合法,输出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
6、 假定两个顺序表得数据已经按照从小到大得顺序排列,实现两个顺序表得合并 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——顺序表得循环移位 题目描述 顺序表得移位就是循环移位,
7、例如顺序表: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 第三行输入移动方向与移
8、动得位数,左移方向为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、顺序表得创建、插入、删除、查找等功能得实
9、现 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 ListD
10、elete(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
11、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)
12、//删除一个元素,返回删除得元素
{
ﻩif (length==0)
ﻩ return 0;
ﻩif (i〈1 || i>length)
return 0;
int temp=elem[i—1];
ﻩfor (int j=i-1;j
13、[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
14、插入数以及插入得位置
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< 15、
cin>〉j;
ﻩcout< 16、ﻩ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::List 17、Length()//获取顺序表得实际长度
{
ﻩ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];
18、 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 19、 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 20、
ﻩ}
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 21、in〉>x〉>y;
ﻩif (myList、s))ﻩ//交换这二个元素
ﻩ{
for(i=1;i<myList、ListLength()+1;i++)//打印交换元素后得顺序表
ﻩcout< 22、rn 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);ﻩ//删除一 23、个元素,返回删除得元素
ﻩ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;
24、
}
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;
}
25、
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〉lengt 26、h)
ﻩﻩ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、lengt 27、h]=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;
ﻩLis 28、t myList1(100); //创建一个顺序表1,最大长度为100
ﻩList myList2(100);ﻩ//创建一个顺序表2,最大长度为100
cin>〉len;//输入顺序表1长度
for(i=1;i 29、myList2);ﻩ//将顺序表1与顺序表2合并
for(i=1;i 30、 //构造函数
~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];
}
31、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 32、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 33、置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 34、
ﻩﻩ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 35、度为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< 36、 cout<<myList、GetElem(i)<〈" ”;
cout< 37、 从这个实验中我学会了线性表一些基本操作,例如插入、查找与删除。也复习了一边C++语言程序得规范。原先试了很多次都就是出现错误,最后才发现太久没编程,犯了很多低级错误,从中体会到编程就是需要时间与耐心得。
要求挺简单得,就就是如此简单得插入、查找、删除、循环移位等。程序写完了,但就是还发现程序中还有许多不完善得地方、不严谨得地方,如异常处理,在不按正确输入格式输入时,会出现程序错误或死了得情况.
指导教师批阅意见:
成绩评定:
指导教师签字:
年 月 日
备注:
注:1、报告内得项目或内容设置,可根据实际情况加以调整与补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。






