当前位置:
文档之家› 11021199实验一 线性表的插入与删除实验报告
11021199实验一 线性表的插入与删除实验报告
// 使用数组建立线性表类 class LinerList {
private: int d[1001]; int n,nl,m;
public: void initList(int mn) {
n = mn; nl = 1; }
// 初始化线性表
void insert(int a)
//向线性表中插入整数 a
要在原线性表中删除一个元素 b(在本实验中,保证 b 在线性表中),且仍保持线性表 的顺序存储结构,可以从线性表的第一个元素开始,往后逐个与新元素相比较,直到发现一 个元素与新元素相等。然后从当前位置的下一个元素开始,将后面所有元素都往前移动一个 位置,直到线性表的最后一个位置为止。显然,删除一个元素之后,线性表的长度减小了 1。 其算法如下。
(1) 定义一个有序(非递减)线性表,其最大容量为 1000,初始时为空。 (2) 从由 1 产生的数据文件中依次取前 N 个随机整数,陆续插入到此线性表中,
并要求在每次插入后保持线性表的有序性。最后将此有序线性表打印输出。 (3) 在由(2)产生的线性表中,依在 1 中产生的次序逐个将元素删除,直至表空 为止。 3. 以 N=100 及 N=400 分别运行 2 的程序,并比较它们的运行时间。 4. 编写一个程序,用插入排序依次将 1 中产生的 1000 个随机整数链接成有序链表(不 改变原随机数在存储空间中的顺序)。
fout<<data[i]<<endl;
//向文件输出
//cout<<data[i]<<endl;
//向标准输出输出
}
//step 3 以 1000 个随机数为数据源向线性表中插入 100 个数据 LinerList l1,l2; startt = clock(); //初始计时 l1.initList(110); for(i=1;i<=100;i++)
{
if(nl+1>=n) cout<<"Oh,GOsh,OVERFLOW!\n"; //判断溢出
else
{
int i,j,mm;
i=++nl;
while(i>=1)
{
mm=d[i-1];
if(mm>=a)
d[i]=mm;
else
{
d[i]=a;
break;
}
i--;
}t m) //删除下标为 m 的数据节点
// 利用链表构造线性表 ChainList cl; cl.initit(1001);
for(i=1;i<=1001;i++) {
cl.setitem(data[i]); }
cl.isort(); //进行插入排序 cl.printit(); //打印排序后列表 system("pause"); return 0; }
4. 方法说明
(1)随机整数的产生 产生随机整数的方法有很多,下面只介绍一种方法: 设 m=216,初值 y0=0,则递推公式 yi=mod(2053 yi-1+13849,m)产生 0 至 65535 之间的 随机整数。如要产生 0 至 999 之间的随机整数,只需做运算 xi=INT(1000yi/m)。
} } };
int main()
{
int i,j,m,data[1001];
clock_t startt,finisht;
//step 1 产生随机数
LRandom lrandom;
lrandom.initRand();
for(i=1;i<=1000;i++)
{
data[i]=lrandom.nextRand();
l1.insert(data[i]); l1.printIt(); for(i=1;i<=100;i++)
l1.del(i); l1.printIt(); finisht = clock(); //结束计时 cout<<(finisht-startt)<<endl; //打印计时 system("pause");
3. 实验步骤和要求
1. 事先编制好实验内容中 1、2、4 的程序(可参考本实验中的方法说明),并调 试通过。
2. 运行 1 的程序,生成 1000 个 0 至 999 之间的随机整数的数据文件,并打印输 出此数据文件。
3. 以 N=100 运行 2 的程序,并记下运行时间。 4. 以 N=400 运行 2 的程序,并记下运行时间。 5. 运行 4 的程序。 6. 整理程序清单和运行结果,写出实验报告。
实验一 线性表的插入与删除实验报告
110228 刘宇 11021199
1. 实验目的
掌握线性表在顺序分配下的插入与删除运算;掌握线性表的链式存储结构;掌握插 入排序的方法;并掌握一种产生随机数的方法。
2. 实验内容
1. 产生 1000 个 0 至 999 间的随机整数,并以产生的次序存入一个数据文件中。 2. 编制一个程序,依次实现以下功能:
输入:线性表 L(1:n),n 为线性表的长度,删除的元素 b(一定在线性表中)。 输出:删除 b 后的线性表 L(1:n)。
在上述算法中,从线性表的第一个元素开始寻找要删除的元素 b,实际上我们还可以从线 性表的最后一个元素开始寻找 b,其算法留给读者自行考虑。
(3)线性链表的插入排序 定义一个二列数组 A(1:1000,1:2),其中,A(i,1)(i=1,2,…,1000)依随机数产生的顺序存 放 1000 个数据,A(i,2)(i=1,2,…,1000)为链接指针,将 1000 个随机数链接成有序链表。其插 入排序的方法如下。 依次从数据文件中读入一个数据,将它按行顺序存放到数组 A 的第一列中,然后通过 相应行的第二列将它链接到已经有序的链表中。其过程为:将读入的数据依次与链表中各元 素进行比较,找到其应该插入的位置后,适当改变链指针,将其插入。其算法如下: 输入:1000 个随机整数。 输出:头指针为 H 的有序链表。
vm = pr->d; pr->d = tr->d; tr->d = vm; } tr=tr->next; } pr=pr->next; } } void printit() //打印线性表全体 { Lnode *pr; int i=1; pr = r->next; while(1)
{ cout<<i++<<' '<<(pr->d)<<' '; if(pr->next == NULL) break; pr=pr->next;
六、结果分析
结果 1: 事先编制好实验内容中 1、2、4 的程序(可参考本实验中的方法说明),并调试通过。 运行 1 的程序,生成 1000 个 0 至 999 之间的随机整数的数据文件,并打印输出此数据文件。 以 N=100 运行 2 的程序,并记下运行时间。
结果 2: 以 N=400 运行 2 的程序,并记下运行时间。
其中 mod(*) 是模运算,INT(*)是取整函数。 (2)线性表的插入与删除 在本实验中线性表是动态增长的。插入一个新元素后,为了使线性表仍保持有序,必须 要找到新元素应插入的位置。实际上这是一个插入排序的问题。 为了要将新元素插入到一个有序的线性表中,可以从原有序表的最后一个元素开始,往 前逐个与新元素比较,并将大于新元素的所有元素都往后移动一个位置,直到找到新元素应 插入的位置为止。显然,插入一个新元素后,表的长度也增加了 1。现假设用一个数组 L(1:m) 来存储线性表,其中 m 为最大容量(在本实验中为 m=1000);用一个变量 n 表示线性表的 长度(在本实验中,其初值为 n=0)。则可以得到将新元素插入到有序线性表的算法如下。 输入:数组 L(1:m),有序线性表 L(1:n),需插入的新元素 b。其中 n<m。 输出:插入 b 后的有序线性表 L(1:n)。
} void setitem(int a) //插入整数 a 到线性表中 {
q = (Lnode*)malloc(sizeof(Lnode)); q->d = a; q->next = NULL;
if(nl==1) {
r->next = q; p=q; nl++; } else { p->next = q; p = q; nl++; } }
结果 3: 编写一个程序,用插入排序依次将 1 中产生的 1000 个随机整数链接成有序链表(不改 变原随机数在存储空间中的顺序)。
实验反思:
本次实验内容为数据结构中最基础的线性表,通过利用数组和链表分表实现并处理不同 规模的数据,进一步理解数组与链表的存储方式、实现方法及效率区别。数组实现方案中, 随着数据规模的增大,运行时间急剧增加,而同样的操作对链表运行时间的影响不大。从另 一方面分析,在程序开发过程中,数组方式的开发难度明显小于链表,原因在于数组可以使 用下表进行索引,链表的指针操作则相对复杂抽象。使用面向对象的思想以 c++语言为平台 实现了两个线性表类,分别用数组和指针存储实现。具体使用指针调换节点顺序时,使用一 个跟班指针记录单向链表前驱,但仍因一时混乱造成了窘迫。使用指针时一定要逻辑清晰, 并且清楚指针的指向,以免指针访问非法数据区域,引起崩溃。
//step 3 以 1000 个随机数为数据源向线性表中插入 400 个数据 startt = clock(); l2.initList(410); for(i=1;i<=400;i++)
l2.insert(data[i]); l2.printIt(); for(i=1;i<=400;i++)