实验一 线性表应用类实验

实验一线性表应用类实验

一、 问题定义及需求分析

1. 问题描述

对线性表中的前M 个元素和后N 个元素整体互换。

2. 实验要求

设计元素整体互换的模拟程序。

a. 采用顺序表存储结构实现。

b. 采用链表存储结构实现。

3. 输入形式

输入数字M ,N 。

4. 输入值的范围

M 和N 都是由1到表长maxlen-1

(1)高效算法:M+N=50

(2)低效算法:M+N

5. 输出形式

互换过与互换前的线性表(含有元素位置以及元素数据)

6. 测试数据

顺序表:

(1)高效算法:M:45,N:5

(2)低效算法:M:45,N:5

二、 概要设计

1. 抽象数据类型的定义:

struct List

{

int data[maxlen];

int listlen;

} seqlist; //顺序表

2. 主程序流程图:

(1)高效算法:

(2)低效算法:

3. 函数执行情况说明:

(1)低效算法

①int main()

载入顺序表,接受屏幕输入的M 和N 的值。并且调用change(&seqlist.data[0], seqlist.listlen, x, y),输出换前换后的结果。

②int change(&seqlist.data[0], seqlist.listlen, x, y)

运用一个辅助空间ptr ,使前m 个元素与后n 个元素整体互换,ptr 为数

组头指针,length 为数组长度。含有判断流程,使得不符合输入要求的数据M 和N 被排除。

(2)高效算法

①int main()

载入顺序表,接受屏幕输入的M 和N 的值,并且调用

change(&seqlist.data[0], seqlist.listlen, x, y),输出换前换后的结果。

②int ListChange(int* ptr, int length)

给定头指针和序列长度,执行逆置功能

③int change(int* ptr, int length, int m, int n)

调用ListChange(int* ptr, int length),先将前M 个和后N 个元素整体的进

行逆置处理,再分别对前M 个和后N 个元素进行逆置处理。

三、详细设计

(1) 低效算法:

int change(int* ptr, int length, int m, int n) //一个辅助空间使

前m 个元素与后n 个元素整体互换,ptr 为数组头指针,length

为数组长度

{

if(M+N>表长最大值)

return -1;

if(前后调换数据个数相同) //中间数据不用移动

{

只需要把前后的元素一一对应地调换就可以

}

else if(M比N 大) //m>n,中间数据整体前移

{

前后元素对应调换

中间数据整体前移

}

}

else //m

{

前后元素对应调换

中间数据整体后移

}

int main()

{

存入50个数据元素

接受屏幕输入M 和N 的值

判断M 和N 的值是否符合要求

输入互换后的结果

}

(2) 高效算法:

int ListChange(int* ptr, int length) //给定头指针和序列长度,逆置

{

执行对定长的顺序表的逆置功能

}

int change(int* ptr, int length, int m, int n)

{

if(m + n !=50)

return -1;

n = 50 - m;

对整个顺序表逆置

对第一个数据到第m 个数据进行逆置

对于后n 个数据进行逆置

}

int main()

{

存入50个数据元素

接受屏幕输入M 和N 的值

判断M 和N 的值是否符合要求

输入互换后的结果

}

四、 调试分析

1. 在程序验收之前,使用顺序表储存结构实现中我只做了用低效算法实

现互换的程序,算法时间复杂度为O(n2) 。在程序验收后,我重新添加

了用高效算法实现元素互换的程序,算法时间复杂度为O(n)。

五、 使用说明:

按照程序中屏幕提示输入M 和N 的值并回车查看输出结果

六、 测试结果

(1) 低效算法

(2) 高效算法

七、 附录

(a)高效算法

#include

#include

#include //格式输出, setw()

using namespace std;

#define maxlen 50

struct List

{

int data[maxlen];

int listlen;

} seqlist; //顺序表

int ListChange(int* ptr, int length) //给定头指针和序列长度,逆置

