顺序表与链表

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

(3) 索引存贮(略) (4) 散列存贮(略)
算法(algorithm)
通俗地讲,算法就是一种解题的方法。更严格地说, 算法是由若干条指令组成的有穷序列,它必须满足下述 条件(也称为算法的五大特性): ( 1)输入: 具有 0个或多个输入的外界量(算法开始前 的初始量) (2)输出:至少产生一个输出,它们是算法执行完后的 结果。 (3)有穷性:每条指令的执行次数必须是有限的。 (4)确定性:每条指令的含义都必须明确,无二义性。 (5)可行性:每条指令的执行时间都是有限的。

1. 线性链表的插入

线性链表的插入:在链式存储结构下的线 性表中插入一个新元素。

首先要给该元素分配一个新结点,以便用于 存储该元素的值; 然后将存放新元素值的结点链接到线性链表 中指定的位置。


此外,在插入时,对于空表或者在第一个 结点之前插入必须单独考虑。


线性链表的插入运算 插入(三种情况)
Loc(ai) = Loc(a1) + (i-1) * d
length=n maxsize
a1 a2
0 1

ai-1 ai ai+1 … an
i-2 i-1 i n-1
顺序表的主要算法
(1)在表中第 i 个位置插入新元素x 算法实现的主要步骤是: ① 判断插入位置的合理性以及表是否已满。 ② 从最后一个元素开始依次向前,将每个 元素向后移动一个位置,直到第i个元素为 止。 ③ 向空出的第i个位置存入新元素x。 ④ 最后还要将线性表长度加一。

p = q->next; q->next = p->next;
分析

插入与删除算法需要考虑的两种特殊情 况:
1.
在插入时,对于空表或者在第一个结点 之前插入必须单独考虑; 在删除时,对于空表及删除第一个结点 必须单独考虑,并且还要考虑到链表中 不存在被删除元素的情况。
2.
2.3.3 循环链表

线性链表的基本概念
链式存储结构: 每个节点有两部分组成:一个部分用存储 数据元素,称为数据域;另外一部分存放 指针,叫为指针域。 链式存储中元素之间的前后件关系可以通 过指针来标识。 链式存储结构既可以用于顺序存储,也可 以用于较复杂的非线性存储。
线性链表的基本概念
线性链表
链式的存储结构
图2.28 循环链表的逻辑状态
HEAD
表头结点
a1 循环链表 a2
首元结点 ……. an-1 an
HEAD
HEAD
线性单链表 a1 a2 ……. an-1 an ∧
循环链表与线性单链表的比较
判断线性单链表为空的条件: head==NULL
判断循环链表为空的条件:
head->next==head
实验要点
设计接口函数 链表成员插入函数 参数:插入位置; 插入成员(结构体变量); 返回值:成功,失败 链表成员删除函数 参数:删除位置; 返回值:成功,失败 查找成员函数(定义查询规则) 参数:查询参数,学号、姓名、电话号码 返回值:位置
内存申请与释放


