数据结构实验报告(实验一)
深
圳
大
学
实
验
报
告 告
课程名称:
数据结构实验与课程设计
实验项目名称:
实验一:顺序表得应用
学院:
计算机与软件学院
专业:
指导教师:
:
蔡平
报告人:
:
文成
学号:
20 111 50259
级班ﻩ 班级:
5
实验时间:
20 12-9 —17
实验报告提交时间:
20 12—9 -2 4
教务部制 一、实验目得与要求: 目得: 1、掌握线性表得基本原理 2、掌握线性表地基本结构 3、掌握线性表地创建、插入、删除、查找得实现方法 要求: 1、熟悉 C++语言编程 2、熟练使用C++语言实现线性表地创建、插入、删除、查找得实现方法
二、实验内容:
Pr oblem
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得位置 Prob lem 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 本题执行两次交换操作,注意写好输入接口。
Proble m 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;// 度长大最表序顺ﻩ ;htgnel tniﻩ // 度长前当表序顺ﻩpublic:
List(int size);// 数函造构ﻩ ~List();
//析构函数
int ListLength(); //获取顺序表得实际长度
int ListInsert(int i,int e);// 素元个一入插ﻩ ;)i tni(eteleDtsiL tniﻩ //删除一个元素,返回删除得元素
int GetElem(int i);// 值素元回返,素元个一取获ﻩﻩ}; List::List(int size) //构造函数 {
;ezis=ezistsilﻩ length=0;
elem=new int[listsize]; } List::~List() //析构函数 {
;mele][eteledﻩ //回收空间 } int List::ListLength()// 度长际实得表序顺取获ﻩ{
;htgnel nruterﻩ} int List::ListInsert(int i,int e)// 素元个一入插ﻩ{
if (length==listsize)
ﻩ return 0;// 满已表序顺ﻩ if (i<1 || i>length+1)
法合不值 i// ;0 nruterﻩ )1+htgnel==i( fiﻩ
;e=]htgnel[meleﻩ else
)—-j;1—i>j;htgnel=j tni( rofﻩﻩ
elem[j]=elem[j-1]; //位置 i 后面得元素全部后移一位
;e=]1—i[meleﻩ ;++htgnelﻩ return 1; } int List::ListDelete(int i)
//删除一个元素,返回删除得元素 {
)0==htgnel( fiﻩ ﻩ return 0;
)htgnel>i || 1〈i( fiﻩ
return 0;
int temp=elem[i—1]; /)++j;htgnel<j;1-i=j tni( rofﻩ/ 位一移前部全素元得面后 i 置位ﻩ ;]1+j[mele=]j[meleﻩﻩ ;—-htgnelﻩ ;pmet nruterﻩ
} int List::GetElem(int i)
//获取一个元素,返回元素值 {
)htgnel>i || 1<i(fiﻩ ;0 nruterﻩﻩ ;]1—i[mele nruterﻩ} int main()
{
;pmet,nel,i tniﻩ List myList(20);// 02 为度长大最,表序顺个一建创ﻩ cin〉〉len;
)++i;1+nel〈i;1=i(rofﻩ {ﻩ
cin>〉temp;
myList、ListInsert(i,temp);
}ﻩ/)++i;1+)(htgneLtsiL、tsiLym<i;1=i(rofﻩ/ 表序顺印打ﻩ
;” ”〈〈)i(melEteG、tsiLym〈〈tuocﻩ cout〈〈endl;
;j,mele tniﻩ
ﻩ cin>>elem>〉j;// 置位得入插及以数入插入输ﻩ myList、ListInsert(j,elem);//
作操入插行执ﻩ for(i=1;i<myList、ListLength()+1;i++) //打印插入后得结果
;" ”<<)i(melEteG、tsiLym〈<tuocﻩ ;ldne〈<tuocﻩ
;j>>nicﻩ //输入删除得位置 / ;)j(eteleDtsiL、tsiLymﻩ/ 作操除删行执ﻩ for(i=1;i〈myList、ListLength()+1;i++)
//打印插入后得结果
cout<<myList、GetElem(i)<〈" ";
;ldne<<tuocﻩ
cin>〉j;
据数得置位定指出输// ;ldne<〈)j(melEteG、tsiLym<<tuocﻩ return 0; } B: #include<iostream〉 using namespace std; class List {
private: /;mele* tniﻩ/ 素元组数ﻩ int listsize; //顺序表最大长度 /;htgnel tniﻩ/ 度长前当表序顺ﻩﻩpublic:
List(int size);//构造函数 ~ ;)(tsiLﻩ
//析构函数
int ListLength();// 度长际实得表序顺取获ﻩ ;)e tni,i tni(tresnItsiL tniﻩ //插入一个元素
int ListDelete(int i);
//删除一个元素,返回删除得元素
int GetElem(int i); ﻩ // 值素元回返,素元个一取获ﻩ/;)b tni,a s tniﻩ/ 素元个二换交ﻩﻩ}; List::List(int size)//构造函数 {
;ezis=ezistsilﻩ ;0=htgnelﻩ elem=new int[listsize]; } List::~List()//析构函数 {
;mele][eteledﻩ} int List::ListLength()//获取顺序表得实际长度 {
;htgnel nruterﻩ} int List::ListInsert(int i,int e)
//插入一个元素 {
if (length==listsize)
return 0; //顺序表已满
)1+htgnel〉i || 1<i( fiﻩ ﻩ return 0;// 法合不值 iﻩ if (i==length+1)
elem[length]=e;
else
/)—-j;1—i〉j;htgnel=j tni( rofﻩ/ 位一移后部全素元得面后 i 置位ﻩ ﻩ
elem[j]=elem[j-1];
elem[i-1]=e;
;++htgnelﻩ ;1 nruterﻩ} int List::ListDelete(int i)//删除一个元素,返回删除得元素 {
)0==htgnel( fiﻩ
return 0;
)htgnel>i || 1<i( fiﻩ
;0 nruterﻩ ;]1—i[mele=pmet tniﻩ/)++j;htgnel<j;1—i=j tni( rofﻩ/ 位一移前部全素元得面后 i 置位ﻩﻩ
;]1+j[mele=]j[meleﻩ ;——htgnelﻩ return temp; } int List::GetElem(int i)
// 值素元回返,素元个一取获ﻩ{
)htgnel>i || 1<i(fiﻩ
;0 nruterﻩ ;]1-i[mele nruterﻩ} int List::s a,int b)
//交换二个元素 {
if (a<1 || a〉length || b〈1 || b〉length || a==b)
ﻩ{ﻩ /;”rorre"<〈tuocﻩ/ 错报则,法合不入输ﻩ ﻩ return 0;
}ﻩ else
{
/ ;]1-a[mele=pmet tniﻩ/ 素元换交ﻩ
elem[a-1]=elem[b-1];
elem[b-1]=temp;
}ﻩ return 1; } int main()
{
int i,len,temp;
List myList(100);// 001为度长大最,表序顺个一建创ﻩ ;nel〉>nicﻩ for(i=1;i<len+1;i++)
{
;pmet〉〉nicﻩﻩ
myList、ListInsert(i,temp);
} /)++i;1+)(htgneLtsiL、tsiLym<i;1=i(rofﻩ/ 表序顺印打ﻩ ;” "<<)i(melEteG、tsiLym〈〈tuocﻩﻩ ;ldne<〈tuocﻩ
置位得素元换交入输// ;y,x tniﻩ ;y>〉x>〉nicﻩ/))s、tsiLym( fiﻩ/ 素元个二这换交ﻩ {ﻩ for(i=1;i<myList、ListLength()+1;i++)//打印交换元素后得顺序表
;” "<<)i(melEteG、tsiLym<<tuocﻩ cout〈<endl;
}ﻩ
cin〉〉x>〉y; /))s、tsiLym( fiﻩ/ 素元个二这换交ﻩ {
for(i=1;i<myList、ListLength()+1;i++)//打印交换元素后得顺序表
cout〈〈myList、GetElem(i)<<” ";
;ldne〈<tuocﻩ }
return 0; } C :
#include〈iostream〉 using namespace std; class List { private:
int *elem;
int listsize;// 度长大最表序顺ﻩ
;htgnel tniﻩ //顺序表当前长度 public:
数函造构// ;)ezis tni(tsiLﻩ ~List(); // 数函构析ﻩ/;)(htgneLtsiL tniﻩ/ 度长际实得表序顺取获ﻩ int ListInsert(int i,int e); //插入一个元素 /;)i tni(eteleDtsiL tniﻩ/ 素元得除删回返,素元个一除删ﻩ/;)i tni(melEteG tniﻩ/ 值素元回返,素元个一取获ﻩﻩ 并合得表序顺个两现实//;)b& tsiL,a& tsiL(cnuf tni dneirfﻩ}; List::List(int size)// 数函造构ﻩ{
listsize=size;
length=0;
elem=new int[listsize];
} List::~List()// 数函构析ﻩﻩ{
间空收回//;mele][eteledﻩ} int List::ListLength() //获取顺序表得实际长度 {
;htgnel nruterﻩ} int List::ListInsert(int i,int e)// 素元个一入插ﻩ{
)ezistsil==htgnel( fiﻩ ﻩ return 0;// 满已表序顺ﻩ if (i<1 || i>length+1)
法合不值 i// ;0 nruterﻩ )1+htgnel==i( fiﻩ
;e=]htgnel[meleﻩ else
)--j;1-i〉j;htgnel=j tni( rofﻩ
ﻩ elem[j]=elem[j—1];// 位一移后部全素元得面后 i 置位ﻩ elem[i-1]=e;
length++;
;1 nruterﻩ} int List::ListDelete(int i)// 素元得除删回返,素元个一除删ﻩ{
)0==htgnel( fiﻩ ;0 nruterﻩﻩ )htgnel〉i || 1<i( fiﻩ
return 0;
int temp=elem[i—1];
)++j;htgnel<j;1—i=j tni( rofﻩ ﻩ elem[j]=elem[j+1];// 位一移前部全素元得面后 i 置位ﻩ ;-—htgnelﻩ ;pmet nruterﻩ} int List::GetElem(int i)// 值素元回返,素元个一取获ﻩ{
)htgnel〉i || 1<i(fiﻩ ;0 nruterﻩﻩ ;]1—i[mele nruterﻩ} int func(List &A,List &B)// 并合得表序顺个两现实ﻩ{
;a tniﻩ
for (int i=0;i<B、ListLength();i++)
{ﻩ
a=—1;
)++j;)(htgneLtsiL、A<j;0=j tni(rofﻩ
{ﻩﻩ置位得入插找寻//)]j[mele、A<]i[mele、B( fiﻩ
{ﻩﻩ
ﻩ
;j=aﻩ;kaerbﻩﻩ
ﻩ }
}
ﻩ if(a==—1)
ﻩ { ﻩ/;]i[mele、B=]htgnel、A[mele、Aﻩ/插,得大最是就]i[mele、Bﻩ到末尾
ﻩﻩ A、length++; //顺序表当前长度+1
}ﻩ
esleﻩ ﻩ {
ﻩ for(int k=A、length—1;k>=a;k—-)//位置 i 后面得元素全部前移一位
ﻩ;]k[mele、A=]1+k[mele、Aﻩ
A、elem[a]=B、elem[i];//将 B、elem[i]插到位置 i 处
1+度长前当表序顺// ;++htgnel、Aﻩ ﻩ }
}
;0 nruterﻩ} int main()
{
int i,len,temp;
;)001(1tsiLym tsiLﻩ //创建一个顺序表1,最大长度为 100 /;)001(2tsiLym tsiLﻩ/ 001为度长大最,2 表序顺个一建创ﻩ cin>〉len;//输入顺序表 1 长度
for(i=1;i<len+1;i++)//输入数据
{ﻩ
cin>>temp;
ﻩ myList1、ListInsert(i,temp);
}
cin〉>len;//输入顺序表 2 长度
据数入输//)++i;1+nel<i;1=i(rofﻩ {ﻩ
cin>>temp;
;)pmet,i(tresnItsiL、2tsiLymﻩ }ﻩ/;)2tsiLym,1tsiLym(cnufﻩ/ 并合 2 表序顺与 1 表序顺将ﻩ for(i=1;i<myList1、ListLength()+1;i++)//结得后并合出输ﻩ果
ﻩ cout〈〈myList1、GetElem(i)<〈" ";
;ldne<<tuocﻩ return 0; } D: #include<iostream〉 using namespace std; class List { private:
int *elem;
度长大最表序顺// ;ezistsil tniﻩ int length; // 度长前当表序顺ﻩpublic:
数函造构// ;)ezis tni(tsiLﻩ ~List();// 数函构析ﻩﻩ int ListLength();// 度长际实得表序顺取获ﻩ/;)e tni,i tni(tresnItsiL tniﻩ/ 素元个一入插ﻩ 素元得除删回返,素元个一除删// ;)i tni(eteleDtsiL tniﻩ int GetElem(int i);// 值素元回返,素元个一找查ﻩﻩ int Move(int a,int b); }; List::List(int size) //构造函数 {
listsize=size;
;0=htgnelﻩ ;]ezistsil[tni wen=meleﻩ} List::~List()// 数函构析ﻩﻩ{
间空收回//;mele][eteledﻩ} int List::ListLength()
//获取顺序表得实际长度 {
;htgnel nruterﻩ} int List::ListInsert(int i,int e)
//插入一个元素 {
)ezistsil==htgnel( fiﻩ ﻩ return 0;// 满已表序顺ﻩ if (i<1 || i>length+1)
;0 nruterﻩ //i值不合法
)1+htgnel==i( fiﻩ ﻩ elem[length]=e;
esleﻩ
for (int j=length;j>i-1;j--)
elem[j]=elem[j—1];// 位一移后部全素元得面后 i 置位ﻩ elem[i-1]=e;
;++htgnelﻩ ;1 nruterﻩ} int List::ListDelete(int i)// 素元得除删回返,素元个一除删ﻩ{
if (length==0)
;0 nruterﻩﻩ )htgnel>i || 1<i( fiﻩ ;0 nruterﻩﻩ int temp=elem[i-1];
)++j;htgnel<j;1-i=j tni( rofﻩ ﻩ elem[j]=elem[j+1];// 位一移前部全素元得面后 i 置位ﻩ ;——htgnelﻩ return temp; } int List::GetElem(int i)// 值素元回返,素元个一找查ﻩ{
if(i〈1 || i>length)
;0 nruterﻩﻩ return elem[i-1]; } int List::Move(int a,int b)
{
;j,i tniﻩ 间空得度长倍2个一造构先//;]htgnel*2[tni wen=p* tniﻩ for (i=0;i<length;i++)
;]i[mele=]i[pﻩ for (j=0;j〈length;j++,i++)
;]j[mele=]i[pﻩﻩ //实际上p指向得就是 elem*2 得数组
移左向则,0==a 若//)0==a( fiﻩ ﻩ for(i=0;i<length;i++)
mele 给果结得后位 b 移左向将//;]b+i[p=]i[meleﻩ 移右向则,1==a 若//)1==a( fiﻩ
for(i=0;i<length;i++)
ﻩ
elem[i]=p[i+length-b];//将向右移 b 位后得结果给 elem
;0 nruterﻩ} int main() {
;pmet,nel,i tniﻩ/;)001(tsiLym tsiLﻩ/ 001 为度长大最,表序顺个一建创ﻩ 度长表序顺入输//;nel>>nicﻩ for(i=1;i<len+1;i++)//输入数据
{
cin〉>temp;
myList、ListInsert(i,temp);
}ﻩ for(i=1;i〈myList、ListLength()+1;i++)//打印顺序表
;" "<<)i(melEteG、tsiLym<<tuocﻩ ;ldne<<tuocﻩ int a,b;
;b〉〉a>〉nicﻩ myList、Move(a,b);// 位移环循ﻩ 表序顺印打//)++i;1+)(htgneLtsiL、tsiLym〈i;1=i(rofﻩ
cout<<myList、GetElem(i)<〈" ”;
cout<<endl;
cin>〉a>>b;
//循环移位
myList、Move(a,b);
for(i=1;i〈myList、ListLength()+1;i++)//打印顺序表
;” "<<)i(melEteG、tsiLym<〈tuocﻩ cout<<endl;
return 0; }
四、实验结果及数据处理分析:
A:
实验基本达到实验要求 B:
实验基本达到实验要求 C:
实验基本达到实验要求 D:
实验基本达到实验要求 五、实验结论 与体会:
从这个实验中我学会了线性表一些基本操作,例如插入、查找与删除。也复习了一边C++语言程序得规范。原先试了很多次都就是出现错误,最后才发现太久没编程,犯了很多低级错误,从中体会到编程就是需要时间与耐心得。
要求挺简单得,就就是如此简单得插入、查找、删除、循环移位等。程序写完了,但就是还发现程序中还有许多不完善得地方、不严谨得地方,如异常处理,在不按正确输入格式输入时,会出现程序错误或死了得情况.
指导教师批阅意见:
成绩评定:
指导教师签字:
年
月
日 备注:
注:1、报告内得项目或内容设置,可根据实际情况加以调整与补充。
2、教师批改学生实验报告时间应在学生提交实验报告时间后10 日内。
上一篇:嵌入式,综合应用实验报告,(1)
下一篇:课程规划报告