{

int *p, *q, temp;

for(p = ptr, q = ptr + length; p

{

temp = *p;

*p = *q;

*q = temp;

}

return 0;

}

int change(int* ptr, int length, int m, int n)

{

if(m + n !=50)

return -1;

n = 50 - m;

ListChange(&seqlist.data[0], 50);

ListChange(&seqlist.data[0], m);

ListChange(ptr+m, 50-m);

return 1;

}

int main()

{

int i,x,y;

seqlist.listlen = 0;

for(i=0; i

{

seqlist.data[i] = i;

seqlist.listlen++;

}

cout

入M 和N: ";

cin>>x>>y;

if(-1 == change(&seqlist.data[0], seqlist.listlen, x, y))

cout 顺序表实际长度,则认为出错

cout

for(i=0; i

cout

//设置域宽

return 0;

}

(3) 低效算法

#include

#include

#include //格式输出, setw()

using namespace std;

#define maxlen 50

struct List

{

int data[maxlen];

int listlen;

}seqlist; //顺序表

int change(int* ptr, int length, int m, int n) //一个辅助空间使前m 个元素与后n 个元素整体互换,ptr 为数组头指针,length 为数组长度

{

int i,j;

int temp; //一个辅助空间

int* mark;

if(m+n>length)

return -1;

if(m == n) //前后调换个数相同,中间数据不用移动

{

for(i=0; i

{

temp = *ptr;

*ptr = *(ptr + length - n);

*(ptr + length - n) = temp;

ptr++;

}

}

else if(m > n) //m>n,中间数据整体前移

{

for(i=0; i

{

temp = *ptr;

*ptr = *(ptr + length - n);

*(ptr + length - n) = temp;

ptr++;

}

mark = ptr;

for(j=0; j

{

temp = *ptr;

for(i=n; i

{

*ptr = *(ptr + 1);

ptr++;

}

*ptr = temp;

ptr = mark;

}

}

else //m

{

for(i=0; i

{

temp = *ptr;

*ptr = *(ptr + length - n);

*(ptr + length - n) = temp;

ptr++;

}

mark = ptr + length - n;

for(j=0; j

{

ptr = mark;

temp = *ptr;

for(i=length-n+m; i>m; i--)

{

*ptr = *(ptr - 1);

ptr--;

}

*ptr = temp;

mark++;

}

}

return 0;

}

int main()

{

int i,x,y;

seqlist.listlen = 0;

for(i=0; i

{

seqlist.data[i] = i;

seqlist.listlen++;

}

cout

cin>>x>>y;

if(-1 == change(&seqlist.data[0], seqlist.listlen, x, y))

cout 顺序表实际长度,则认为出错,函数返回-1

cout

for(i=0; i

cout

return 0;

} //

实验一线性表应用类实验

一、 问题定义及需求分析

1. 问题描述

对线性表中的前M 个元素和后N 个元素整体互换。

2. 实验要求

设计元素整体互换的模拟程序。

a. 采用顺序表存储结构实现。

b. 采用链表存储结构实现。

3. 输入形式

输入数字M ,N 。

4. 输入值的范围

M 和N 都是由1到表长maxlen-1

(1)高效算法:M+N=50

(2)低效算法:M+N

5. 输出形式

互换过与互换前的线性表(含有元素位置以及元素数据)

6. 测试数据

顺序表:

(1)高效算法:M:45,N:5

(2)低效算法:M:45,N:5

二、 概要设计

1. 抽象数据类型的定义:

struct List

{

int data[maxlen];

int listlen;

} seqlist; //顺序表

2. 主程序流程图:

(1)高效算法:

(2)低效算法:

3. 函数执行情况说明:

(1)低效算法

①int main()

载入顺序表,接受屏幕输入的M 和N 的值。并且调用change(&seqlist.data[0], seqlist.listlen, x, y),输出换前换后的结果。

②int change(&seqlist.data[0], seqlist.listlen, x, y)

运用一个辅助空间ptr ,使前m 个元素与后n 个元素整体互换,ptr 为数

组头指针,length 为数组长度。含有判断流程,使得不符合输入要求的数据M 和N 被排除。

(2)高效算法

①int main()

载入顺序表,接受屏幕输入的M 和N 的值,并且调用

change(&seqlist.data[0], seqlist.listlen, x, y),输出换前换后的结果。

②int ListChange(int* ptr, int length)

给定头指针和序列长度,执行逆置功能

③int change(int* ptr, int length, int m, int n)

调用ListChange(int* ptr, int length),先将前M 个和后N 个元素整体的进

行逆置处理,再分别对前M 个和后N 个元素进行逆置处理。

三、详细设计

(1) 低效算法:

int change(int* ptr, int length, int m, int n) //一个辅助空间使

前m 个元素与后n 个元素整体互换,ptr 为数组头指针,length

为数组长度

{

if(M+N>表长最大值)

return -1;

if(前后调换数据个数相同) //中间数据不用移动

{

只需要把前后的元素一一对应地调换就可以

}

else if(M比N 大) //m>n,中间数据整体前移

{

前后元素对应调换

中间数据整体前移

}

}

else //m

{

前后元素对应调换

中间数据整体后移

}

int main()

{

存入50个数据元素

接受屏幕输入M 和N 的值

判断M 和N 的值是否符合要求

输入互换后的结果

}

(2) 高效算法:

int ListChange(int* ptr, int length) //给定头指针和序列长度,逆置

{

执行对定长的顺序表的逆置功能

}

int change(int* ptr, int length, int m, int n)

{

if(m + n !=50)

return -1;

n = 50 - m;

对整个顺序表逆置

对第一个数据到第m 个数据进行逆置

对于后n 个数据进行逆置

}

int main()

{

存入50个数据元素

接受屏幕输入M 和N 的值

判断M 和N 的值是否符合要求

输入互换后的结果

}

四、 调试分析

1. 在程序验收之前,使用顺序表储存结构实现中我只做了用低效算法实

现互换的程序,算法时间复杂度为O(n2) 。在程序验收后,我重新添加

了用高效算法实现元素互换的程序,算法时间复杂度为O(n)。

五、 使用说明:

按照程序中屏幕提示输入M 和N 的值并回车查看输出结果

六、 测试结果

(1) 低效算法

(2) 高效算法

七、 附录

(a)高效算法

#include

#include

#include //格式输出, setw()

using namespace std;

#define maxlen 50

struct List

{

int data[maxlen];

int listlen;

} seqlist; //顺序表

int ListChange(int* ptr, int length) //给定头指针和序列长度,逆置

{

int *p, *q, temp;

for(p = ptr, q = ptr + length; p

{

temp = *p;

*p = *q;

*q = temp;

}

return 0;

}

int change(int* ptr, int length, int m, int n)

{

if(m + n !=50)

return -1;

n = 50 - m;

ListChange(&seqlist.data[0], 50);

ListChange(&seqlist.data[0], m);

ListChange(ptr+m, 50-m);

return 1;

}

int main()

{

int i,x,y;

seqlist.listlen = 0;

for(i=0; i

{

seqlist.data[i] = i;

seqlist.listlen++;

}

cout

入M 和N: ";

cin>>x>>y;

if(-1 == change(&seqlist.data[0], seqlist.listlen, x, y))

cout 顺序表实际长度,则认为出错

cout

for(i=0; i

cout

//设置域宽

return 0;

}

(3) 低效算法

#include

#include

#include //格式输出, setw()

using namespace std;

#define maxlen 50

struct List

{

int data[maxlen];

int listlen;

}seqlist; //顺序表

int change(int* ptr, int length, int m, int n) //一个辅助空间使前m 个元素与后n 个元素整体互换,ptr 为数组头指针,length 为数组长度

{

int i,j;

int temp; //一个辅助空间

int* mark;

if(m+n>length)

return -1;

if(m == n) //前后调换个数相同,中间数据不用移动

{

for(i=0; i

{

temp = *ptr;

*ptr = *(ptr + length - n);

*(ptr + length - n) = temp;

ptr++;

}

}

else if(m > n) //m>n,中间数据整体前移

{

for(i=0; i

{

temp = *ptr;

*ptr = *(ptr + length - n);

*(ptr + length - n) = temp;

ptr++;

}

mark = ptr;

for(j=0; j

{

temp = *ptr;

for(i=n; i

{

*ptr = *(ptr + 1);

ptr++;

}

*ptr = temp;

ptr = mark;

}

}

else //m

{

for(i=0; i

{

temp = *ptr;

*ptr = *(ptr + length - n);

*(ptr + length - n) = temp;

ptr++;

}

mark = ptr + length - n;

for(j=0; j

{

ptr = mark;

temp = *ptr;

for(i=length-n+m; i>m; i--)

{

*ptr = *(ptr - 1);

ptr--;

}

*ptr = temp;

mark++;

}

}

return 0;

}

int main()

{

int i,x,y;

seqlist.listlen = 0;

for(i=0; i

{

seqlist.data[i] = i;

seqlist.listlen++;

}

cout

cin>>x>>y;

if(-1 == change(&seqlist.data[0], seqlist.listlen, x, y))

cout 顺序表实际长度,则认为出错,函数返回-1

cout

for(i=0; i

cout

return 0;

} //


相关文章

  • 高等数学大纲(物理类)
  • <高等数学>教学大纲 课程名称:高等数学 适用层次.专业:理科.工科各专业 学 时:320学时 学 分:20学分 课程类型:通识教育平台课 课 程 性 质:必修课 一.课程的教学目标与任务 高等数学是理.工.管等相关专业的第一基 ...查看


  • 非线性电阻研究报告
  • 电工电子综合实验论文 --非线性电阻电路的研究 班级:09042202 学号:0904220206 姓名:刘雪莲 一:摘要 当电阻两端的电压与流过的电阻的电流不成比例关系时,伏安特性是曲线,电阻不是一个常数,随电压.电流变动,称之为非线性电 ...查看


  • 线性表及其应用实验报告
  • 数据结构实验报告 实验名称:线性表及其应用 班 级:12级电气本2 学 号:2012081227 姓 名:赵雪磊 指导教师:梁海丽 日 期:2013年9月9日 数学与信息技术学院 一. 实验目的 1.掌握线性表的概念,理解线性表的顺序.链式 ...查看


  • 教育统计学大纲
  • 高纲1428 江苏省高等教育自学考试大纲 28063 教育统计学 南京师范大学编 江苏省高等教育自学考试委员会办公室 Ⅰ 课程的性质与设置目的 <教育统计学>是研究如何整理.分析在包括教育实验.教育调查等教育研究中所获取的数字资 ...查看


  • 线性范围试验测定实验报告
  • 线性范围试验测定实验报告 一. 实验目的 线性范围试验用于评价候选方法的分析测量范围. 二. 实验材料 1. 试剂:40mmol/L葡萄糖标准溶液.5.55mmol/L葡萄糖标准溶液.1.2号血清质控品.GOD- POD 试剂盒 2. 器材 ...查看


  • 哈工大无线电定位原理与应用实验报告
  • Harbin Institute of Technology 无线电定位原理实验报告 课程名称: 无线电定位原理与应用 班级: 姓名: 学号: 同组人: 学号: 指导教师: 张云 实验时间: 实验成绩: 哈尔滨工业大学 1. 实验一 调频法 ...查看


  • 智能控制实验报告
  • 实验一 模糊控制器设计 一. 目的和要求 1. 目的 (1) 通过本次实验,进一步了解模糊控制的基本原理.模糊模型的建立和模糊控制器的设计过程. (2) 掌握MATLAB模糊逻辑工具箱的图形用户界面设计模糊控制器的过程. (3) 提高控制系 ...查看


  • 空间分析实验总结
  • 一.实验概述........................................................................................................ 2 二.实验专题. ...查看


  • 自评报告-辽宁石油化工大学理学院
  • 自评报告 辽宁石油化工大学大学理学院 数学系线性代数教研组 二零零九年三月八日 一.教学队伍 1-1课程负责人与主讲教师 课程负责人情况简介 课程负责人 宋岱才,男,1954年1月生,教授. 1982年1月毕业于石油大学(华东)计算数学专业 ...查看


  • 神经网络在数据拟合方面的应用
  • 神经网络在数据拟合方面的应用 摘要 本文将讲述人工神经网络及其数据拟合中的应用.人工神经网络是从信息处理角度对人脑神经元网络进行抽象,建立某种简单模型,按不同的连接方式组成不同的网络.它在模式识别.智能机器人.自动控制.预测估计.生物.医学 ...查看


热门内容