数据结构实验一线性表

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构与算法

实验报告

实验一:线性表操作实验

—用循环链表实现约瑟夫环问题

******

学号:*************

班级:14信科二班

二〇一六年十月

实验一 线性表操作实验

【实验内容】

实现线性表的初始化和插入删除操作

提高部分实验:用循环链表实现约瑟夫环问题

【实验目的】

掌握线性表的顺序映象和链式映象方式,能熟练掌握链表结构的使用。

【问题描述】

一个旅行社要从n 个旅客中选出一名旅客,为他提供免费的环球旅行服务。旅行社安排这些旅客围成一个圆圈,从帽子中取出一张纸条,用上面写的正整数m(

要求:用C 或C++语言实现,对某个给定的n 和m (例如n=7和m=3),给出被淘汰出列的旅客编号序列,以及最终的幸存者。 要求实验结果上机演示,最终以实验报告(附原程序)的方式递交。

【问题的实现】

一、线性表初始化和插入删除操作

(1)抽象数据类型

ADT SqList {

数据对象:0}n n,,1,2,3,i Elem Set,a |{a i i ≥⋯=∈=D

数据关系: n}

,2,3,i D,a ,a |a ,a {1i 1-i i 1-i ⋯=∈=R 基本操作: InitList_Sq(&L)

操作结果:构造一个空的线性表L 。

GetElem(L,i,&e)

初始条件:线性表L 已存在,)(L L istLength i 1≤≤。

操作结果:用e 返回L 中第i 个元素的值。

ListInsert_Sq(&L,i,e)

初始条件:线性表L 已存在,1istLength i 1+≤≤)

(L L 。 操作结果:在L 中第i 个位置之前插入新数据元素e ,L 长度 加1。

ListDelete_Sq(&L,i,e)

初始条件:循环链表L 已存在且非空,)(L L istLength i 1≤≤。

操作结果:删除L 第i 个数据元素,用e 返回其值,L 长度 减1。

ListPrint_Sq (&L )

初始条件:线性表L 已存在。

操作结果:输出线性表。

} ADT SqList

(2)主要实现思路:

首先定义结点结构,然后构建空线性表,完成初始化;

其次构建GetElem 函数用以返回线性表中元素值;

据题意完成线性表插入和删除函数的构建;

定义一个线性表输出函数以方便检验插入删除操作的运行结果;

定义主函数,总体完成以上所有函数功能的实现。

二、循环链表实现约瑟夫环问题

(1)抽象数据类型

ADT LNode {

数据对象:0}n n,,1,2,3,i Elem Set,a |{a i i ≥⋯=∈=D

数据关系: n}

,2,3,i D,a ,a |a ,a a ,a {1i 1-i i 1-i 1n ⋯=∈=,R

} ADT LNode

(2)主要实现思路:

首先定义结点结构,一个数据域和一个指针域;

定义头指针和尾指针;

定义主函数:

1)实现旅客数n 与报数值m 输入

2)用for 循环构建结点输入旅客序列,建立循环链表

3)报数淘汰:

引入sum 计数、定义指针p 指向淘汰者;

指针tail 为当前位置,定义指针q 为tail 后继指针,通过tail 来指向q 的位置,实现删除淘汰选手操作;

用while 循环报数淘汰直到列表中只剩一人,跳出循环;

最后剩下一人即幸运获奖者,输出幸运获奖者实现约瑟夫环问题的解决。

【总结】

两个实验结果都基本实现了问题的要求。

对于提高部分实验,有两点改进的地方:

1.可以把循环链表的建立和报数淘汰两部分写成两个函数,再在主函数中调用,这样代码结构更加清晰明确。

2.旅客信息可以结合数组和指针添加姓名进去。

附件:

代码一:线性表初始化和插入删除

#include

#include

#include

#define LIST_INIT_SIZE 100

#define LISTINCREMENT 10

#define OVERFLOW -2

typedef struct

{

char *elem;

int length;

int listsize;

}SqList;

//构造一个空的线性表L

int InitList_Sq(SqList *L){

L->elem=(char*)malloc(LIST_INIT_SIZE*sizeof(char));

if(!L->elem) exit(OVERFLOW);

L->length=0;

L->listsize=LIST_INIT_SIZE;

return 0;

}

//获取某个元素

int GetElem(SqList *L,int i,char *e)

{

if(L->length == 0 || i < 1 || i > L->length)

return -1;

*e = L->elem[i - 1];

相关文档
最新文档