头歌平台数据结构与算法 单链表实验 第1关:倒置链表

 

任务描述

本关任务:请在右侧编辑器的注释行填入适当内容来完成算法,以实现指定的功能,并通过运行来验证。

相关知识

实验目的

  1. 理解线性表的链式存储结构;
  2. 熟练掌握动态链表结构及有关算法的设计;
  3. 根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。

线性表是软件设计中最常用的数据结构,是实际应用领域中许多具体数据的抽象表示形式,是软件开发过程中常见的基本结构之一。按照教学要求,在实现时不仅需要实现数据的存储,而且要设计出针对所选择或设计的存储结构的运算集合,在此基础上,还要能根据具体问题的需要设计出最合理的问题求解方法或算法。

线性表的链式存储结构是对线性表的一种存储形式,其中元素之间的次序关系是依靠指针来表示的,其优点是在插入和删除元素时不必移动元素,但不能直接存取元素。动态链表存储结构可以不受数据规模的约束,也就是不必事先确定数据的规模,可以根据实际应用中的规模作动态调整,因而在实际应用时具有较好的通用性和灵活性。

然而,和采用静态变量实现的存储结构相比,动态链表存储结构的实现对许多学生来说具有一定的难度:例如,对动态变量的概念、实现及基本操作认识不清,对链表的连接操作无从下手,在实际应用时难以用上等。

因此,本次实验的目的就是希望能够加深对链表的存储结构的理解,熟练掌握动态链表结构及有关算法的设计。在此基础上,根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法。

实验任务

说明1:本次实验中的链表结构均为带头结点的单链表。

说明2:为使实验程序简洁直观,下面的部分实验程序中将所需要的函数以调用库函数的形式给出,并假设将库函数放在程序文件"linklist.h"中,同时假设该库函数文件中定义了链表结构中的指针类型为link,结点类型为node,并定义了部分常用运算,例如构建链表、以某种方式显示链表、从文件中读入一个链表、跟踪访问链表结点等。各运算的名称较为直观,并有相应的注释,因而易于理解和实现。在上机实验时,需要自己设计出所涉及到的库函数,或者将函数放在实验程序中,以方便实验程序的调试。

实验说明

链表是常用和基础的数据结构存储形式,认真完成本次实验的任务,不仅可以达到预定的教学目标,而且可以为后续涉及到动态链表结构的实验奠定良好的基础。

如前所述,由于是第一个涉及动态变量的链表式存储结构,并且相关的运算实现和算法构思都存在一定的难度,因而使得实验有一定难度。因此,对实验提出如下要求:

首先要理解和掌握线性表的基本性质、基本运算要求、存储结构形式(包括结构形式、链表相关的语法描述)、动态变量的基本实现(申请变量和释放存储空间),在链表结构上实现在特定位置上插入结点、删除结点的基本运算。

理解并掌握线性表基本运算在采用链表存储时的实现方法和性能。

在此基础上,能熟练地运用于实际问题的求解。

为了完成针对特定问题和要求的链表算法的实验,通常需要完成以下工作:

  1. 选择或设计合适的存储结构。本实验已经指定采用链表存储结构,故此步可略。
  2. 设计出针对所选择的结构的算法(本实验中的大多数基本算法在教科书中都能见到)。
  3. 设计构造链表的算法,并在主程序中调用之以构造出链表,作为算法运行时的数据。为达到有效检验算法的目的,一般要求所构造的数据要尽可能多地包含各种情况,要有一定的复杂度,否则难以达到预定的目标。
  4. 运行算法以验证和检查算法的功能,发现存在的问题,并予以纠正。在这一环节要注意: 一般来说,对实际数据运行算法(或程序)不能替代正确性证明,某次运行成功不能说明算法一定正确。反之,若对某次运行不成功,则说明算法有错误或遗漏。由于初学者在算法设计中难免的不完备性或理解的局限性,使得算法中存在不同程度的问题。通过对具有一定复杂程度的实际数据的运行可有效发现存在的这些问题,提高学习的效果。因此,要注意算法运行的充分性,通过多种情况反复检查。

由此可知,实验程序包括如下内容:

  • 需要实验和检验的算法;
  • 构建结构的算法或程序段;
  • 检查结构的算法或程序段;
  • 主程序,包括定义对应结构的变量、调用算法构建结构,调用算法验证结构,然后调用实验算法运行,然后调用算法检验结果。

编程要求

请在右侧编辑器的注释行填入适当内容来完成算法,以实现指定的功能,并通过运行来验证。

  1. Print 算法实现链表的遍历,即依次访问每个元素结点;
  2. Reverse 算法实现链表的倒置,并让链表的头指针 l 指向新表的表头。
  3. 函数 linklength 返回链表 L 的长度。

测试说明

平台会对你编写的代码进行测试。


开始你的任务吧,祝你成功!

#include "linklist.h"  // 引用库函数文件
namespace exa {     //请在命名空间内编写代码,否则后果自负

link l;                          // 定义指针型变量
void Print(link l)              // 算法Print,依次访问每个元素结点
{
    link P;                     // 定义指针型变量
    P=l->next;//Blank 1
    while (P!=NULL)
    {
    	printf(P == l->next ? "%d" : " %d", P->data);//Blank 2
        P = P->next;
    }
    puts("");
}
void Reverse(link &L)             // 算法Reverse,实现链表元素结点的倒置
{
    link h, u, tmp;                        // 定义所要用到的指针变量
	h = NULL; u = L->next; 
	while (u!=NULL)//Blank 3
	{
    	tmp = u->next;
        u->next = h;
	    h = u;
		u=tmp;// Blank 4
	}
	L->next=h;              // Blank 5
}
int linklength(link l)                // 算法length
{
    link p;
    int i = 0;
    p=l->next;            // Blank 6
	while (p!=NULL)
    {
        i++;
        p=p->next;      // Blank 7
    }
	return i;//Blak 8
}
void solve()                         // 主程序部分
{
    create_hsllist(l);                     // 调用函数库中的函数构建链表l
    disp_check_hsllist("Created Sllist",l);     // 显示并检查链表l
    printf("Length=%d\n",linklength(l));      // 调用算法求链表l的长度
    Print(l);                          // 调用算法Print 对l运算
    Reverse(l);                    // 调用算法Reverse倒置l表的头结点之后的部分
    disp_check_hsllist("Reversed Sllist",l);   // 显示在调用算法Reverse倒置后的结果链表l
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

miraitowa....

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值