申请内存 (void *)malloc(int size) 释放内存 void free(void *ptr)
int Find(ElemType x ) { for( int i = 0; i<length; i++ ) { //查找成功,返回元素位置 if( data[i]==x ) return i+1; } return 0; //查找失败,返回 0 }
1.3

实验内容

1、使用顺序表实现学生名册管理程序,名 册中的每条记录包括学号、姓名、联系电 话等项。 2、实现数字化菜单管理、学生名册的建立、 记录的添加、查找、删除和显示等功能。
对于线性单链表,其插入与删除操作虽然 比较方便,但还存在一个问题:对于空表 与对第一个结点的处理必须单独考虑,使 得空表与非空表的运算不统一。
解决方法:循环链表(Circular Linked List)。

循环链表的两个特点
1.
2.
在循环链表中增加了一表头结点,其数据 域为任意或者根据需要来设置,指针域指 向线性表的第一个元素的结点。循环链表 的表头指针HEAD指向表头结点。 循环链表中最后一个结点的指针域不是空, 而是指向表头结点。即在循环链表中,所 有结点的指针构造了一个环状链。
2、链表的操作
线性链表的基本概念
线性表的顺序存储存在以下几个方面的缺点: 1、插入或者删除一个节点,需要涉及到大 量元素的移动问题。 2、容易出现上溢或者下溢现象,存储空间 不易扩展。 3、多个线性表共享存储空间时,存在存储 问题。 因此在涉及到元素大量移动变动的表中, 不宜采用线性表结构。
数据结构(data structure)
是指相互之间存在一种或多种特定关系的 数据元素所组成的集合。数据结构包含三个方 面的内容,即数据的逻辑结构,数据的存贮结 构和对数据所施加的运算。
这三个方面的关系为:

数据的逻辑结构独立于计算机,是数据本身所固 有的
存贮结构是逻辑结构在计算机存贮器中的映像, 必须依赖于计算机。 运算是指所施加的一组操作总称。运算的定义直 接依赖于逻辑结构,但运算的实现必依赖于存贮 结构。
(2)在表中删除第i个元素 算法实现的主要步骤是: ① 判断删除位置的合理性。 ② 从第i+1个元素开始,依次向后 直到最后一个元素为止,将每个元 素向前移动一个位置。这时第i个元 素已经被覆盖删除。 ③ 最后还要将线性表长度减一。
序号 0 1 2 … i-2 i-1 i … n … maxsize
序号 0 1 2 … i-2 i-1 i … n … maxsize
内容 a1 a2 a3 … ai-1 ai ai+1 … an …
序号 0 1 2 … i-2 i-1 i … n … maxsize
内容 a1 a2 a3 … ai-1 x ai … an-1 an
插入前
插入后
顺序表中插入元素前后状态


数据结构基本类型

线性结构 —— 通迅录、成绩单、花名册 树形结构 —— 电子字典、家谱、目录 图状结构 —— 交通线路、通信网络
数据结构中常用的存贮结构
(1) 顺序存贮
所有元素存放在一片连续的存贮单元中,逻辑上 相邻的元素存放到计算机内存仍然相邻。
(2) 链式存贮
所有元素存放在可以不连续的存贮单元中,元素 之间的关系通过地址确定,逻辑上相邻的元素存 放到计算机内存后不一定是相邻的。
1.2
线性数据结构
线性表是由有限个同类型的数据元素组 成的有序序列,一般记作(a1,a2,…,an)。 除了a1和an之外,任意元素ai都有一个直接 前趋ai-1和一个直接后继ai+1。 a1无前趋, an无后继。 线性表的存储结构主要有顺序存储结构 和链式存储结构两种。
顺序表
采用顺序存储结构的线性表称为顺序表,它的数 据元素按照逻辑顺序依次存放在一组连续的存储单 元中。逻辑上相邻的数据元素,其存储位置也彼此 相邻。 假定元素a1的物理地址是Loc(a1),每个元素占d 个存储单元,则第i个元素的存储位置为:
线性链表的逻辑结构
2.3.1 线性链表的基本概念
线性链表例
2.3.1 线性链表的基本概念
相关操作
首先定义一个线性链表类linked_Llist, 具体如下: //文件名linked_Llist.h #include <iostream> using namespace std; template <class T> //T为虚拟类型 struct node { T d; node *next; };
内容 a1 a2 a3 … ai-1 ai ai+1 … an …
序号 0 1 2 … i-2 i-1 i … n … maxsize
内容 a1 a2 a3 … ai-1 ai+1 … an
删除前
删除后
顺序表中删除元素前后状态
(3)在表中查找某个元素
下面是根据数据元素本身的值进行查询的 算法, x 为需要查找的元素,算法返回元素的 实际位置。
q->next = p;
p
p
q

q

(插入前) (插入后)
2. 线性链表的删除

线性链表的删除:在链式存储结构下的线 性表中删除包含指定元素的结点。

首先要在线性链表中找到这个结点; 然后将要删除结点的存储空间释放回系统。
线性链表的删除运算
删除前 ai-1
q
x
ai+1
删除后
ai-1 q
x
pFra Baidu bibliotek
ai+1
软件技术基础
自动化学院
参考书籍
1、数据结构概念及顺序表
VC++ 工具使用
1.1
数据结构基本概念
1.数据(data)
数据是指能够输入到计算机中,并被计算机识 别和处理的符号的集合。
2.数据元素(data element)
数据元素是组成数据的基本单位。数据元素是 一个数据整体中相对独立的单位。但它还可以分 割成若干个具有不同属性的项(字段),故不是 组成数据的最小单位

第一种情况:在第一个结点前插入
p ->next = head ;
head = p; p
head
head
x (插入前) x (插入后)
p

第二种情况:在链表中间插入 p ->next = q->next; q->next = p;
p
q
x
(插入前)
p q
x (插入后)

第三种情况:在链表末尾插入
p->next = q-> next;//p->next = null;
相关文档
最新文档