好文档 - 专业文书写作范文服务资料分享网站

单链表实验报告

天下 分享 时间: 加入收藏 我要投稿 点赞

计算机与信息技术学院综合性、设计性实验报告

专业:网络工程 年级/班级:大二 2016 —2017学年第一学期 课程名称 数据结构 指导教师 李四 学号姓名 16083240XX 张三 项目名称 实验时间 一、 实验目的

(1)熟悉顺序表的创建、取值、查找、插入、删除等算法,模块化程序设计方法。

单链表的基本操作 2017.10.3 实验类型 实验地点 综合性/设计性 216机房 二、 实验仪器或设备

(1) 算机,内存

(2)

硬件设备: 2G以上

CPU为Pentium 4 以上的计

配置软件: Microsoft Windows 7 与 VC++6.0

三、 总体设计(设计原理、设计方案及流程等) 设计原理:

单链表属于线性表,线性表的存储结构的特点是:用一组任意存储单元存储 线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。因此, 对于某个元素来说,不仅需要存储其本身的信息,还需要存储一个指示其直 接后继的信息。

设计方案:

采用模块化设计的方法,设计各个程序段,最终通过主函数实现各个程序段 的功能。设计时,需要考虑用户输入非法数值,所以要在程序中写入说可以 处理非法数值的代码。 设计流程:

1. 引入所需的头文件; 2. 定义状态值;

3. 写入顺序表的各种操作的代码;

写入主函数,分别调用各个函数。在调用函数时,采用 if结构进行判断输 入值是否非法,从而执行相应的程序 四、 实验步骤(包括主要步骤、代码分析等)

#include // EOF(=AZ

或 F6),NULL

#in clude // srand( ) ,rand( ),exit (n) #in clude // malloc( ),alloc( ),realloc() #in clude // INT_MAX #in clude #in clude

#in clude // floor(),ceil( ),abs() #in clude // cout,ci n

#in clude // clock( ),CLK_TCK,clock_t #defi ne TRUE #defi ne FALSE #defi ne OK #defi ne ERROR 0 #defi ne INFEASIBLE -1

1 0 1

1

#define OVERFLOW -2 typedef int Status; // Status //其值是函数结果状态代码,如 typedef int ElemType; typedef struct LNode {

ElemType data; struct LNode *next; // }LNode,*LinkList; //LinkList // 初始化单链表 算法步骤:

1. 生成新结点作为头结点,用头指针 L 指向头结点。 2. 头结点的指针域置空。 Status InitList_L(LinkList &L)

{

是函数的类型

0K等

//

结点的数据域 结点的指针域

为指向结构体 LNode 的指针类型

L=new LNode; L->next=NULL; return 0K;

}

// 生成新结点作为头结点,用头指针 L 指向头结点; // 头结点的指针域置空

// 单链表的取值 算法步骤:

1. 用指针 P 指首元结点,用 j 做计数器初值赋为 1.

2. 从首元结点开始依次顺着链域 next 向下访问,只要指向当前结点的指针

下一结点;

p 不为空

