2 基于链式存储结构的线性表实现
2.1 问题描述
依据最小完备性和常用性相结合的原则,采用单链表作为线性表的物理结构,以函数形式定义12种表操作基本运算。按要求构造一个具有菜单的功能演示系统,演示系统,实现线性表的文件形式保存,且能实现多表管理。
2.1.1 线性链表的基本概念
线性表是一个具有n(n>=0)个元素的线性关系有限序列。元素的个数为线性表的长度,当n=0时,线性表为空表,用一对空括号表示。
线性表的逻辑结构为线性结构,即元素之间一对一连接的结构关系。线性表的链式表示,即其物理结构为链式结构采取链表,即不要求逻辑上相邻的元素在物理层面也相邻,顾名思义就是利用链表存储数据,它用附加指针表示节点间的逻辑关系。(如图2-1,2-2,2-3所示)。
为了表示某个元素ai与其后继节点之间的逻辑关系,所以我们在存储ai时,还需存储一个指示其后继元素的信息。这两部分组成数据元素ai的存储映象,称为节点(node)。
//本文原创版权所有,商业引用请注明出处
// Created by 南隹 on 2019/11/13
// Copyright © 2019 南隹. All rights reserved.
//
2.1.2 演示系统与文件
演示系统可选择实现线性表的文件形式保存。其中,①需要设计文件数据记录格式,以高效保存线性表数据逻辑结构(D,{R})的完整信息;②需要设计线性表文件保存和加载操作合理模式。
演示系统可选择实现多个线性表管理。演示系统界面,及文件路径配置,文件路径配置为自定义,文件保存形式为单线性表按表名存储,表示数据文件的存储。
2.2 系统设计
2.2.1 数据物理结构
结构实现定义(如图2-6所示):
typedef struct Lnode{
Elemtype data;
struct Lnode *next;
}Lnode,*LinkList;//元素定义
typedef struct{
Lnode head[10];
int length;
}SqList;//实现多表管理
从表定义了解此次线性表为动态链表,即用单链表实现,链表是实际工程操作中非常有用的数据结构实现方法,优势在于只要条件允许对表中元素数量没有限制。
2.2.2 演示系统
演示系统的欢迎菜单为新建表、打开文件、退出程序三个主功能,预定义操作文件数目为10(可以自行修改)。新建表功能按顺序建立两个链式结构的线性表头,用户自由选择需要操作的表,然后进入次级菜单进行表操作。打开已有文件功能使用文件名即表名定位文件,利用空表读取特定存在线性表里的元素,用“r+”打开,故不改变文件本身的数据。退出程序操作实现文件和表操作的保存保证程序安全退出。(基本结构示意见图2-7)
次级菜单定义单链表的14个基本操作,我们在文件操作结束退出次级菜单后实现文件的写操作。为方便起见,在初始化模块添加两个功能选择,一个是用户自定义表长并根据表长生成简单链表的功能,另一个是用户自定义表长并根据表长依次输入要存储的数据的功能。
2.2.3 效率分析
效率分析即从程序占用内存,函数空间复杂度和时间复杂度入手给出分析。具有同数量级复杂度的功能,在实现方法上一般类似,比如Loaddata,Listprint它们都是基于ListTraverse来设计的,所以效率都是O(n);而LocatElem,PriorElem,NextElem是基于LocatElem,平均效率为O(n);由于在表节点中包含了Listempty,Listlen所需信息,所以其效率为O(1);ListInsert,ListDelete都要对表进行移位运算,所以平均效率为O(n).
2.3 系统实现
2.3.1 运行环境、编译环境描述
本实验程序语言编写环境为Visual Stdio Code,编译环境为Xcode Version 9.4。
2.4 程序源码
//