链式存储结构的基本操作
单链表的基本操作
10)调用头插法的函数,分别输入10,20,分别回车:
11)调用尾插法的函数,分别输入30,40
12)查找单链表的第四个元素:
13)主函数中传入参数,删除单链表的第一个结点:
14)主函数传入参数,删除第0个未位置的元素,程序报错:
15)最后,输出单链表中的元素:
return 0;
}
6)编译,连接,运行源代码:
7)输入8,回车,并输入8个数,用空格分隔开,根据输出信息,可以看出,链表已经拆分为两个
五、实验总结
1.单链表采用的是数据+指针的表示形式,指针域总是指向下一个结
点(结构体)的地址,因此,在内存中的地址空间可以是不连续的,操作比顺序存储更加的方便
2.单链表使用时,需要用malloc函数申请地址空间,最后,删除元
素时,使用free函数释放空间。
二叉树的存储结构及基本操作
二叉树的存储结构及基本操作二叉树是一种常见的数据结构,广泛应用于计算机科学领域。
二叉树具有其独特的存储结构和基本操作,下面将详细介绍。
一、二叉树的存储结构二叉树的存储结构通常有两种形式:顺序存储和链式存储。
1. 顺序存储顺序存储是将二叉树中的所有元素按照一定的顺序存储在一段连续的内存单元中,通常采用数组来表示。
对于任意一个节点i,其左孩子节点的位置为2*i+1,右孩子节点的位置为2*i+2。
这种存储方式的优点是访问速度快,但需要预先确定节点总数,且不易于插入和删除操作。
2. 链式存储链式存储是采用指针的方式将二叉树的节点链接起来。
每个节点包含数据元素以及指向左孩子节点和右孩子节点的指针。
链式存储方式的优点是易于插入和删除操作,但访问速度较慢。
二、二叉树的基本操作1. 创建二叉树创建二叉树的过程就是将数据元素按照一定的顺序插入到二叉树中。
对于顺序存储的二叉树,需要预先分配内存空间;对于链式存储的二叉树,可以直接创建节点对象并链接起来。
2. 遍历二叉树遍历二叉树是指按照某种规律访问二叉树中的所有节点,通常有前序遍历、中序遍历和后序遍历三种方式。
前序遍历的顺序是根节点-左孩子节点-右孩子节点;中序遍历的顺序是左孩子节点-根节点-右孩子节点;后序遍历的顺序是左孩子节点-右孩子节点-根节点。
对于顺序存储的二叉树,可以采用循环结构实现遍历;对于链式存储的二叉树,需要使用指针逐个访问节点。
3. 查找元素在二叉树中查找元素,需要根据一定的规则搜索所有节点,直到找到目标元素或搜索范围为空。
对于顺序存储的二叉树,可以采用线性查找算法;对于链式存储的二叉树,可以采用深度优先搜索或广度优先搜索算法。
4. 插入元素在二叉树中插入元素需要遵循一定的规则,保证二叉树的性质。
对于顺序存储的二叉树,插入操作需要移动大量元素;对于链式存储的二叉树,插入操作相对简单,只需修改指针即可。
5. 删除元素在二叉树中删除元素同样需要遵循一定的规则,保证二叉树的性质。
线性表的存储结构定义及基本操作(实验报告)
线性表的存储结构定义及基本操作(实验报告)线性表的存储结构定义及基本操作一掌握线性表的逻辑特征掌握线性表顺序存储结构的特点熟练掌握顺序表的基本运算熟练掌握线性表的链式存储结构定义及基本操作理解循环链表和双链表的特点和基本运算加深对顺序存储数据结构的理解和链式存储数据结构的理解逐步培养解决实际问题的编程能力二一基本实验内容顺序表建立顺序表完成顺序表的基本操作初始化插入删除逆转输出销毁置空表求表长查找元素判线性表是否为空1 问题描述利用顺序表设计一组输入数据假定为一组整数能够对顺序表进行如下操作创建一个新的顺序表实现动态空间分配的初始化根据顺序表结点的位置插入一个新结点位置插入也可以根据给定的值进行插入值插入形成有序顺序表根据顺序表结点的位置删除一个结点位置删除也可以根据给定的值删除对应的第一个结点或者删除指定值的所有结点值删除利用最少的空间实现顺序表元素的逆转实现顺序表的各个元素的输出彻底销毁顺序线性表回收所分配的空间对顺序线性表的所有元素删除置为空表返回其数据元素个数按序号查找根据顺序表的特点可以随机存取直接可以定位于第 i 个结点查找该元素的值对查找结果进行返回按值查找根据给定数据元素的值只能顺序比较查找该元素的位置对查找结果进行返回判断顺序表中是否有元素存在对判断结果进行返回编写主程序实现对各不同的算法调用2 实现要求对顺序表的各项操作一定要编写成为C C 语言函数组合成模块化的形式每个算法的实现要从时间复杂度和空间复杂度上进行评价初始化算法的操作结果构造一个空的顺序线性表对顺序表的空间进行动态管理实现动态分配回收和增加存储空间位置插入算法的初始条件顺序线性表L已存在给定的元素位置为i且1≤i ≤ListLength L 1操作结果在L中第i个位置之前插入新的数据元素eL的长度加1位置删除算法的初始条件顺序线性表L已存在1≤i≤ListLength L 操作结果删除L的第i个数据元素并用e返回其值L的长度减1逆转算法的初始条件顺序线性表L已存在操作结果依次对L的每个数据元素进行交换为了使用最少的额外空间对顺序表的元素进行交换输出算法的初始条件顺序线性表L已存在操作结果依次对L的每个数据元素进行输出销毁算法初始条件顺序线性表L已存在操作结果销毁顺序线性表 L置空表算法初始条件顺序线性表L已存在操作结果将L重置为空表求表长算法初始条件顺序线性表L已存在操作结果返回L中数据元素个数按序号查找算法初始条件顺序线性表 L 已存在元素位置为 i且 1≤i≤ListLength L 操作结果返回 L 中第 i 个数据元素的值按值查找算法初始条件顺序线性表 L 已存在元素值为 e 操作结果返回 L 中数据元素值为 e 的元素位置判表空算法初始条件顺序线性表 L 已存在操作结果若 L 为空表则返回 TRUE否则返回 FALSE分析修改输入数据预期输出并验证输出的结果加深对有关算法的理解二基本实验内容单链表建立单链表完成链表带表头结点的基本操作建立链表插入删除查找输出求前驱求后继两个有序链表的合并操作其他基本操作还有销毁链表将链表置为空表求链表的长度获取某位置结点的内容搜索结点1 问题描述利用线性表的链式存储结构设计一组输入数据假定为一组整数能够对单链表进行如下操作初始化一个带表头结点的空链表创建一个单链表是从无到有地建立起一个链表即一个一个地输入各结点数据并建立起前后相互链接的关系又分为逆位序插在表头输入 n 个元素的值和正位序插在表尾输入 n 个元素的值插入结点可以根据给定位置进行插入位置插入也可以根据结点的值插入到已知的链表中值插入且保持结点的数据按原来的递增次序排列形成有序链表删除结点可以根据给定位置进行删除位置删除也可以把链表中查找结点的值为搜索对象的结点全部删除值删除输出单链表的内容是将链表中各结点的数据依次显示直到链表尾结点编写主程序实现对各不同的算法调用其它的操作算法描述略2 实现要求对链表的各项操作一定要编写成为 C C 语言函数组合成模块化的形式还要针对每个算法的实现从时间复杂度和空间复杂度上进行评价初始化算法的操作结果构造一个空的线性表 L产生头结点并使 L 指向此头结点建立链表算法初始条件空链存在操作结果选择逆位序或正位序的方法建立一个单链表并且返回完成的结果链表位置插入算法初始条件已知单链表 L 存在操作结果在带头结点的单链线性表 L 中第 i 个位置之前插入元素 e链表位置删除算法初始条件已知单链表 L 存在操作结果在带头结点的单链线性表 L 中删除第 i 个元素并由 e 返回其值输出算法初始条件链表 L 已存在操作结果依次输出链表的各个结点的值三扩展实验内容顺序表查前驱元素查后继元素顺序表合并等1 问题描述根据给定元素的值求出前驱元素根据给定元素的值求出后继元素对已建好的两个顺序表进行合并操作若原线性表中元素非递减有序排列要求合并后的结果还是有序有序合并对于原顺序表中元素无序排列的合并只是完成 A A∪B 无序合并要求同样的数据元素只出现一次修改主程序实现对各不同的算法调用2 实现要求查前驱元素算法初始条件顺序线性表 L 已存在操作结果若数据元素存在且不是第一个则返回前驱否则操作失败查后继元素算法初始条件顺序线性表 L 已存在操作结果若数据元素存在且不是最后一个则返回后继否则操作失败无序合并算法的初始条件已知线性表 La 和 Lb操作结果将所有在线性表 Lb 中但不在 La 中的数据元素插入到 La 中有序合并算法的初始条件已知线性表 La 和 Lb 中的数据元素按值非递减排列操作结果归并 La 和 Lb 得到新的线性表 LcLc 的数据元素也按值非递减排列四扩展实验内容链表1 问题描述求前驱结点是根据给定结点的值在单链表中搜索其当前结点的后继结点值为给定的值将当前结点返回求后继结点是根据给定结点的值在单链表中搜索其当前结点的值为给定的值将后继结点返回两个有序链表的合并是分别将两个单链表的结点依次插入到第 3 个单链表中继续保持结点有序2 实现要求求前驱算法初始条件线性表 L 已存在操作结果若 cur_e 是 L 的数据元素且不是第一个则用 pre_e 返回它的前驱求后继算法初始条件线性表 L 已存在操作结果若 cur_e 是 L 的数据元素且不是最后一个则用 next_e 返回它的后继两个有序链表的合并算法初始条件线性表单链线性表 La 和 Lb 的元素按值非递减排列操作结果归并 La 和 Lb 得到新的单链表三实验环境和实验步骤实验环境利用CodeBlocks1005集成开发环境进行本实验的操作实验步骤――顺序表的定义与操作1启动CodeBlocks1052按Create a new project 通过file 按CC source选择c然后GO储存文件D\c语言\顺序表c3进行编代码4编好之后搞ctrlshiftF9进行编译然后按ctrlF105如果编译出问题然后进行调试实验步骤――链表的定义与操作1启动CodeBlocks1052按Create a new project 通过file 按CC source选择c然后GO储存文件D\c语言\单链表c3进行编代码4编好之后搞ctrlshiftF9进行编译然后按ctrlF105如果编译出问题然后进行调试四 includeinclude "stdlibh"includedefine LIST_INIT_SIZE 100define ok 1define ERROR 0define OVERFLOW -1define Num 3typedef int DataTypetypedef int Statustypedef structDataType elemint Lengthint ListsizeSeqListSeqList LStatus InitSeqList SeqList LL- elem Da。
第3章线性表的链式存储
(a) 空循环链表
L
a1
a2
...
an
(b) 非空循环链表
3.1.3 双向链表
在单链表结点中只有一个指向其后继结点的next 指针域,而找其前驱则只能从该链表的头指针开始,顺 着各结点的next指针域进行查找,也就是说找后继的时 间复杂度是O(1),找前驱的时间复杂度是O(n)。如果也 希望找前驱像后继那样快,则只能付出空间的代价:每 个结点再加一个指向前驱的指针域prior,结点的结构修 改为下图,这样链表中有两个方向不同的链,用这种结 点组成的链表称为双向链表。
1.带头结点的单链表 2.不带头结点的单链表
3.3.3 单链表插入操作的实现
单链表的插入操作是指在表的第i个位置结点处插入 一个值为data的新结点。插入操作需要从单链表的第一个结 点开始遍历,直到找到第i个位置的结点。插入操作分为在 结点之前插入的前插操作和在结点之后插入的后插操作。
1.前插操作 2.后插操作
2.整数型单链表算法
3.不带头结点的单链表算法
3.2.2 尾插法单链表的创建实现
用头插法实现单链表的创建,比较简单,但读入的 数据元素的顺序与生成的链表中元素的顺序是相反的。若希 望两者次序一致,则用尾插法创建单链表。为了快速找到新 结点插入到链表的尾部位置,所以需加入一个尾指针r用来 始终指向链表中的尾结点。初始状态:头指针L和尾指针r均 为空,把各数据元素按顺序依次读入,申请结点,将新结点 插入到r所指结点的后面,然后r指向新结点,直到读入结束 标志为止。
3.2.2 尾插法单链表的创建实现
L
插入P前的尾指针 插入P后的尾指针
r
3
4
P1
x^
2
3.3 单链表运算的实现
线性表的存储结构定义及基本操作
一、实验目的:. 掌握线性表的逻辑特征. 掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算. 熟练掌握线性表的链式存储结构定义及基本操作. 理解循环链表和双链表的特点和基本运算. 加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实际问题的编程能力二、实验内容:(一)基本实验内容(顺序表):建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:. 创建一个新的顺序表,实现动态空间分配的初始化;. 根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序顺序表;. 根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删除指定值的所有结点(值删除);. 利用最少的空间实现顺序表元素的逆转;. 实现顺序表的各个元素的输出;. 彻底销毁顺序线性表,回收所分配的空间;. 对顺序线性表的所有元素删除,置为空表;. 返回其数据元素个数;. 按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对查找结果进行返回;. 按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;. 判断顺序表中是否有元素存在,对判断结果进行返回;. 编写主程序,实现对各不同的算法调用。
2.实现要求:对顺序表的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要从时间复杂度和空间复杂度上进行评价;. “初始化算法”的操作结果:构造一个空的顺序线性表。
对顺序表的空间进行动态管理,实现动态分配、回收和增加存储空间;. “位置插入算法”的初始条件:顺序线性表L 已存在,给定的元素位置为i,且1≤i≤ListLength(L)+1 ;操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1;. “位置删除算法”的初始条件:顺序线性表L 已存在,1≤i≤ListLength(L) ;操作结果:删除L 的第i 个数据元素,并用e 返回其值,L 的长度减1 ;. “逆转算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行交换,为了使用最少的额外空间,对顺序表的元素进行交换;. “输出算法”的初始条件:顺序线性表L 已存在;操作结果:依次对L 的每个数据元素进行输出;. “销毁算法”初始条件:顺序线性表L 已存在;操作结果:销毁顺序线性表L;. “置空表算法”初始条件:顺序线性表L 已存在;操作结果:将L 重置为空表;. “求表长算法”初始条件:顺序线性表L 已存在;操作结果:返回L 中数据元素个数;. “按序号查找算法”初始条件:顺序线性表L 已存在,元素位置为i,且1≤i≤ListLength(L)操作结果:返回L 中第i 个数据元素的值. “按值查找算法”初始条件:顺序线性表L 已存在,元素值为e;操作结果:返回L 中数据元素值为e 的元素位置;. “判表空算法”初始条件:顺序线性表L 已存在;操作结果:若L 为空表,则返回TRUE,否则返回FALSE;分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
数据结构-链表
链表一种数据结构的链接实现是指按链式存储方式构建其存储结构,并在此链式存储结构上实现其基本运算。
线性表的常见链式存储结构有单链表、循环链表和双链表,其中最简单的单链表。
本节讨论单链表的组织方法以及线性表的基本运算在单链表上的实现。
单链表示法的基本思想是用指针表示结点间的逻辑关系。
因此单链表的一个存储结点包含两个部分,结点形式如下:其中,data部分称为数据域,用于存储线性表的一个数据元素。
next部分称为指针域或链域,用于存放一个指针,该指针指向本结点所含数据元素的直接后继所在的结点。
从上述单链表中可以联想到我们生活中的火车,还有一种火车只有火车头。
假设数据元素的类型为Datatype。
单链表的类型定义如下:typedef struct node{Datatype data;struct node * next;} node,* LinkList;struct node表示链表的结点,一个结点是由两个域数据域data和指针域next组成的记录(每个域实际上相当于一个变量),而next本身又是一个pointer类型的指针型变量。
这个定义与上面给出的单链表的结点形式一致。
单链表的简单操作:1、初始化建立一个空表。
空表由一个头指针和一个头结点(该结点同时也是尾结点)组成。
LinkList Initiate_LinkList()/* 建立一空表 */{ LinkLis head;head= malloc(sizeof(node));head -> next = NULL;return head;}2、定位:按值查找。
按从前往后的顺序,依次比较单链表中各表结点数据域的值与给定值X,第一个值与X相等的表结点的序号就是结果。
若没有这样的结点,运算结果为0。
int Locate_LinkList(LinkList head,Datatype x){ Node *p;p = head; /* 置初值 */p=p->next;j = 0; /* 置初值 */while((p!= NULL)&&(p -> data != x)){ p = p -> next;j ++;} /* 未达尾结点又未找到等于x的结点时继续扫描 */if (p -> data == x)return(j+1);elsereturn(0);}3、插入:把新的结点x插入到i结点之前。
数据结构线性表实验报告
数据结构线性表实验报告数据结构线性表实验报告实验目的:本次实验主要是为了学习和掌握线性表的基本操作和实现方式。
通过实验,我们可以加深对线性表的理解,并能够熟悉线性表的基本操作。
实验设备与环境:本次实验所需的设备包括计算机和编程环境。
我们选择使用C语言来实现线性表的操作,并在Visual Studio Code编程软件中进行编写和调试。
实验内容:1.线性表的定义和基本操作1.1 线性表的定义:线性表是一种有序的数据结构,其中的元素按照一定的顺序存储,可以插入、删除和访问元素。
1.2 线性表的基本操作:1.2.1 初始化线性表:创建一个空的线性表。
1.2.2 判断线性表是否为空:判断线性表是否不含有任何元素。
1.2.3 获取线性表的长度:返回线性表中元素的个数。
1.2.4 在线性表的指定位置插入元素:在线性表的第i个位置插入元素x,原第i个及其之后的元素依次后移。
1.2.5 删除线性表中指定位置的元素:删除线性表中第i个位置的元素,原第i+1个及其之后的元素依次前移。
1.2.6 获取线性表中指定位置的元素:返回线性表中第i个位置的元素的值。
1.2.7 清空线性表:将线性表中的元素全部删除,使其变为空表。
2.线性表的顺序存储结构实现2.1 线性表的顺序存储结构:使用数组来实现线性表的存储方式。
2.2 线性表的顺序存储结构的基本操作:2.2.1 初始化线性表:创建一个指定长度的数组,并将数组中的每个元素初始化为空值。
2.2.2 判断线性表是否为空:判断线性表的长度是否为0。
2.2.3 获取线性表的长度:返回线性表数组的长度。
2.2.4 在线性表的指定位置插入元素:将要插入的元素放入指定位置,并将原位置及其之后的元素依次后移。
2.2.5 删除线性表中指定位置的元素:将指定位置的元素删除,并将原位置之后的元素依次前移。
2.2.6 获取线性表中指定位置的元素:返回指定位置的元素的值。
2.2.7 清空线性表:将线性表数组中的每个元素赋空值。
链栈的基本操作
链栈的基本操作链栈是一种特殊的栈结构,它的存储方式是链式存储,而不是顺序存储。
链栈的基本操作包括初始化、入栈、出栈、获取栈顶元素和判断栈是否为空。
下面将详细介绍这些操作的实现方法和应用场景。
一、初始化链栈初始化链栈就是创建一个空栈,通常需要定义一个头结点,并将链表的头指针指向头结点。
头结点不存储数据,只作为链表的起始点。
二、入栈操作入栈操作是将一个元素添加到链栈的栈顶。
具体步骤如下:1. 创建一个新的结点,将要入栈的元素存储在结点的数据域中。
2. 将新结点的指针域指向链表的头指针所指向的结点。
3. 更新链表的头指针,使其指向新结点。
入栈操作的时间复杂度为O(1),即常数时间。
三、出栈操作出栈操作是将链栈的栈顶元素删除,并返回其值。
具体步骤如下:1. 判断链栈是否为空,如果为空则无法进行出栈操作。
2. 将链表的头指针指向的结点删除,并保存其数据域的值。
3. 更新链表的头指针,使其指向被删除结点的下一个结点。
4. 返回被删除结点的数据域的值。
出栈操作的时间复杂度为O(1),即常数时间。
四、获取栈顶元素获取栈顶元素操作是返回链栈的栈顶元素的值,但不删除该元素。
具体步骤如下:1. 判断链栈是否为空,如果为空则无法获取栈顶元素。
2. 返回链表的头指针所指向的结点的数据域的值。
获取栈顶元素操作的时间复杂度为O(1),即常数时间。
五、判断栈是否为空判断栈是否为空操作是检查链栈是否为空栈,即链表中是否只有头结点。
具体步骤如下:1. 判断链表的头指针是否为空,如果为空则链栈为空栈。
2. 如果链表的头指针不为空,则链栈不为空栈。
判断栈是否为空操作的时间复杂度为O(1),即常数时间。
链栈的基本操作可以应用于很多场景,例如:1. 表达式求值:将中缀表达式转换为后缀表达式,然后利用链栈进行后缀表达式的求值。
2. 浏览器的前进和后退功能:使用两个链栈分别保存浏览器的前进和后退历史记录。
3. 括号匹配:利用链栈对输入的括号进行匹配判断,判断括号是否闭合正确。
实验二 链表操作实现
实验二链表操作实现实验日期:2017 年 3 月16 日实验目的及要求1. 熟练掌握线性表的基本操作在链式存储上的实现;2. 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;3. 掌握线性表的链式存储结构的定义和基本操作的实现;4. 通过本实验加深对C语言的使用(特别是函数的参数调用、指针类型的应用)。
实验内容已知程序文件linklist.cpp已给出学生身高信息链表的类型定义和基本运算函数定义。
(1)链表类型定义typedef struct {int xh; /*学号*/float sg; /*身高*/int sex; /*性别,0为男生,1为女生*/} datatype;typedef struct node{datatype data; /*数据域*/struct node *next; /*指针域*/} LinkNode, *LinkList;(2)带头结点的单链表的基本运算函数原型LinkList initList();/*置一个空表(带头结点)*/void createList_1(LinkList head);/*创建单链表*/void createList_2(LinkList head);/* 创建单链表*/void sort_xh(LinkList head);/*单链表排序*/void reverse(LinkList head);/*对单链表进行结点倒置*/void Error(char *s);/*自定义错误处理函数*/void pntList(LinkList head);/*打印单链表*/void save(LinkList head,char strname[]);/*保存单链表到文件*/任务一创建程序文件linklist.cpp,其代码如下所示,理解LinkList类型和基本运算函数后回答下列问题。
#include <stdio.h>#include <stdlib.h>/*单链表结点类型*/typedef struct {int xh; /*学号*/float sg; /*身高*/int sex; /*性别,0为男生,1为女生*/} datatype;typedef struct node{datatype data; /*数据域*/struct node *next; /*指针域*/} LinkNode, *LinkList;/*带表头的单链表的基本运算函数*/LinkList initList();/*置一个空表(带头结点)*/void createList_1(LinkList head);/*创建单链表*/void createList_2(LinkList head);/*创建单链表*/void sort_xh(LinkList head);/*单链表排序*/void reverse(LinkList head);/*单链表倒置*/void Error(char *s);/*自定义错误处理函数*/void pntList(LinkList head);/*打印单链表*/void save(LinkList head,char strname[]);/*保存单链表到文件*//*置一个空表*/LinkList initList(){ LinkList p;p=(LinkList)malloc(sizeof(LinkNode));p->next=NULL;return p;}/*创建单链表*/void createList_1(LinkList head){ FILE *fp;int xh;float sg;int sex;LinkList p;if((fp=fopen("records.txt","r"))==NULL){ Error("can not open file !");return ;}while(!feof(fp)){ fscanf(fp,"%d%f%d",&xh,&sg,&sex);p=(LinkList)malloc(sizeof(LinkNode));p->data.xh=xh;p->data.sg=sg;p->data.sex=sex;p->next=head->next;head->next=p;}fclose(fp);}/*创建单链表*/void createList_2(LinkList head){ FILE *fp;int xh;float sg;int sex;LinkList p,rear;if((fp=fopen("records.txt","r"))==NULL){ Error("can not open file !");return ;}rear=head;while(!feof(fp)){ fscanf(fp,"%d%f%d",&xh,&sg,&sex);p=(LinkList)malloc(sizeof(LinkNode));p->data.xh=xh;p->data.sg=sg;p->data.sex=sex;p->next=NULL;rear->next=p;rear=p;}fclose(fp);}/*单链表排序*/void sort_xh(LinkList head){LinkList q,p,u;p=head->next;head->next=NULL;/*利用原表头结点建新的空表*/while(p){ q=p; /*q为被插入的结点*/p=p->next;/*用p记录后继结点*//*遍历新链表查找插入位置*/u=head;while(u->next!=NULL)/*查找插入位置*/{ if(u->next->data.xh>q->data.xh)break;u=u->next;}/*插入在u结点的后面*/q->next=u->next;u->next=q;}}/*单链表倒置*/void reverse(LinkList head){ LinkList p, r;p=head->next;head->next=NULL;while(p){ r=p;p=p->next;/*r指向结点头插到链表*/r->next=head->next;head->next=r;}}/*输出单链表*/void pntList(LinkList head){ LinkList p;p=head->next;while(p!=NULL){printf("%2d: %.2f %d\n",p->data.xh,p->data.sg,p->data .sex);p=p->next;}}/*自定义错误处理函数*/void Error(char *s){ printf("\n %s", s);exit(1); /*返回OS,该函数定义在stdlib.h中*/}/*保存单链表到文件*/void save(LinkList head,char strname[]){ FILE *fp;LinkList p;if((fp=fopen(strname,"w"))==NULL){ printf("can not open file !");return ;}p=head->next;while(p!=NULL){ fprintf(fp,"%2d %5.2f %2d\n",p->data.xh,p->data.sg,p->data.sex);p=p->next;}fclose(fp);}请回答下列问题:(1)由单链表结点类型定义可知,该链表结点类型名为 LinkNode ,结点的指针类型为 LinkList ,向系统申请一个学生结点空间并把起始地址存于上述结点指针变量new 中的语句是: p=(LinkList)malloc(sizeof(LinkNode)); 。
线性表 定义顺序存储结构基本操作两种特殊的线性表栈队列
Void SetNode(Node *front) { front->next=NULL; }
} …
Test1.c
…
#include “node.h” Void main() {
int i,j; Node front,*prevptr,*ptr; SetNode(&front); ptr=&front; for(i=1;i<5;i++)
} 线性结构
结点可以不连续存储,表可扩充
单向链表的存贮映像
指针操作
LNode *p,*q; p->data;p->next; q=new LNode; q=p; q=p->next; (q指向后继) p=p->next; (指针移动) p->next=q; (链指针改接) p->next= q->next; (?)
链表结点的基本运算
Void SetNode(LNode *front);//构造函数,结点 的next置NULL
Node *NextNode(LNode *ptr);//返回后继指针 Void InsertAfter(LNode *ptr,Datatype item);//
在结点*ptr插入 Void DeleteAfter(LNode *ptr);//删除结点后的
ptr=NextNode(ptr); ptr->data=item
}
循环链表
循环链表是单链表的变形。 循环链表最后一个结点的link指针不为NULL,
而是指向了表的前端 为简化操作,在循环链表中往往加入表头结点。 循环链表的特点是:只要知道表中某一结点的
地址,就可搜寻到所有其他结点的地址。
链式存储结构中数据元素之间的逻辑关系
链式存储结构中数据元素之间的逻辑关系链式存储结构是一种常用的数据存储方式,它通过指针将数据元素连接起来,形成一个链表。
在链表中,数据元素之间存在着不同的逻辑关系,本文将从不同的角度探讨这些关系。
一、数据元素之间的顺序关系链式存储结构中,数据元素之间的顺序关系是最基本的逻辑关系。
在单向链表中,数据元素按照插入的顺序依次连接在一起,形成了一个单向的链表。
在双向链表中,每个数据元素都有两个指针,一个指向前驱元素,一个指向后继元素,数据元素之间形成了一个双向链表。
在循环链表中,最后一个元素的指针指向第一个元素,形成了一个环形链表。
这些不同类型的链表都有着不同的数据元素顺序关系。
二、数据元素之间的逻辑关联关系除了顺序关系,链式存储结构中的数据元素还可以通过不同的逻辑关联关系连接在一起。
例如,在树形结构中,每个节点都有着子节点和父节点的关系,通过指针将这些节点连接在一起,形成了一个树形结构。
在图形结构中,每个节点都有着与其他节点相连的边,通过指针将这些节点和边连接在一起,形成了一个图形结构。
这些逻辑关联关系使得链式存储结构可以表示更加复杂的数据结构。
三、数据元素之间的数据关系在链式存储结构中,不仅仅是数据元素之间存在着逻辑关系,它们之间还可以存在着数据关系。
例如,在链表中,每个节点存储着一个数据元素,这些数据元素之间可以存在着不同的数据关系。
例如,在学生信息管理系统中,每个节点可以存储着一个学生的信息,这些学生之间可以存在着同班、同学院等数据关系。
通过这些数据关系,我们可以更加方便地进行数据的管理和查询。
四、数据元素之间的操作关系链式存储结构中的数据元素不仅仅是被连接在一起的,它们之间还可以存在着不同的操作关系。
例如,在链表中,我们可以通过指针操作来实现不同的功能,例如插入、删除、查找等操作。
在树形结构中,我们可以通过遍历操作来实现不同的功能,例如前序遍历、中序遍历、后序遍历等操作。
这些操作关系使得链式存储结构可以更加灵活地应用于不同的场合。
数据结构链表的基本操作
数据结构链表的基本操作一、引言链表是计算机科学中的一种数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
链表可以用于实现栈、队列和其他数据结构。
本文将详细介绍链表的基本操作。
二、链表的基本概念1. 节点:链表中的每个元素称为节点,它包含两部分:数据和指向下一个节点的指针。
2. 头结点:链表中第一个节点称为头结点,它不包含实际数据,只有指向第一个真正节点的指针。
3. 尾节点:链表中最后一个节点称为尾节点,它的指针为空。
4. 空链表:不包含任何元素的链表称为空链表。
三、链表的基本操作1. 创建链表创建一个空链表很简单,只需要让头结点指针为空即可。
如果需要创建带有多个元素的非空链表,则需要依次创建每个节点,并将前一个节点的指针指向当前节点。
2. 插入元素在插入元素时,需要先找到要插入位置前面的那个节点。
然后新建一个要插入的节点,并将其指针指向原来位置上后面那个节点。
最后将前面那个节点的指针改为新建立的节点。
3. 删除元素在删除元素时,需要先找到要删除的那个节点。
然后将前一个节点的指针指向后一个节点,从而跳过要删除的那个节点。
最后释放要删除的节点。
4. 遍历链表遍历链表是指依次访问链表中每个元素。
可以使用循环结构来实现遍历操作。
从头结点开始,依次访问每个节点,并将其数据输出即可。
5. 查找元素查找元素时,需要从头结点开始依次遍历每个节点,直到找到目标元素或者遍历完整个链表为止。
6. 反转链表反转链表是指将原来的链表顺序倒置。
可以使用三个指针分别表示当前节点、前一个节点和后一个节点,依次修改它们之间的指针即可实现反转操作。
四、链表的应用举例1. 栈和队列:栈和队列都可以用链表来实现。
栈是一种先进后出(FILO)的数据结构,而队列是一种先进先出(FIFO)的数据结构。
2. 链式存储文件系统:文件系统中通常采用基于树或者基于哈希表的存储方式。
但是在某些情况下,也可以采用基于链式存储方式来实现文件系统。
队列基本操作实验报告
队列基本操作实验报告一、实验目的本次实验的主要目的是通过编写队列的基本操作,掌握队列数据结构的基本原理及其应用。
二、实验内容1. 队列的定义和基本操作队列是一种先进先出(FIFO)的线性数据结构,它只允许在队尾插入元素,在队头删除元素。
队列的基本操作包括:入队(enqueue)、出队(dequeue)、获取队头元素(getFront)、获取队列长度(getSize)等。
2. 队列的顺序存储结构顺序存储结构是指用数组来存储队列中的元素,其中需要维护两个指针:front指向队头元素,rear指向下一个待插入位置。
当rear等于数组长度时,需要进行循环,即将rear置为0。
3. 队列的链式存储结构链式存储结构是指用链表来存储队列中的元素,其中每个节点包含一个数据域和一个指针域。
head指向链表头节点,tail指向链表尾节点。
4. 实验流程(1) 编写顺序存储结构下的队列基本操作函数。
(2) 编写链式存储结构下的队列基本操作函数。
(3) 分别测试两种存储方式下各个函数是否正确实现。
三、实验步骤1. 顺序存储结构下的队列基本操作函数(1) 定义队列结构体和初始化函数。
typedef struct {int *data;int front, rear;int maxSize;} SeqQueue;SeqQueue* initSeqQueue(int maxSize) {SeqQueue *q = (SeqQueue*)malloc(sizeof(SeqQueue));q->data = (int*)malloc(sizeof(int) * maxSize);q->front = q->rear = 0;q->maxSize = maxSize;return q;}(2) 实现入队操作。
bool enqueue(SeqQueue *q, int x) {if ((q->rear + 1) % q->maxSize == q->front) return false; // 队满q->data[q->rear] = x;q->rear = (q->rear + 1) % q->maxSize; // 循环return true;}(3) 实现出队操作。
链式存储的实验报告
实验名称:线性表的链式存储结构实验日期:2022年X月X日班级:XX班姓名:XXX学号:XXXXXXX指导教师:XXX一、实验目的1. 理解线性表的链式存储结构及其特点。
2. 掌握链表的基本操作,如创建、插入、删除、查找和遍历等。
3. 通过实际编程实现链表,加深对链式存储结构概念的理解。
二、实验内容与要求1. 定义线性表的链式存储表示,包括节点结构和链表结构。
2. 实现链表的基本操作,如创建链表、插入节点、删除节点、查找节点和遍历链表等。
3. 编写测试代码,验证链表操作的正确性。
三、实验步骤1. 定义链表节点结构体,包含数据和指向下一个节点的指针。
2. 创建链表结构体,包含指向头节点的指针和节点数量。
3. 实现链表创建操作,初始化链表。
4. 实现链表插入操作,包括在链表头部、尾部和指定位置插入节点。
5. 实现链表删除操作,包括删除链表头部、尾部和指定位置的节点。
6. 实现链表查找操作,根据节点数据查找节点在链表中的位置。
7. 实现链表遍历操作,打印链表中的所有节点数据。
8. 编写测试代码,验证链表操作的正确性。
四、实验代码```c#include <stdio.h>#include <stdlib.h>// 定义链表节点结构体typedef struct Node {int data;struct Node next;} Node;// 创建链表Node createList() {Node head = (Node)malloc(sizeof(Node));if (head == NULL) {printf("Memory allocation failed!\n"); return NULL;}head->next = NULL;return head;}// 在链表头部插入节点void insertAtHead(Node head, int data) {Node newNode = (Node)malloc(sizeof(Node)); if (newNode == NULL) {printf("Memory allocation failed!\n"); return;}newNode->data = data;newNode->next = head->next;head->next = newNode;}// 在链表尾部插入节点void insertAtTail(Node head, int data) {Node newNode = (Node)malloc(sizeof(Node)); if (newNode == NULL) {printf("Memory allocation failed!\n"); return;}newNode->data = data;newNode->next = NULL;Node current = head;while (current->next != NULL) {current = current->next;}current->next = newNode;}// 删除链表头部节点void deleteAtHead(Node head) {if (head->next == NULL) {printf("List is empty!\n");return;}Node temp = head->next;head->next = temp->next;free(temp);}// 删除链表尾部节点void deleteAtTail(Node head) {if (head->next == NULL) {printf("List is empty!\n");return;}Node current = head;while (current->next->next != NULL) { current = current->next;}Node temp = current->next;current->next = NULL;free(temp);}// 删除指定位置的节点void deleteAtPosition(Node head, int position) {if (head->next == NULL || position < 0) {printf("Invalid position!\n");return;}Node current = head;int index = 0;while (current->next != NULL && index < position - 1) { current = current->next;index++;}if (current->next == NULL) {printf("Invalid position!\n");return;}Node temp = current->next;current->next = temp->next;free(temp);}// 查找节点Node findNode(Node head, int data) {Node current = head->next;while (current != NULL) {if (current->data == data) { return current;}current = current->next;}return NULL;}// 遍历链表void traverseList(Node head) {Node current = head->next;while (current != NULL) {printf("%d ", current->data); current = current->next;}printf("\n");}// 释放链表内存void freeList(Node head) {Node current = head;while (current != NULL) {Node temp = current;current = current->next;free(temp);}}int main() {Node head = createList();insertAtHead(head, 3);insertAtHead(head, 2);insertAtHead(head, 1);insertAtTail(head, 4);insertAtTail(head, 5);printf("Original list: ");traverseList(head);deleteAtHead(head);deleteAtTail(head);printf("List after deleting head and tail: ");traverseList(head);deleteAtPosition(head, 1);printf("List after deleting node at position 1: ");traverseList(head);Node node = findNode(head, 3);if (node != NULL) {printf("Node with data 3 found at position: %d\n", (head->next == node ? 1 : (head->next != NULL ? 2 : 3)));} else {printf("Node with data 3 not found.\n");}freeList(head);return 0;}```五、实验结果与分析1. 通过实验,成功实现了线性表的链式存储结构,包括创建、插入、删除、查找和遍历等基本操作。
实验1 线性表的基本操作
ElemType *p=L.elem+1;
while(i<=L.length&&*p!=cur_e)
{
p++;
i++;
}
if(i>L.length)
return*--p;
return 1;
}
}
int NextElem(SqList L,ElemType cur_e,ElemType &next_e)
int i;
p=L.elem;
for(i=1;i<=L.length;i++)
vi(*p++);
cout<<endl;
return 1;
} void print(ElemType &c) {
printf("%d ",c); } // 线性表的单链表存储结构 struct LNode { ElemType data; LNode *next; }; typedef LNode *LinkList; // 另一种定义LinkList的方法 // 操作结果:构造一个空的线性表L Status InitList(LinkList &L) { L=(LinkList)malloc(sizeof(LNode)); // 产生头结点,并使L指向此头结点 if(!L) // 存储分配失败
// 操作结果:用e返回L中第i个数据元素的值 if(i<1||i>L.length)
exit(1); e=*(L.elem+i-1); return 1; } int equal(ElemType c1,ElemType c2) { // 判断是否相等的函数,Union()用到 if(c1==c2)
单链表的实现及其基本操作
单链表的实现及其基本操作结点的引⼊链表是⼀种链式存储结构,链式存储结构的特点是⽤⼀组任意的存储单元存储数据元素。
为了能正确表⽰数据元素之间的线性关系,需引⼊结点概念。
⼀个结点表⽰链表中的⼀个数据元素,节点中除了储存数据元素的信息,还必须存放指向下⼀个节点的的指针(单、双链表的最后⼀个节点除外,它们存储的是⼀个空指针NULL)结点的结构如下图所⽰:代码如下:1 typedef struct node{2int data;3struct node* pNext;4 }Node, *PNode;View Code注:这⾥假设结点中储存的是整型 (int) 的数据单链表由多个结点依次连接⽽成,我们不难想象出它结构:我们注意到:在第⼀个结点的前⾯多了⼀个头结点,这是为了处理空表的⽅便⽽引⼊的,它的指针指向链表的第⼀个结点,⽽它的data域不存放任何信息。
单链表的基本操作1.创建链表1 PNode createList()2 {3int len, value;45 PNode pHead = (PNode)(malloc(sizeof(Node)));6 PNode pTail = pHead;7 pTail->pNext = NULL;89 printf("请输⼊你要的节点个数:");10 scanf("%d", &len);11for(int i=1;i<=len;i++){12 printf("请输⼊第%d个节点的值:", i);13 scanf("%d", &value);1415 PNode pNew = (PNode)malloc(sizeof(Node));16 pNew->data = value;17 pTail->pNext = pNew;18 pTail = pNew;19 pTail->pNext = NULL;20 }2122return pHead;23 }View Code2.遍历链表void traverse(PNode pHead){printf("遍历结果为:\n");PNode pTra = pHead;while(pTra->pNext != NULL){printf("%d ", pTra->pNext->data);pTra = pTra->pNext;}printf("\n");}View Code3.判断链表是否为空1bool isEmpty(PNode pHead)2 {3if(pHead->pNext==NULL)4return true;5else6return false;7 }View Code4.链表长度1int length(PNode pHead)2 {3int len = 0;4while(pHead->pNext!=NULL){5 pHead = pHead->pNext;6 len++;7 }8return len;910 }View Code5.插⼊结点1bool insert(PNode pHead, int pos, int val)2 {3if(pos<1 || pos>length(pHead)){4return false;5 }else{6 PNode pInsert = pHead;7for(int i=1;i<pos;i++){8 pInsert = pInsert->pNext;9 }1011 PNode pNew = (PNode)malloc(sizeof(Node));12 pNew->data = val;13 pNew->pNext = pInsert->pNext;14 pInsert->pNext = pNew;1516return true;17 }1819 }View Code6.删除结点1bool del(PNode pHead, int pos)2 {3if(pos<1 || pos>length(pHead)){4return false;5 }else{6 PNode pDel = pHead;7for(int i=1;i<pos;i++){8 pDel = pDel->pNext;9 }1011if(pos==length(pHead)){12free(pDel->pNext);13 pDel->pNext = NULL;14 }else{15 PNode pNext = pDel->pNext->pNext;16free(pDel->pNext);17 pDel->pNext = pNext;18 }1920return true;2122 }232425 }View Code7.查找节点(1)按元素值查找1 PNode locate(PNode pHead, int value)2 {3 PNode p = pHead->pNext;4while(p&&p->data!=value){ //NULL 是 05 p = p->pNext;6 }7return p;8 }View Code(2)按序号查找1 PNode get(PNode pHead, int k)2 {3 PNode p = pHead;4for(int i=1;i<=k;i++){5 p = p->pNext;6 }7return p;89 }View Code完整代码1 #include<stdio.h>2 #include<stdlib.h>3 typedef struct node{4int data;5struct node* pNext;6 }Node, *PNode;78 PNode createList();9void traverse(PNode pHead);10bool isEmpty(PNode pHead);11int length(PNode pHead);12bool insert(PNode pHead, int pos, int val);13bool del(PNode pHead, int pos);14 PNode get(PNode pHead, int k); //按序号查找15 PNode locate(PNode pHead, int value);//按值查找 1617int main(void)18 {19//test2021return0;22 }2324 PNode createList()25 {26int len, value;2728 PNode pHead = (PNode)(malloc(sizeof(Node)));29 PNode pTail = pHead;30 pTail->pNext = NULL;3132 printf("请输⼊你要的节点个数:");33 scanf("%d", &len);34for(int i=1;i<=len;i++){35 printf("请输⼊第%d个节点的值:", i);36 scanf("%d", &value);3738 PNode pNew = (PNode)malloc(sizeof(Node));39 pNew->data = value;40 pTail->pNext = pNew;41 pTail = pNew;42 pTail->pNext = NULL;43 }4445return pHead;46 }474849void traverse(PNode pHead)50 {51 printf("遍历结果为:\n");52 PNode pTra = pHead;53while(pTra->pNext != NULL)54 {55 printf("%d ", pTra->pNext->data);56 pTra = pTra->pNext;57 }58 printf("\n");59 }6061bool isEmpty(PNode pHead)62 {63if(pHead->pNext==NULL)64return true;65else66return false;67 }6869int length(PNode pHead)70 {71int len = 0;72while(pHead->pNext!=NULL){73 pHead = pHead->pNext;74 len++;75 }76return len;7778 }7980bool insert(PNode pHead, int pos, int val)81 {82if(pos<1 || pos>length(pHead)){83return false;84 }else{85 PNode pInsert = pHead;86for(int i=1;i<pos;i++){87 pInsert = pInsert->pNext;88 }8990 PNode pNew = (PNode)malloc(sizeof(Node));91 pNew->data = val;92 pNew->pNext = pInsert->pNext;93 pInsert->pNext = pNew;9495return true;96 }9798 }99100bool del(PNode pHead, int pos)101 {102if(pos<1 || pos>length(pHead)){103return false;104 }else{105 PNode pDel = pHead;106for(int i=1;i<pos;i++){107 pDel = pDel->pNext;108 }109110if(pos==length(pHead)){111free(pDel->pNext);112 pDel->pNext = NULL;113 }else{114 PNode pNext = pDel->pNext->pNext;115free(pDel->pNext);116 pDel->pNext = pNext;117 }118119return true;120121 }122123124 }125126 PNode get(PNode pHead, int k)127 {128 PNode p = pHead;129for(int i=1;i<=k;i++){130 p = p->pNext;131 }132return p;133134 }135 PNode locate(PNode pHead, int value)136 {137 PNode p = pHead->pNext;138while(p&&p->data!=value){ //NULL 是 0 139 p = p->pNext;140 }141return p;142 }View Code。
I第九讲(十字链表及基本操作)
(b)每行 列设一个表头结点(结构同元素结点), 每行/列设一个表头结点 结构同元素结点), 每行 列设一个表头结点( 为链构成循环链表, 以down/right为链构成循环链表,即第 列头结点的 为链构成循环链表 即第i列头结点的 down指向该列上第 个非 元素,第i 行头结点的 指向该列上第1个非 元素, 指向该列上第 个非0元素 right指向该行第 个非 元素.第i列/行上最后一个 指向该行第1个非 元素. 列 行上最后一个 指向该行第 个非0元素 结点的down/right指向该列 行的头结点.若某列 行 指向该列/行的头结点 若某列/行 结点的 指向该列 行的头结点. 中无非0元素 则令它的头结点down/right域指向自 元素, 中无非 元素,则令它的头结点 域指向自 己. (c)设一个总头结点(结构同元素结点),令总 设一个总头结点( ),令总 设一个总头结点 结构同元素结点), 头结点和各个列/行头结点用 字段 按列/行序构 头结点和各个列 行头结点用val字段,按列 行序构 行头结点用 字段, 成一个循环单链表. 成一个循环单链表.
row元素在稀疏矩阵中的行号col元素在稀疏矩阵中的列号val元素值down指向同列中下一个非0元素结点right指向同行中下一个非0元素结点rowcolvaldownrightb每行列设一个表头结点结构同元素结点以downri上第1个非0元素第i行头结点的right指向该行第1个非0元素
(d)可令总头结点的 可令总头结点的row,col与val 分别表示矩阵的 , 与 可令总头结点的 最大行号,列号与非0元素个数 元素个数, 最大行号,列号与非 元素个数,而down/right指向 指向 行的头结点. 第1列/行的头结点.该总头结点可作为整个十字链表 列 行的头结点 的代表. 的代表. (e)由于行与列的头结点分别使用 由于行与列的头结点分别使用right域与 域与down域 由于行与列的头结点分别使用 域与 域 (不同时使用 ,故第i列与第 行头结点可合用同一个 不同时使用),故第 列与第i 不同时使用 列与第 头结点(对所有可能的i),以节省存储空间. ),以节省存储空间 头结点(对所有可能的i),以节省存储空间. (f)有时,为了快速访问行 列头结点,设置一个一维 有时, 列头结点, 有时 为了快速访问行/列头结点 数组headNodes[] ,使headNodes[i]指向 行/列的 数组 指向i行 列的 指向 头结点.但这并不是必须的,因为各行/列的头结点 头结点.但这并不是必须的,因为各行 列的头结点 已形成了一个循环单链表, 已形成了一个循环单链表,故若已知十字链表总头 结点,即可搜索到任一头结点. 结点,即可搜索到任一头结点.
链表基本操作实验报告
实验2链表基本操作实验一、实验目的1. 定义单链表的结点类型。
2. 熟悉对单链表的一些基本操作和具体的函数定义。
3. 通过单链表的定义掌握线性表的链式存储结构的特点。
二、实验内容与要求该程序的功能是实现单链表的定义和主要操作。
女口:单链表建立、输出、插入、删除、查找等操作。
该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。
程序中的单链表(带头结点)结点为结构类型,结点值为整型。
要求:同学们可参考指导书实验2程序、教材算法及其他资料编程实现单链表相关操作。
必须包括单链表创建、输出、插入、删除操作,其他操作根据个人情况增减。
三、算法分析与设计。
1•创建单链表:头结点LA1 A2An A2.单链表插入void LinkedListlnsert(LinkedList L,int i,ElemType x) 链表插入函数(L头指针,i插入位置,x插入兀素)LinkedList p,s;疋义结构体类型指针p,sj=1;p=L;疋义整型j计数,寻找插入位置,p指针指向头结点p=p->next;j++; 满足条件时p指针后移,j自加1while(p&&j<i) 当p为真且j<i时循环j 〜____ p=NULL||j<i一一printf("插入位置不正确\n");s=(LNode *)malloc(sizeof(LNode));使用malloc函数动态分配存储空间,指针s指向新开辟的结点,并将插入元素x存放到新开辟结点s的数据域,将结点s指向i+1 结点位置,第i个结点指向s,实现了链表元素插入。
by1s->data=x; s->n ext=p->n ext; p->n ext=s;3.单链表的删除:p->n ext=p->n ext- >n ext;15 x=表 -俞弹i tl 度 書翁的琴素汕6.从链表中查找元素四、运行结果1.单链表初始化骨选择夷进行的操作、遍历链表 J 从链表中査找元素1.如程輕巴章兰与竽疋匹菇值里同門元素在顺序aw 位置 迥链五Fs 已元壽上也库吏卬删除更10^5^性表 毒他键退出。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
} void main() { char STACK[N]; STLink top=NULL; cout<<"你想输入的括号总数:n="; int n; cin>>n; cout<<"输入含括号()、{}、[]的表达式:"; for(int i=0;i<n;i++) { cin>>STACK[i]; } int result=CHECK(top,n,STACK); switch(result) { case 1:cout<<"左右括号配对次序不正确"<<endl;break; case 2:cout<<"右括号多于左括号"<<endl;break; case 3:cout<<"左括号多于右括号"<<endl;break; case 4:cout<<"左右括号匹配正确"<<endl;break; } }
if(item<list->data) //若a小于第一个链接点 { p->link=list; //将新的链接点插在链表最前面 list=p; //list指向被插入的新结点 } else { q=list; while(q!=NULL && item>=q->data) //寻 找插入位置 { r=q; //r指针总是指向当 前链接点的直接前驱结点 q=q->link; } p->link=q; r->link=p; //将新的链结点插在q指 示的链结点后面 } } } return (list); } LinkList deleteline(LinkList &list,int a) //删除链表中数 据域值为item的所有连接点 { LinkList p,q=list; p=list->link; while(p!=NULL) { if(p->data==a) { q->link=p->link; free(p); p=q->link; } else
{ q=p; p=p->link; } } if(list->data==a) { q=list; list=list->link; free(q); } return(list); } LinkList overturnline(LinkList &list) //链表翻转 { LinkList p,q=NULL,r; p=list; while(p!=NULL) { r=q; q=p; p=p->link; q->link=r; } list=q; return (list); } LinkList combine(LinkList &listA,LinkList &listB) //将两个 按值有序链接的非空线性链表合并为一个 { LinkList listC,p=listA,q=listB,r; if(listA->data<=listB->data) { listC=listA; r=listA; p=listA->link; }
有两个进程同时存在于一个应用程序中,第一个进程连续在 屏幕上显示字符“X”,第二个进程不断检查键盘上是否有输 入,若有则读入用户键入的字符,将其保存到键盘缓冲区 中。
四、实验过程原始数据记录 1、线性表的链表实现:插入、删除、翻转
#include<iostream> #include<malloc.h> using namespace std; typedef struct node { int data; struct node *link; }LNode,*LinkList; LinkList insert(LinkList &list) //新建一个链表 或插入新元素 { int item,n; LinkList p,q,r; //list第一个结点指针 cout<<"how many data do you want to insert:n="; cin>> n; for(int i=0;i<n;i++) { cout<<"data["<<i<<"]="; cin>>item; //输入储存的数据 p=(LinkList)malloc(sizeof(LNode)); //申请一个新的结 点 p->data=item; //将数据放入结点的数据域 p->link=NULL; //链尾结点指针域置空 if(list==NULL) { list=p; } else {
else { listC=listB; r=listB; q=listB->link; } while(p!=NULL && q!=NULL) { if(p->data<=q->data) { r->link=p; r=p; p=p->link; } else { r->link=q; r=q; q=q->link; } } r->link=p?p:q; return (listC); } int line(LinkList &q) //将数据域值链表排列展示 { int n=0; cout<<"数据域值从小到大排列的有序链表:"; while(q!=NULL) { n++; cout<<q->data<<' '; q=q->link; } cout<<"\n头结点后面的结点数n="<<n; return (n); }
void main() { int choice; LinkList head=NULL,list=NULL; head=(LinkList)malloc(sizeof(LNode)); cout<<"input LinkListA."<<endl; list=head->link=insert(list); head->data=line(head->link); while(1) { cout<<"\nwhat funtion do you want to execute?\n0-exit 1-insert 2-delete 3-overturn 4-combine.\nchoice-"; cin>>choice; switch(choice) { case 1:{ cout<<"插入新元素."<<endl; if(list->data<list->link->data||list->data==list>link->data) { cout<<"链表为升序,不用翻转."<<endl; list=head->link=insert(list); head->data=line(head->link); } else { head->link=overturnline(list); cout<<"链表已由降序翻转为升序."<<endl; list=head->link=insert(list); head->data=line(head->link); } }break; case 2:{ int item; cout<<"the item you want to delete="; cin>>item; list=head->link=deleteline(list,item);
2、链式堆栈的实现
#include<iostream> #include<malloc.h> #define N 100 using namespace std; typedef struct node {
//定义链接堆栈类型
char data; struct node *link; }STNode,*STLink; int EMPTYSLINK(STLink top) //测试链接堆栈是否为空 { return(top==NULL); } int RUSHLINK(STLink &top,char item) //链接堆栈插入 { STLink p; if(!(p=(STLink)malloc(sizeof(STNode)))) return 0; else { p->data=item; p->link=top; top=p; return 1; } } int CHECK(STLink &top,int n,char STACK[]) { STLink p; p=(STLink)malloc(sizeof(STNode)); for(int i=0;i<n;i++) { if(STACK[i]=='('||STACK[i]=='{'||STACK[i]=='[') RUSHLINK(top,STACK[i]); else if(EMPTYSLINK(top)) return 2; else if((top->data=='(' && STACK[i]==')')||(top>data=='{' && STACK[i]=='}')||(top->data=='[' && STACK[i]==']')) {p=top;top=top->link;free(p);} else return 1; } if(!(EMPTYSLINK(top))) return 3; else return 4;