首页 > 心得体会 > 读后感 / 正文
实验一线性表操作实验报告
2020-12-18 10:13:11 ℃XX大学计算机学院实验报告 课程名称 数据结构
实验名称__线性表操作 实验报告要求:1.实验目的 2.实验内容 3.实验步骤
4.运行结果 5.流程图 6.实验体会
一、实验目的 1 熟悉并掌握线性表的逻辑结构、物理结构。
2 熟悉并掌握顺序表的存储结构、基本操作和具体的函数定义。
3 熟悉VC++程序的基本结构,掌握程序中的用户头文件、实现文件和主文件之间的相互关系及各自的作用。
4 熟悉VC++操作环境的使用以及多文件的输入、编辑、调试和运行的全过程。
二、实验要求
1 实验之前认真准备,编写好源程序。
2 实验中认真调试程序,对运行结果进行分析,注意程序的正确性和健壮性的验证。
3 不断积累程序的调试方法。
三、实验内容
基本题: 1 对元素类型为整型的顺序存储的线性表进行插入、删除和查找操作。
源程序:
#include<iostream.h> #include<conio.h> #include<stdlib.h>
const LIST_INIT_SIZE=10; const LISTINCREMENT=1;
typedef struct {
int
*elem;
int length;
int listsize; }SqList;
void InitList_Sq(SqList&L)
//构造一个空的线性表L {
L.elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int));
if(!L.elem)
exit(0);
//存储分配失败
L.length=0;
//空表长度为0
L.listsize=LIST_INIT_SIZE;
//初始存储容量
cout<<“OK!“<<endl; }
void ListInsert_Sq(SqList&L,int i,int j)
//在顺序线性表L中第i个位置之前插入新的元素j,
//i的合法值为1<=i<=ListInsert_Sq(L)+1 {
if(i<1||i>L.length+1)
cout<<“ERROR!“<<endl;
//i值不合法
if(L.length>=L.listsize)
//当前存储空间已满,增加分配
{
int *newbase=(int*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(int));
if(!newbase)
exit(0);
//存储分配失败
L.elem=newbase;
//新基址
L.listsize+=LISTINCREMENT;
//增加存储容量
}
int *q=&(L.elem[i-1]);
for(int*p=&(L.elem[L.length-1]);p>=q;--p)
*(p+1)=*p;
*q=j;
++L.length;
cout<<“OK!“<<endl; }//ListInsert_Sq
void ListDelete_Sq(SqList&L,int i,int&j)
//在顺序线性表L中删除第i个元素,并用j返回其值
//i的合法值为1<=i<=ListInsert_Sq(L) {
if((i<1)||(i>L.length))
cout<<“ERROR!“<<endl;
//i值不合法
int *p=&(L.elem[i-1]);
//p为被删除元素的位置
j=*p;
//被删除元素的值赋给j
int *q=L.elem+L.length-1;
//表尾元素的位置
for(++p;p<=q;++p)
*(p-1)=*p;
--L.listsize;
//被删除元素之后的元素左移
cout<<“OK!“<<endl;
//表长减1 }//ListDelete_Sq
bool compare(int m,int n) {
if(m==n)
return true;
else
return false; }
int LocateElem_Sq(SqList L,int j)
//在顺序线性表L中查找第1个值与j满足compare()的元素的位序
//若找到,则返回其在L中的位序,否则返回0 {
int i=1;
//i的初值为第1个元素的位序
int *p=L.elem;
//p的初值为第1个元素的存储位置
while(i<=L.length&&!compare(*p,j))
{
++i;
p++;
}
if(i<=L.length)
return i;
else
return 0; }//LocateElem_Sq
void disp(SqList&L) {
int *p=L.elem;
for(int i=0;i<L.listsize;i++)
{
cout<<*p<<“
“;
p++;
} }
void main() {
SqList List;
InitList_Sq(List);
int *p=List.elem;
int m,n,j,k,x,y;
for(int i=0;i<List.listsize;i++)
{
cin>>x;
*p=x;
p++;
List.length++;
}
cout<<“插入请按1;删除请按2;寻找请按3“<<endl;
for(k=0;k=10;k++)
{
cin>>y;
if(y==1)
{
cout<<“请输入插入位置和元素的值:“<<endl;
cin>>m>>n;
ListInsert_Sq(List,m,n);
disp(List);
}
else if(y==2)
{
cout<<“请输入要删除第几个元素:“<<endl;
cin>>m;
ListDelete_Sq(List,m,j);
cout<<j<<endl;
disp(List);
}
else
{
cout<<“请输入所要查找的元素:“<<endl;
cin>>m;
cout<<LocateElem_Sq(List,m)<<endl;
}
}
cout<<endl; } 运行结果:
加强、提高题:
2、编写一个求解Josephus问题的函数。用整数序列1, 2, 3, ……, n表示顺序围坐在圆桌周围的人。然后使用n = 9, s = 1, m = 5,以及n = 9, s = 1, m = 0,或者n = 9, s = 1, m = 10作为输入数据,检查你的程序的正确性和健壮性。最后分析所完成算法的时间复杂度。定义JosephusCircle类,其中含完成初始化、报数出圈成员函数、输出显示等方法。(可以选做其中之一) 加强题:
1、采用数组作为求解过程中使用的数据结构。
提高题:
2、采用循环链表作为求解过程中使用的数据结构。运行时允许指定任意n、s、m数值,直至输入 n = 0 退出程序。
源程序:
(1)加强:
#include <iostream.h> #include <conio.h> #include <stdlib.h>
int a[100]; int josephus(int n,int s,int m) {
if(!(n*s*m))
{
cout<<“输入错误!!!“<<endl;
exit(0);
}
int x=1,y=n;
int i=s-1;
int j;
while(y)
{
for(i=0;i<n;i++)
{
if(a[i]+1)
a[i]=x++;
if(a[i]==m)
{ a[i]=-1;
cout<<i+1<<“出局!“<<endl;
x=1;
y--;
}
}
for(j=0;j<n;j++)
{
if(a[j]+1)
a[j]=x++;
if(a[j]==m)
{
a[j]=-1;
x=1;
y--;
if(!y)
break;
else
cout<<j+1<<“出局!“<<endl;
}
}
}
return (j+1); }
void main() {
int n,s,m,y=0;
int x;
do{
for(int i=0;i<100;i++)
{a[i]=0;}
cout<<“请输入参加游戏的总人数:“<<endl;
cin>>n;
cout<<“请输入开始人的位置与报数长度:“<<endl;
cin>>s;
cin>>m;
x=josephus(n,s,m);
cout<<x<<“胜出!“<<endl;
cout<<“请选择:“<<endl;
cout<<“1.重新游戏。
2.退出程序。:“<<endl;
cin>>y;
}while(y==1);
getch(); }
运行结果:
(2)提高:
#include<iostream> using namespace std;
typedef struct LNode {
struct LNode *next;
int a; }LNode,*LinkList;
class JosephouCircle
//定义一个类包括三个元素 { public:
void SetValue();
void PickOut(); private:
int n;
int s;
int m; };
void JosephouCircle::SetValue()
//设置初值的大小 {
cout<<“请输入参加游戏的总人数:“<<endl;
cin>>n;
cout<<“请输入开始人的位置:“<<endl;
cin>>s;
cout<<“请输入报数长度:“<<endl;
cin>>m; }
void JosephouCircle::PickOut() {
LinkList L;
LNode *p,*q;
int j,k;
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
LNode*r;
r=L;
for (int i=1;i<=n;++i)
// 构建一个循环链表
{
p=(LinkList)malloc(sizeof(LNode));
p->a=i;
p->next=NULL;
r->next=p;
r=p;
}
p->next=L->next;
p=L->next;
j=1;
while(p&&j<s)
{
p=p->next;++j;
}
for(i=1;i<=n;i++)
{
for(j=1;j<m-1;j++)
{
p=p->next;
}
q=p->next;p->next=q->next;
p=q->next;
k=q->a;
cout<<“输出的结果为:“<<k<<endl;
free(q);
} }
int main(int argc,char* argv[]) {
JosephouCircle Jo1;
Jo1.SetValue();
Jo1.PickOut();
return 0; } 运行结果:
四、实验体会与总结 1、对于线性链表和顺序表都属于线性表问题,但是线性链表比顺序表要灵活,方便; 2、线性表在做元素寻找的操作的时候,必须从头结点开始寻找。
体会:
在编程序的时候,我们每个人肯定会遇到许多问题,我遇到的问题是:当我在运行程序的时候,在输入一个元素后,程序就不继续做下面的操作也不停止运行,自己寻找并修改了好久都没发现问题的所在,最后实在没办法,就去问同学,结果终于发现是一条语句在编写时出现了错误。所以,以后再写程序的时候我一定要再认真仔细一点仔细点。
教师评价 优 良 中 及格 不及格 教师签名 日期
- 上一篇:XX乡2020年度综治办工作总结
- 下一篇:病媒生物防制工作总结
猜你喜欢
- 2023-11-04 2023伊索寓言名著读后感6篇(精选文档)
- 2023-11-01 天才少年维克多小说读后感作文3篇
- 2023-11-01 海底两万里读后感左右6篇(2023年)
- 2023-10-31 2023年《教师怎样说话才有效》的读后感5篇【完整版】
- 2023-10-31 2023年初三的雷锋的故事读后感8篇(范文推荐)
- 2023-10-29 中国梦读后感范文14篇【通用文档】
- 2023-10-28 2023《红色书籍》的读后感10篇
- 2023-10-28 2023年《星星之火,可以燎原》读后感12篇
- 2023-10-28 2023年度担当读后感4篇(范文推荐)
- 2023-10-28 卓有成效的管理者读后感优秀3篇(完整)
- 搜索
-
- 立足岗位,履行职责,充分发挥党员的先 07-01
- 2020年党员干部学习第三次中央新疆工作 10-20
- 2021国家开放大学电大专科《汽车维修企 11-17
- 《关于正确处理人民内部矛盾问题》读后 01-21
- 2020年1月国开(中央电大)汉语言专科 10-12
- 积极分子转预备党员自我介绍发言稿三篇 09-10
- 《总也倒不了老屋》读后感,菁选五篇( 03-21
- 2020年第三季度意识形态工作分析研判报告 09-16
- “共产党员不准信仰宗教和不参与宗教活 06-15
- 国开(中央电大)专科《商务英语1》形考 06-12
- 网站分类
-
- 标签列表
-