选课时间段: 周四6、7、8、9 序 号:
实验报告
课程名称: 数据结构
实验名称: 顺序表的实现
指导教师:
学生姓名:
学生学号:
实验日期: 20xx年4月11日
1
一、实验目的
1、 熟悉实验环境
2、 理解顺序表的基本操作
3、 了解顺序表的建立和输出
4、 掌握顺序表的插入、删除、合并和归并等实现方法
二、实验内容
三、实验步骤
1.需求分析
本演示程序用C语言编写,完成顺序表的生成,任意位置的插入、删除,以及确定某一元素在顺序表中的位置。
① 输入的形式和输入值的范围:插入元素时需要输入插入的位置和元素的值;删除元素时输入删除元素的位置;查找操作时需要输入元素的值。在所有输入中,元素的值都是整数。
② 输出的形式:在所有三种操作中都显示操作是否正确以及操作后顺序表的内容。其中删除操作后显示删除的元素的值,查找操作后显示要查找元素的位置。
③ 程序所能达到的功能:完成顺序表的生成(通过插入操作)、插入、删除、查找操作。
④ 测试数据:
A. 插入操作中依次输入11,12,13,14,15,16,生成一个顺序表
B. 查找操作中依次输入12,15,22返回这3个元素在顺序表中的位置
C. 删除操作中依次输入2,5,删除位于2和5的元素
2.概要设计
1)为了实现上述程序功能,需要定义顺序表的抽象数据类型: ADT LinkList { 数据对象:D={ai|ai∈IntegerSet,i=0,1,2,?,n,n≥0} 数据关系:R={<ai,ai+1>|ai,ai+1 ∈D} 基本操作: InitLinkList(&L) 操作结果:构造一个空的顺序表L. InsLinkList(&L,pos,e) 初始条件:顺序表L已存在 2
} 操作结果:将元素e插入到顺序表L的pos位置 DelLinkList(&L,pos,&e) 初始条件:顺序表L已存在 操作结果:将顺序表L中pos位置的元素删除,元素值置入e中返回 LocLinkList(L,e) 初始条件:顺序表L依存在 操作结果:顺序表L中查找是否元素e,若存在,返回元素在表中的位置;若不存 在,返回-1. Menu() 操作结果:在屏幕上显示操作菜单 2)本程序包含7个函数: ① 主函数main() ② 初始化顺序表函数InitLinkList() ③ 显示操作菜单函数menu() ④ 显示顺序表内容函数dispLinkList() ⑤ 插入元素函数InsLinkList() ⑥ 删除元素函数DelLinkList() ⑦ 查找元素函数LocLinkList()
3.详细设计
实现概要设计中定义的所有的数据类型,对每个操作给出C代码算法。对主程序和其他模块也都需要写出C代码算法。
1) 结点类型和指针类型
????????????
2) 顺序表的基本操作
bool InitLinkList(LinkList &L) (C代码算法) void DispLinkList(LinkList L) (C代码算法) void menu() (C代码算法) bool InsLinkList(LinkList &L,int pos,int e) (C代码算法) bool DelLinkList(LinkList &L,int pos,int &e) (C代码算法) int LocLinkList(LinkList L,int e) (C代码算法)
3) 其他模块C代码算法
3
4.使用说明
程序名为????????.exe,运行环境为DOS。程序执行后显示 ======================== 0----EXIT 1----INSERT 2----DELETE 3----LOCATE ======================= SELECT:
在select后输入数字选择执行不同的功能。要求首先输入足够多的插入元素,才可以进行其他的操作。每执行一次功能,就会显示执行的结果(正确或错误)以及执行后顺序表的内容。
选择0:退出程序 选择1:显示“INSERT pos,e =” , 要求输入要插入的位置和元素的值(都是整数)。 选择2:显示“DELETE pos =” , 要求输入要删除元素的位置,执行成功后返回元素的值。 选择3:显示“LOCATE e = ” , 要求输入要查找元素的值,执行成功后返回元素在表中的位置
6.测试结果
1) 建立顺序表:
? 选择1,分别输入(0,11),(0,12),(0,13),(0,14)(0,15)。得到顺序表(15,14,13,12,11)
2) 插入:
? 选择1输入(1,100),得到顺序表(15,100,14,13,12,11)
? 选择1输入(-1,2),显示输入错误
? 选择1输入(7,2),显示输入错误
? 选择1输入(6,2),得到顺序表(15,100,14,13,12,11,2)
3) 删除:
? 选择2,输入1。返回e=100,得到顺序表(15,14,13,12,11,2) ? 选择2,输入0。返回e=15,得到顺序表(14,13,12,11,2)
? 选择2,输入4。返回e=2,得到顺序表(14,13,12,11)
? 选择2,输入5。返回输入错误
4) 查找
? 选择3,输入14。返回pos=0
? 选择3,输入100。返回输入错误
四、实验总结(结果分析和体会)
4
实验一 集合的交与并
1、 顺序表 (Sequential List) 顺序表的定义和特点
定义:n( ? 0)个表项的有限序列(a1, a2, ?, an)ai是表项,n是表长度。
特点:顺序存取遍历 逐项访问 从前向后 从后向前 从两端向中间
2、 顺序表的应用
(1)集合的“并”运算:是指两个集合的所有元素,最后放在一个集合的过程(若有相等的则取一个即可)。具体步骤是:先从一个集合A中取一个数,然后和另一个集合的首个元素比较,若不相等则保存A的这个元素,然后B中的第一个元素在和A中的第二个元素比较,一次类推。若A中的第一个元素和B中的第一个元素相等,则删除B中的第一个元素,然后A中第一个元素和B中的第二个元素比较,直到不相等才转到B中的元素和A中的元素比较。
主要用到的函数有:获取元素LB.Get(),搜素元素LA.Find (),插入元素LA.Insert(),而这些函数的定义都放在seqlist.h这个文件中,具体的实现放在seqlist.cpp这个工程文件中。 主要程序有:
【Seqlist.h】
#ifndef SEQLIST_H
#define SEQLIST_H
#include <iostream>
using namespace std;
const int defaultSize = 30;
class SeqList {
int *data; //顺序表存储数组
int MaxSize; //最大允许长度
int last; //当前最后元素下标
public:
SeqList ( int sz = defaultSize );
~SeqList ( ) { delete [ ] data; }
int Length ( ) const { return last+1; }
int Find ( int& x ) const; //查找
int Locate ( int i ) const; //定位
int Insert ( int & x, int i ); //插入
int Remove ( int & x ); //删除
int Show ();
int Next ( int & x ) ; //后继
int Prior ( int & x ) ; //前驱
int IsEmpty ( ) { return last ==-1; }
int IsFull ( ) { return last == MaxSize-1; }
int Get ( int i ) { //提取
return i < 0 || i > last?NULL : data[i];
}
} ;
#endif
【Seqlist.cpp】
#include "SeqList.h"
SeqList :: SeqList (int sz)
{
if (sz>0)
{
MaxSize = sz;
last = -1;
data = new int[MaxSize]; if ( data == NULL)
{
MaxSize=0;
last = -1;
return;
}
}
}
int SeqList :: Find (int& x) const //搜索函数 {
int i = 0;
while ( i <= last && data[i] != x )
i++;
if ( i > last ) return -1;
else return i;
}
int SeqList :: Insert (int& x, int i )
{
//在表中第 i 个位置插入新元素 x
if ( i < 0 || i > last+1 || last == MaxSize-1 )
return 0; //插入不成功 else
{
last++;
for ( int j = last; j > i; j-- )
data[j] = data[j -1];
data[i] = x; return 1; //插入成功 }
}
//template <class Type>
int SeqList :: Remove ( int& x )
{
//在表中删除已有元素 x
int i = Find (x); //在表中搜索 x
if ( i >= 0 )
{
last-- ;
for ( int j = i; j <= last; j++ )
data[j] = data[j+1];
return 1; //成功删除 }
return 0; //表中没有 x }
//template <class Type>
int SeqList ::Show()
{
if(last < 0 )
{
cout<< "the Seqlist is empty" << endl;
return 0; //没有可输出内容 }
else
{
for(int i=0 ; i<=last ; i++)
cout<< data[i] <<" ";
return 1; //输出成功
}
cout << endl;
}
集合的并运算函数程如下:
template <class Type>
void Union ( SeqList<Type> & LA,
SeqList<Type> & LB ) { int n = LA.Length ( );
int m = LB.Length ( );
for ( int i = 1; i <= m; i++ ) {
Type x = LB.Get(i); //在LB中取一元素 int k = LA.Find (x); //在LA中搜索它
if ( k == -1 ) //若未找到插入它
{ LA.Insert (n+1, x); n++; }
}
}:
综上所述,要完成集合的并运算,需要这样几步分程序,首先所用函数的定义(头文件),放在.h文件当中,其次各个函数的算法,例如查找,插入,取数(这些都是用来给集合的并作铺垫的)等放在一个工程当中,然后直接调用就行了。
(2)集合的“交”运算:是指两个集合的所有元素,若有相同的元素最后放在一个集合的过程。具体步骤是:先从一个集合A中取一个数,然后和另一个集合的首个元素比较,若相等则保存A的这个元素,然后B中的第二个元素在和A中的第二个元素比较,一次类推。若A中的第一个元素和B中的第一个元素不相等,则B中第一个元素和A中的第二个元素比较,直到相等才转到A中的元素和B中的元素比较。
主要用到的函数和集合的“并”相同,不同点只是交采用的函数是元素的删除,而“并”采用的是元素的插入,区别主要就在LA.Insert()和LA.Remove ()。
int SeqList :: Remove ( int& x ) //元素的删除
{
//在表中删除已有元素 x
int i = Find (x); //在表中搜索 x
if ( i >= 0 )
{
last-- ;
for ( int j = i; j <= last; j++ )
data[j] = data[j+1];
return 1; //成功删除
}
return 0; //表中没有 x
}
3、顺序表的结构定义:
#define maxlen 50 //定义顺序表中元素个数最多有几个
typedef struct
{
elementtype data[maxlen]; //elementtype是元素的类型 依具体情况而定
int listlen; //便于时刻了解顺序表里元素的个数
}seqlist; //顺序表的名称 不妨为seqlist
声明顺序表类型变量:
seqlist L,L1;
如顺序表的每个结点占用len个内存单元,用location (ki)表示顺序表中第i个结点ki所占内存空间的第1个单元的地址。则有如下的关系:location (ki+1) = location (ki) +len
location (ki) = location(k1) + (i-1)len
存储结构要体现数据的逻辑结构,顺序表的存储结构中,内存中物理地址相邻的结点一定具有顺序表中的逻辑关系。
4、实验总结:
(1)求两个集合的并集
该算法是求两个集合s1和s2的并集,并将结果存入s引用参数所表示的集合中带回。 首先把s1集合复制到s中,然后把s2中的每个元素依次插入到集合s中,当然重复的元素不应该被插入,最后在s中就得到了s1和s2的并集,也就是在s所对应的实际参数集合中得到并集。
(2)求两集合的交集
此的算法首先把存放结果的集合s变成一个空集,然后依次从s2集合中取出每一个元素,利用它去查找s1集合,看是否存在,若存在则把它写入交集s中,这样写入s中的元素既属于s1又属于s2。此算法中,从s1中查找一个元素的时间复杂度为O(n),所以整个算法的时间复杂度为O(n*m)。
选课时间段周四6789序号实验报告课程名称数据结构实验名称顺序表的实现指导教师学生姓名学生学号实验日期20xx年4月11日1一实验…
一实验目的二实验内容和要求三源代码1顺序表的代码2单链表的代码四测试结果1顺序表的测试结果2单链表的测试结果五心得体会实验一线性表…
数据结构实验报告1实验目的结出本次实验所涉及并要求掌握的知识点1学会定义线性表的顺序存储类型实现C程序的基本结构对线性表的一些基本…
实验1顺序表的操作一12345678实验要求输入一组整型元素序列建立顺序表实现该顺序表的遍历在该顺序表中进行顺序查找某一元素查找成…
实验一顺序表的插入和删除实验目的1掌握使用TurboC上机调试线性表的基本方法2掌握线性表的基本操作插入删除在顺序存储结构上的运算…
数学与计算科学学院实验报告实验项目名称线性表的顺序表示和实现所属课程名称数据结构A实验类型验证性实验日期20xx年4月5号班级信管…
数据结构随堂实验实验报告指导教师姓名学号班级专业计算机科学与技术目录C语言结构体与指针1线性顺序表的实现及操作3串的匹配与替换6线…
实验1顺序表的操作一12345678实验要求输入一组整型元素序列建立顺序表实现该顺序表的遍历在该顺序表中进行顺序查找某一元素查找成…
实验一顺序表的基本操作一实验目的掌握线性表的顺序表基本操作建立插入删除查找合并打印等运算二实验要求包含有头文件和main函数1格式…
太原理工大学现代科技学院计算机软件技术基础课程实验报告专业班级学号姓名指导教师太原理工大学现代科技学院实验报告装订线实验名称顺序表…