(NULL,并且没有到达序号为i的结点,则循环执行以下操作: P指向计数器 j 相应加 1;

3. 退出循环时,如果指针p为空,或者计数器j大于i ,说明指定的序号i值不合法(i 大于表长n或i小于等于0),取值失败返回ERROR否则取值成功,此时j=i时,p所指的 结点就是要找的第 i 个结点,用参数 e 保存当前结点的数据域,返回 0K。

Status GetElem_L(LinkList L, int i, ElemType &e) {

LinkList p; int j;

p=L->next; j=1;

while(p&&j

{

p=p->next; ++j;

}

if(!p||j>i) return ERROR; e=p->data; return OK; // 单链表的按值查找 算法步骤:

1. 用指针 p 指首元结点。

2. 从首元结点开始依次顺着链域 next 向下查找,只要指向当前结点的指针 p 不为空, 并且p

2

所指结点的数据域不等于给定值 点。

e,则循环执行以下操作:p指向下一个结

3. 返回 p 。若查找成功, p 此时即为结点的地址值,若查找失败, p 的值即为 NULL。 int LocateElem_L(LinkList L,ElemType e)

{

LinkList p; int j; p=L->next; j=1;

while(p&&p->data!=e)

{

p=p->next; j++;

}

if(p) return j; else return 0;

}

// 单链表的插入 算法步骤:

1. 查找结点 ai-1 并由指针 p 指向该结点。 2. 生成一个新结点 *s 。

3. 将新结点 *s 的数据域置为 e。 4. 将新结点 *s 的指针域指向结点 ai 。 5. 将结点 *p 的指针域指向新结点 *s 。 Status ListInsert_L(LinkList &L,int i,ElemType e)

{

LinkList p=L,s; int j=0;

while(p&&(j

{

p=p->next; ++j;

}

if(!p||j>i-1)

{

return ERROR;

}

s=new LNode; s->data=e; s->next=p->next; p->next=s; return OK;

}

// 单链表的删除

1. 查找结点 ai-1 并由指针 p 指向该结点。

2. 临时保存待删除结点 ai的地址在q中,以备释放。 3. 将结点*p的指针域指向ai的直接后继结点。 4. 释放结点 ai 的空间。

Status ListDelete_L(Li nkList & L,i nt i)

{

LinkList p=L,q;

3

int j=0;

while((p->next)&&(j

{

p=p->next; ++j;

}

if((!p->next)||(j>i-1)) {

return ERROR;

}

q=p->next; p->next=q->next; delete q; return OK;

}

// 单链表的输出 算法步骤: 1. 将指针 p 指向 L 的 next 域。 2. 输出 p 指针的数据。 3. 将指针 p 后移。

4. 循环第 2,3 步,直到 p 指针为空( NULL)。 void ListPrint_L(LinkList L)

{

LinkList p; p=L->next; do

{

printf(\

p=p->next;

}while(p);

}

void main()

{

int i,n,e; LinkList L; if(InitList_L(L));

printf(\单链表创建成功! \\n\

printf(\请输入您要输入的数据个数 n:\\n\printf(\请输入您要输入的数据: \\n\for(i=1;i<=n;i++)

{ scanf(\

}

printf(\当前单链表的内容为: \\n\ListPrint_L(L); printf(\

printf(\请输入您要插入的数据 e 及其位置 i ,使用空格键隔开scanf(\if(ListInsert_L(L,i,e))

{

printf(\当前单链表的内容为: \\n\

4

\\n\

: }

else

{

printf(\值越界! \\n\

}

printf(\

printf(\请输入您要取的数据序号: \\n\scanf(\if(GetElem_L(L,i,e))

{

printf(”

}

第%4位数据的值为:%d\\n\

else

{

printf(\值越界! \\n\

}

printf(\请输入要查找的数据值: \\n\if(!LocateElem_L(L,e))

{

printf(\查无此值 !\\n\} else {

printf(\数据 %c在 %d号位置 \\n\}

prin tf(\请输入要删除的数据的序号: scan f(\if(ListDelete_L(L,i)) {

printf(”

删除后单链表的内容为:\\n\

ListPri nt_L(L); } else {

printf(\}

prin tf(\”); }

输入有误!\

\\n\

五、结果分析与总结

5

单链表实验报告

计算机与信息技术学院综合性、设计性实验报告专业:网络工程年级/班级:大二2016—2017学年第一学期课程名称数据结构指导教师李四学号姓名16083240XX张三项目名称实验时间一、实验目的(1)熟悉顺序表的创建、取值、查找、插入、删除等算法,模块化程序设计方法。单链表的基本操作2017.10.3实验类型实验
推荐度:
点击下载文档文档为doc格式
0qu2q6x4ai9s4tl8lgrm6o2vt5lzj600cs2
领取福利

微信扫码领取福利

微信扫码分享