实验一:线性表的存储结构定义及基本操作
数据结构 线性表
第1讲线性表
本章主要掌握如下内容:
线性表的定义和基本操作,线性表的实现,线性表的顺序存储结构及链式存储结构,线性表的应用。
知识点分析
(一)线性表的定义和基本操作
1.线性表基本概念
1)定义:是由相同类型的结点组成的有限序列。如:由n个结点组成的线性表
(a1, a2, …, a n)
a1是最前结点,a n是最后结点。结点也称为数据元素或者记录。
2)线性表的长度:线性表中结点的个数称为其长度。长度为0的线性表称为空表。
3)结点之间的关系:设线性表记为(a1,a2,…a i-1 , a i, a i+1 ,…a n),称a i-1是a i的直接前驱结点
....(简称前驱),
a i+1是a i的直接后继结点
....(简称后继)。
4)线性表的性质:
①线性表结点间的相对位置是固定
..的,结点间的关系由结点在表中的位置确定。
②如果两个线性表有相同的数据结点,但它们的结点顺序不一致,该两个线性表也是不相等的。
注意:线性表中结点的类型可以是任何数据(包括简单类型和复杂类型),即结点可以有多个成分,其中能唯一标识表元的成分称为关键字(key),或简称键。以后的讨论都只考虑键,而忽略其它成分,这样有利于把握主要问题,便于理解。
『经典例题解析』
线性表的特点是每个元素都有一个前驱和一个后继。( )
【答案】错误。
【解析】线性表的第一个数据元素没有前驱,最后一个元素没有后继。其余的所有元素都有一个前驱和后继。
2.线性表的抽象数据类型
线性表是一个相当灵活的数据结构,其长度可以根据需要增加或减少。从操作上讲,用户不仅可以对线性表的数据元素进行访问操作,还可以进行插入、删除、定位等操作。
实验一 线性表的基本操作实现及其应用
实验一线性表的基本操作实现及其应用
一、实验目的
1、熟练掌握线性表的基本操作在两种存储结构上的实现。
2、会用线性链表解决简单的实际问题。
二、实验内容
题目一、该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。单链表操作的选择以菜单形式出现,如下所示:
please input the operation:
1.初始化
2.清空
3.求链表长度
4.检查链表是否为空
5.检查链表是否为满
6.遍历链表(设为输出元素)
7.从链表中查找元素
8.从链表中查找与给定元素值相同的元素在表中的位置
9.向链表中插入元素 10. 从链表中删除元素
其他键退出。。。。。
其中黑体部分必做
题目二、约瑟夫环问题:
设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。
struct node
(一)
1.进入选择界面后,先选择7,进行插入:
2.选择4,进行遍历,结果为:
3.选择2,得出当前链表长度.
4.选择3,得出当前链表为.
5.选择分别选择5、6进行测试.
6.选择8,分别按位置和元素值删除.
7.选择9,或非1-8的字符,程序结束.
实验01 线性表的基本操作
实验01 线性表的基本操作
一、实验目的
1. 了解线性表的结构特点及有关概念;
2. 理解线性表的存储结构;
3. 掌握顺序表及单链表的基本操作算法。
二、实验内容
1、编写程序实现顺序表的各种基本运算:初始化、插入、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。在此基础上设计一个主程序完成如下功能:
(1)初始化顺序表L;
(2)依次在表尾插入a,b,c,d,e五个元素;
(3)输出顺序表L;
(4)输出顺序表L的长度;
(5)判断顺序表L是否为空;
(6)输出顺序表L的第4个元素;
(7)输出元素c的位置;
(8)在第3个位置上插入元素f,之后输出顺序表L;
(9)删除L的第2个元素,之后输出顺序表L;
(10)销毁顺序表L。
2、编写程序实现单链表的各种基本运算:初始化、插入、删除、取表元素、求表长、输出表、销毁、判断是否为空表、查找元素。在此基础上设计一个主程序完成如下功能:
(1)初始化单链表L;
(2)依次在表尾插入a,b,c,d,e五个元素;
(3)输出单链表L;
(4)输出单链表L的长度;
(5)判断单链表L是否为空;
(6)输出单链表L的第4个元素;
(7)输出元素c的位置;
(8)在第3个位置上插入元素f,之后输出单链表L;
(9)删除L的第2个元素,之后输出单链表L;
(10)销毁单链表L。
三、实验要点及说明
一.顺序表
1.顺序表初始化:(1)为顺序表L动态分配一个预定大小的数组空间,使elem 指向这段空间的基地址。(2)将表的当前长度设为0.
2.顺序表的取值:(1)判断指定的位置序号i值是否合理(1<=i<=L.length),
线性表的操作算法实验报告
实验报告
2013学年第一学期任课老师:
2、在实验过程中遇到的问题与解决方法:
问题有很多,比如局部变量与全局变量的声明,常常顾此失彼,此处概念仍然不清。
填写内容时,可把表格扩大。
附:实验源程序代码
顺序表(链表):
// 线性表(链表)
#include <stdio.h>
#include "malloc.h"
#include <iostream>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//创建一个长度为n的链表
void CreateList(LinkList &L, int n) {
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
for (int i=n; i>0; --i)
{
LinkList p = (LinkList)malloc(sizeof(LNode));
cin>>p->data;
p->next = L->next;
L->next = p;
}
}
// 在链表L第i个元素之前插入元素e
int ListInsert(LinkList &L, int i, int e) {
LinkList p=L;
int j=0;
while(p&&j<i-1) {
p=p->next; ++j;
}
if(!p ||j>i-1) return 0;
2-线性表的定义与基本操作
线性表
目录C O N T E N T S
线性表的定义
1
线性表: n个同类型数据元素的有限序列,记为:
L=(a1,a2,...,a i,...,a n )
1 线性表的定义
线性表: n个同类型数据元素的有限序列,记为:L=(a1,a2,...,a i,...,a n)
L为表名;
i为数据元素a i在线性表中的位序;
n为线性表的表长; n=0时称为空表;
数据元素之间的关系是:
a i-1领先于a i,a i领先于a i+1。
称a i-1是a i的直接前驱,a i+1是a i的直接后继,除第一元素a1外,均有唯一的前驱;
除最后元素a n外,均有唯一的后继;
特点:•a i 的数据类型相同•位序i 从1开始;•前驱与后继1 线性表的定义
线性表: n 个同类型数据元素的有限序列,记为:
L=(a 1,a 2,...,a i ,...,a
n )
L
为表名;i 为数据元素a i 在线性表中的位序;
n 为线性表的表长; n=0时称为空表;
数据元素之间的关系是:
a
i-1领先于a
i ,a i 领先于a i+1。
称a i-1是a i 的直接前驱,a
i+1是a i 的直接后继,
除第一元素a 1外,均有唯一的前驱;
除最后元素a n 外,均有唯一的后继;
•练习题
1.判断题:一个教室里面的5排学生,每排坐6个人,这些人的关系是不是线性表?
2.电影院售票处排队购票,一共有3个人,如果用ai表示第i个人,则用L=(a1,a2,a3)
表示当前排队的人构成的线性表。请问,a2的直接前驱和直接后继分别是谁?
目录C O N T E N T S
《数据结构》线性结构实验报告
《数据结构》线性结构实验报告
2、源程序:
#include <stdio.h>
#include<stdlib.h>
#define MAXSIZE 1024
typedef int elemtype;
typedef struct SequenStack
{
elemtype data[MAXSIZE];
int top;
}SequenStack;
SequenStack * Init_SequenStack()
{
SequenStack * S;
S = (SequenStack *)malloc(sizeof(SequenStack));
if (S == NULL)
return S;
S->top = -1;
return S;
}
int SequenStack_Empty(SequenStack * S)//判栈空
{
if (S->top == -1)
{
return 1;
}
{
int a;
printf("请以十进制输入一个数:\n");
scanf_s("%d", &a);
printf("转化为二进制为:");
Conversion(a);
printf("\n");
}
运行结果:
3、源程序:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
char data;
struct node* next;
}LinkStack;
//初始化
LinkStack* Init_LinkStack()
线性表的存储结构定义及基本操作
一、实验目的:
. 掌握线性表的逻辑特征
. 掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算
. 熟练掌握线性表的链式存储结构定义及基本操作
. 理解循环链表和双链表的特点和基本运算
. 加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实际问题的编程能力
二、实验内容:
(一)基本实验内容(顺序表):
建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、
查找元素、判线性表是否为空;
1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下操作:
. 创建一个新的顺序表,实现动态空间分配的初始化;
. 根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插入),形成有序
顺序表;
. 根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个结点,或者删
除指定值的所有结点(值删除);
. 利用最少的空间实现顺序表元素的逆转;
. 实现顺序表的各个元素的输出;
. 彻底销毁顺序线性表,回收所分配的空间;
. 对顺序线性表的所有元素删除,置为空表;
. 返回其数据元素个数;
. 按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第i 个结点,查找该元素的值,对
查找结果进行返回;
. 按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行返回;
. 判断顺序表中是否有元素存在,对判断结果进行返回;
. 编写主程序,实现对各不同的算法调用。
2.实现要求:
对顺序表的各项操作一定要编写成为C(C++)语言函数,组合成模块化的形式,每个算法的实现要
线性表的存储结构定义及基本操作(实验报告)
线性表的存储结构定义及基本操作(实验报告)
线性表的存储结构定义及基本操作一
掌握线性表的逻辑特征
掌握线性表顺序存储结构的特点熟练掌握顺序表的基本运算
熟练掌握线性表的链式存储结构定义及基本操作
理解循环链表和双链表的特点和基本运算
加深对顺序存储数据结构的理解和链式存储数据结构的理解逐步培养解决实际问题的编程能力
二
一基本实验内容顺序表
建立顺序表完成顺序表的基本操作初始化插入删除逆转输出销毁置空表求表长查找元素判线性表是否为空
1 问题描述
利用顺序表设计一组输入数据假定为一组整数能够对顺序表进行如下操作
创建一个新的顺序表实现动态空间分配的初始化
根据顺序表结点的位置插入一个新结点位置插入也可以根据给定的值进行插入值插入形成有序顺序表
根据顺序表结点的位置删除一个结点位置删除也可以根据给定的值删除
对应的第一个结点或者删除指定值的所有结点值删除
利用最少的空间实现顺序表元素的逆转
实现顺序表的各个元素的输出
彻底销毁顺序线性表回收所分配的空间
对顺序线性表的所有元素删除置为空表
返回其数据元素个数
按序号查找根据顺序表的特点可以随机存取直接可以定位于第 i 个结点查找该元素的值对查找结果进行返回
按值查找根据给定数据元素的值只能顺序比较查找该元素的位置对查找结果进行返回
判断顺序表中是否有元素存在对判断结果进行返回
编写主程序实现对各不同的算法调用
2 实现要求
对顺序表的各项操作一定要编写成为C C 语言函数组合成模块化的形式每个算法的实现要从时间复杂度和空间复杂度上进行评价
初始化算法的操作结果构造一个空的顺序线性表对顺序表的空间进行动态管理实现动态分配回收和增加存储空间
计算机科学考研数据结构复习指南
计算机科学考研数据结构复习指南在计算机科学考研中,数据结构是一个重要的考点。掌握好数据结
构的知识,不仅能提高考试成绩,还能为以后的工作打下坚实的基础。本文将提供一份详细的数据结构复习指南,帮助考生高效备考。
一、线性表
线性表是数据结构中最基本的一种结构,包括线性表的定义、基本
操作以及常见的线性表实现方式。在考研中,常常会涉及到线性表的
操作、线性表的存储结构以及线性表的应用等方面的内容。
1. 定义与基本操作
线性表是由n(n≥0)个具有相同数据类型的元素组成的有限序列,其
中包含了若干基本操作,如插入、删除、查找等。
2. 线性表的存储结构
线性表有两种基本的存储结构:顺序存储结构和链式存储结构。顺
序存储结构是将线性表的元素依次存储在一块连续的内存空间中,而
链式存储结构是通过指针将各个元素连接起来。
3. 线性表的应用
线性表广泛应用于各个领域,如栈、队列、串等。学习线性表的应
用场景,能帮助考生更好地理解线性表的概念和操作。
二、树与二叉树
树是一种非线性数据结构,它由n(n≥0)个节点组成,节点之间存在着一种特定的关系。树结构具有层次性和递归性等特点,而二叉树则是树结构的一种特殊形式。
1. 树的基本概念
树由节点和边组成,其中存在一个特殊的节点称为根节点,其他节点又可以分为若干个不相交的子集,每个子集又可看作是一个树。
2. 二叉树的定义与性质
二叉树是一种特殊的树结构,其中每个节点最多有两个子节点。二叉树的特点使得它在实际应用中具有广泛的用途,如二叉搜索树、线索二叉树等。
3. 常见的树和二叉树算法
针对树和二叉树结构,常见的算法包括前序遍历、中序遍历、后序遍历、层次遍历等。熟练掌握这些遍历算法,能够快速解决树和二叉树相关的问题。
C语言-线性表实验报告
typedef struct LNode
{DataType data;
struct LNode *next;
}LNode,*LinkedList;
LinkedList LinkedListInit() //初始化单链表
void LinkedListClear(LinkedList L) // 清空单链表
{printf("%d ",p->data); p=p->next;}
}
printf("\n");
}
(5)求单链表长度
int LinkedListLength (LinkedList L)
{LinkedList p;
int j;
p=L->next;
j=0;
while(p!=NULL)
{ j++;p=p->next; }
p=LinkedListGet(L,j);
if(p) printf("链表中第%d个元素的值为:%d\n",j,p->data);
else printf("查询位置不正确\n");
break;
case 7:printf("请输入待查询元素的值:");
scanf("%d",&e);
湘潭大学 数据结构实验1 实验报告 源代码 线性表基本操作
“数据结构和算法II”课程实验报告
实验名称:线性表的存储结构定义及基本操作
班级姓名学号实验日期:
实验机时:2 学时实验成绩:
-------------------------------------------------------------------------------
一.实验目的:
1.掌握线性表的逻辑特征
2.掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算
3.熟练掌握线性表的链式存储结构定义及基本操作
4.理解循环链表和双链表的特点和基本运算
5.加深对栈结构的理解,培养解决实际问题的编程能力。
6.加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决
实际问题的编程能力
二.实验内容:
(1)基本实验内容:
建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空表、求表长、查找元素、判线性表是否为空;
建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输出;其它基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、搜索结点。
(2)扩展实验内容:
查前驱元素、查后继元素、顺序表合并,两个有序单链表的合并操作等。
三.程序及注释:
1.顺序表:
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
实验一--线性表的定义与实现
实验一预习报告
一、实验名称:线性表的定义与实现
二、实验目的
1、掌握顺序存储的线性表的定义及基本操作的实现。
2、掌握链式存储的线性表的定义及基本操作的实现。
3、掌握线性表两种存储结构的特点及应用场合。
4、掌握运用线性表进行一元多项式的运算处理方法。
三、实验要求
1、实现顺序表和链表的关键算法操作,为关键算法画出流程图或算法描述;
2、用C语言编写程序实现实验内容,上机调试所编写的代码;
四、实验内容
1、实现顺序表各种基本运算。编写一个程序sqlist.cpp,实现顺序表整体建表算法(元素类型自定)及各种基本运算。
2、实现单链表各种基本运算。编写一个程序linklist.cpp,实现单链表的各种基本运算和整体建表算法(单链表的元素类型ElemType自定)。
3、用带头结点的单链表存储一元多项式,实现两个多项式建表和相加运算。
五、预习内容
1、顺序表的结构有什么特点?基本运算有哪些?
(要求:以问答题的形式回答,将你能想到的各种基本运算用函数名、参数列表、初始条件、操作结果的形式进行描述,具体实现部分不用写)
2、单链表的链式存储有什么特点?基本运算有哪些?
(要求同上)
3、用带头结点的单链表存储一元多项式,实现两个多项式相加运算的基本思路是什么?
(要求同上)
六.预习中的问题
(根据实际情况自行填写)
实验一实验报告
一、实验名称:线性表的定义与实现
二、实验目的
1、掌握顺序存储的线性表的定义及基本操作的实现。
2、掌握链式存储的线性表的定义及基本操作的实现。
3、掌握线性表两种存储结构的特点及应用场合。
4、掌握运用线性表进行一元多项式的运算处理方法。
数据结构线性表实验报告
数据结构线性表实验报告
数据结构线性表实验报告
引言:
数据结构是计算机科学中的一个重要概念,它研究如何组织和存储数据,以便
能够高效地访问和操作。线性表是数据结构中最基本的一种,它是一种有序的
数据元素集合,其中的元素之间存在一对一的关系。本次实验旨在通过实际操
作线性表,加深对数据结构的理解,并掌握基本的线性表操作。
实验目的:
1. 理解线性表的概念和特点;
2. 掌握线性表的基本操作,如插入、删除、查找等;
3. 熟悉线性表的顺序存储结构和链式存储结构;
4. 分析不同存储结构的优缺点。
实验内容:
1. 实现线性表的顺序存储结构
顺序存储结构是将线性表的元素按照其逻辑顺序依次存放在一块连续的存储空
间中。我们可以使用数组来实现顺序存储结构。首先,定义一个固定大小的数
组作为线性表的存储空间,然后通过数组的下标来访问和操作线性表中的元素。在插入和删除元素时,需要移动其他元素的位置,以保持线性表的有序性。
2. 实现线性表的链式存储结构
链式存储结构是将线性表的元素存储在一系列的结点中,每个结点包含一个数
据元素和一个指向下一个结点的指针。通过将各个结点用指针连接起来,形成
一个链表。在插入和删除元素时,只需要修改相邻结点之间的指针,而不需要
移动其他元素的位置。
实验步骤:
1. 实现顺序存储结构的线性表
首先,定义一个固定大小的数组,用于存储线性表的元素。然后,实现插入、
删除、查找等基本操作。在插入元素时,需要判断线性表是否已满,如果已满
则需要扩容。在删除元素时,需要判断线性表是否为空,如果为空则无法删除
元素。通过实现这些基本操作,可以对线性表进行增删查改等操作。
数据结构实验指导书-线性表的操作
数据结构实验指导书-线性表的操作
实验1线性表的基本操作
一、实验目的
(1)掌握线性表的逻辑特征;
(2)掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算;
(3)熟练掌握线性表的链式存储结构定义及基本操作;(4)理解循环链表和
双链表的特点和基本运算;
(5)加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐
步培养解决实际问题的编程能力;二、实验内容
1、创建有若干个元素(可以是整型数值)的顺序表,实现对顺序表
的初始化,对已建立的顺序表插入操作、删除操作、遍历输出顺序表。
要求各个操作均以函数的形式实现,在主函数中调用各个函数实现以
下操作:
(1)从键盘上依次输入21、18、30、75、42、56,创建顺序表,并
输出顺序表中的各元素值。
(2)分别在单链表的第3个位置插入67,给出插入成功或失败的信息,并输出此时顺序表中的各元素值。
(3)删除顺序表中的第6个数据元素,给出删除成功或失败的信息,并输出此时顺序表中的各元素值。
(4)查找顺序表中是否有75这个元素,如果有返回该元素在顺序表
中的位序。
2、创建有若干个元素(可以是整型数值)的单链表,实现对单链表
的初始化,对已建立的顺序表插入操作、删除操作、查找操作、遍历输出
单链表表。要求各个操作均以函数的形式实现,在主函数中调用各个函数
实现以下操作:
(1)从键盘上依次输入21、18、30、75、42、56,创建单链表,并
输出单链表中的各元素值。
(2)分别在单链表的第4个位置,给出插入成功或失败的信息,并
输出单链表中的各元素值。
(3)删除单链表中的第2个数据元素,给出删除成功或失败的信息,并输出单链表中的各元素值。
线性表的基本操作
尾节点的指针域指向头节点,形成一个环状的链表结构。循环链表可 以从任意节点开始遍历整个链表。
04
线性表的基本操作实现
初始化操作
分配存储空间
根据实际需求,为线性表分配一块连续的 存储空间。
设定初始状态
将线性表的长度设为0,表示当前线性表 中没有元素。
返回线性表
返回已分配的线性表,供后续操作使用。
插入操作
确定插入位置
根据给定的插入位置,确定元素应该插入 到线性表的哪个位置。
移动元素
从线性表的末尾开始,将元素依次向后移 动一个位置,直到达到插入位置。
插入新元素
在插入位置处插入新元素。
更新线性表长度
将线性表的长度加1,表示新元素已成功 插入。
删除操作
确定删除位置
根据给定的删除位置,确定需要删除的元 素在线性表中的位置。
插入操作
在指定位置插入一个元素,需 要移动插入位置后的所有元素 ,并更新线性表的长度。
查找操作
根据元素的值查找其在线性表 中的位置,可以采用顺序查找 或二分查找等方法。
初始化操作
创建一个空的线性表,分配必 要的存储空间,并设置初始状 态。
删除操作
删除指定位置的元素,需要移 动删除位置后的所有元素,并 更新线性表的长度。
删除操作
删除指定位置i的元素,需要将i之后的所有元素前移一 位,然后释放位置i处的空间。
实验一线性表地基本操作实现及其应用
实验一线性表的基本操作实现及其应用
一、实验目的
1、熟练掌握线性表的基本操作在两种存储结构上的实现。
2、会用线性链表解决简单的实际问题。
二、实验内容
题目一链表基本操作
该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。单链表操作的选择以菜单形式出现,如下所示:please input the operation:
1.初始化
2.清空
3.求链表长度
4.检查链表是否为空
5.检查链表是否为满
6.遍历链表(设为输出元素)
7.从链表中查找元素
8.从链表中查找与给定元素值相同的元素在表中的位置
9.向链表中插入元素 10. 从链表中删除元素
其他键退出。。。。。
实验一线性表的基本操作实现及其应用
一、实验目的
1、熟练掌握线性表的基本操作在两种存储结构上的实现。
2、会用线性链表解决简单的实际问题。
二、实验内容
题目一链表基本操作
该程序的功能是实现单链表的定义和操作。该程序包括单链表结构类型以及对单链表操作的具体的函数定义和主函数。其中,程序中的单链表(带头结点)结点为结构类型,结点值为整型。单链表操作的选择以菜单形式出现,如下所示:please input the operation:
1.初始化
2.清空
3.求链表长度
4.检查链表是否为空
5.检查链表是否为满
6.遍历链表(设为输出元素)
7.从链表中查找元素
8.从链表中查找与给定元素值相同的元素在表中的位置
9.向链表中插入元素 10. 从链表中删除元素
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.建立一个单链表类型定义的头文件,如取名为:linklistDef.h,以后凡使用该文件定 义的类型,就只需使用包含语句#include “linklistDef.h”即可。
操作结果:在 L 中第 i 个位置之前插入新的数据元素 e,L 的长度加 1; . “位置删除算法”的初始条件:顺序线性表 L 已存在,1≤i≤ListLength(L) ;
操作结果:删除 L 的第 i 个数据元素,并用 e 返回其值,L 的长度减 1 ; . “逆转算法”的初始条件:顺序线性表 L 已存在;
. 修改主程序,实现对各不同的算法调用。 2.实现要求: . “查前驱元素算法” 初始条件:顺序线性表 L 已存在 ;
操作结果:若数据元素存在且不是第一个,则返回前驱,否则操作失败; . “查后继元素算法” 初始条件:顺序线性表 L 已存在 ;
操作结果:若数据元素存在且不是最后一个,则返回后继,否则操作失败; . “无序合并算法”的初始条件:已知线性表 La 和 Lb;
操作结果:返回 L 中数据元素值为 e 的元素位置; . “判表空算法”初始条件:顺序线性表 L 已存在;
操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE; 分析: 修改输入数据,预期输出并验证输出的结果,加深对有关算法的理解。
(二)基本实验内容(链表):
建立单链表,完成链表(带表头结点)的基本操作:建立链表、插入、删除、查找、输 出、求前驱、求百度文库继、两个有序链表的合并操作。
操作结果: 若 cur_e 是 L 的数据元素,且不是第一个,则用 pre_e 返回它的 前驱; . “求后继算法”初始条件: 线性表 L 已存在;
操作结果: 若 cur_e 是 L 的数据元素,且不是最后一个,则用 next_e 返回它 的后继; . “两个有序链表的合并算法”初始条件: 线性表单链线性表 La 和 Lb 的元素按值非递减排 列; 操作结果:归并 La 和 Lb 得到新的单链表。
. 按序号查找,根据顺序表的特点,可以随机存取,直接可以定位于第 i 个结点,查找该 元素的值,对查找结果进行返回; . 按值查找,根据给定数据元素的值,只能顺序比较,查找该元素的位置,对查找结果进行 返回; . 判断顺序表中是否有元素存在,对判断结果进行返回; . 编写主程序,实现对各不同的算法调用。 2.实现要求:
查前驱元素、查后继元素、顺序表合并等. 1.问题描述: . 根据给定元素的值,求出前驱元素; . 根据给定元素的值,求出后继元素; . 对已建好的两个顺序表进行合并操作,若原线性表中元素非递减有序排列,要求合并后的 结果还是有序(有序合并);对于原顺序表中元素无序排列的合并只是完成 A=A∪B(无序合 并),要求同样的数据元素只出现一次。
对链表的各项操作一定要编写成为 C(C++)语言函数,组合成模块化的形式,还要针 对每个算法的实现从时间复杂度和空间复杂度上进行评价。 . “初始化算法”的操作结果:构造一个空的线性表 L,产生头结点,并使 L 指向此头结点; . “建立链表算法” 初始条件:空链存在;
操作结果:选择逆位序或正位序的方法,建立一个单链表,并且返回完 成的结果; . “链表(位置)插入算法”初始条件:已知单链表 L 存在;
操作结果:在带头结点的单链线性表 L 中第 i 个位置之前插入元素 e; . “链表(位置)删除算法”初始条件:已知单链表 L 存在;
操作结果:在带头结点的单链线性表 L 中,删除第 i 个元素,并由 e 返 回其值; . “输出算法”初始条件:链表 L 已存在;
操作结果:依次输出链表的各个结点的值; (三)扩展实验内容(顺序表)
【说明 1】――顺序表的定义与操作 1.可以将这三部分组合在一个文件中,也可以按照项目的方式(多个不同的文件组合
在一起,共同完成一个功能)进行组织(本课程的实验强烈推荐这种形式 ),如将本课程后 续所有算法几乎都要使用的常量定义(#define)和系统函数原型定义(#include)声明组合成 一个文件,存储为一个头文件(取名为 pubuse. h),只需建立一次,以后凡涉及到相关的内 容,只需在你的文件的前面加上一条#include “pubuse. h” 即可,无需重复输入。
二、实验内容:
(一)基本实验内容(顺序表): 建立顺序表,完成顺序表的基本操作:初始化、插入、删除、逆转、输出、销毁, 置空
表、求表长、查找元素、判线性表是否为空; 1.问题描述:利用顺序表,设计一组输入数据(假定为一组整数),能够对顺序表进行如下 操作: . 创建一个新的顺序表,实现动态空间分配的初始化; . 根据顺序表结点的位置插入一个新结点(位置插入),也可以根据给定的值进行插入(值插 入),形成有序顺序表; . 根据顺序表结点的位置删除一个结点(位置删除),也可以根据给定的值删除对应的第一个 结点,或者删除指定值的所有结点(值删除); . 利用最少的空间实现顺序表元素的逆转; . 实现顺序表的各个元素的输出; . 彻底销毁顺序线性表,回收所分配的空间; . 对顺序线性表的所有元素删除,置为空表; . 返回其数据元素个数;
3.关于实验内容要完成的操作,一般都以独立的算法出现,关于某类数据结构的各种 不同算法函数组合在一个文件之中,存储为一个头文件(如取名为 seqlistAlgo. h),以后凡 涉 及 到 要 使 用 本 文 件 中 的 顺 序 表 算 法 , 一 定 要 在 你 的 文 件 的 前 面 加 上 一 条#include “seqlistAlgo. h” 即可,无需重复定义类似的算法,就象使用系统函数一样,只需进行函数原 型的声明即可。
4.还应包含一个 main 函数,作为整个程序的执行入口处,定义测试的数据,完成各种 算法的调用执行,对算法的执行过程和结果进行判断和输出控制,存储为一个源文件(如取 名为 seqlistUse. cpp)。
5.为了对实际问题更加通用和适应,在算法中使用的数据类型为 ElemType,为了与实 际数据类型一致,一般要将 ElemType 用 typedef 重定义:如实际问题中顺序表的每个元素 是整型,则使用 typedef int ElemType; 定义语句;如实际问题中顺序表的每个元素是单 精度实数的话,使用 typedef float ElemType; 定义语句。 【说明 2】――链表的定义与操作
操作结果:依次对 L 的每个数据元素进行交换,为了使用最少的额外 空间,对顺序表的元素进行交换; . “输出算法”的初始条件:顺序线性表 L 已存在;
操作结果:依次对 L 的每个数据元素进行输出; . “销毁算法”初始条件:顺序线性表 L 已存在;
操作结果:销毁顺序线性表 L; . “置空表算法”初始条件:顺序线性表 L 已存在;
实验一:线性表的存储结构定义及基本操作(必做:基本 2 学时,扩
展 4 学时)
一、实验目的:
. 掌握线性表的逻辑特征 . 掌握线性表顺序存储结构的特点,熟练掌握顺序表的基本运算 . 熟练掌握线性表的链式存储结构定义及基本操作 . 理解循环链表和双链表的特点和基本运算 . 加深对顺序存储数据结构的理解和链式存储数据结构的理解,逐步培养解决实际问题 的编程能力
操作结果:将 L 重置为空表; . “求表长算法”初始条件:顺序线性表 L 已存在;
操作结果:返回 L 中数据元素个数; .“按序号查找算法”初始条件:顺序线性表 L 已存在,元素位置为 i,且 1≤i≤ListLength(L)
操作结果:返回 L 中第 i 个数据元素的值 . “按值查找算法”初始条件:顺序线性表 L 已存在,元素值为 e;
其他基本操作还有销毁链表、将链表置为空表、求链表的长度、获取某位置结点的内容、 搜索结点。 1. 问题描述:
利用线性表的链式存储结构,设计一组输入数据(假定为一组整数),能够对单链表进行 如下操作: . 初始化一个带表头结点的空链表; . 创建一个单链表是从无到有地建立起一个链表,即一个一个地输入各结点数据,并建立 起前后相互链接的关系。又分为逆位序(插在表头)输入 n 个元素的值和正位序(插在表尾)输 入 n 个元素的值; . 插入结点可以根据给定位置进行插入(位置插入),也可以根据结点的值插入到已知的链 表中(值插入),且保持结点的数据按原来的递增次序排列,形成有序链表。 . 删除结点可以根据给定位置进行删除(位置删除),也可以把链表中查找结点的值为搜索 对象的结点全部删除(值删除); . 输出单链表的内容是将链表中各结点的数据依次显示,直到链表尾结点; . 编写主程序,实现对各不同的算法调用。 其它的操作算法描述略。 2.实现要求:
3.关于实验内容要完成的操作,一般都以独立的算法出现,建立一个单链表的基本算
法文件,将各种不同算法组合在一个文件之中,存储为一个头文件如取名为:linklistAlgo.h, 后凡涉及到要使用本文件中的单链表算法,一定要在你的文件的前面加上一条#include “linklistAlgo.h” 即可,实现的算法函数,如 ListInit_Link、ListInsert_Link、ListDelete_Link、 ListTraverse_Link、PriorElem_Link、NextElem_Link、GetElem_Link、MergeList_Link 等;
2.对于类型定义,由于每一种数据结构的定义都不一样,因此要进行专门的类型定义, 也可以将数据结构的定义组合成为一个文件,存储为一个头文件(如线性表的顺序存储结构 定义取名为 seqlistDef. h),只需建立一次,以后凡涉及到关于顺序表操作的相关内容,一定 要在你的文件的前面加上一条#include “seqlistDef. h” 即可,无需重复进行顺序存储结构的 定义。
三、实验指导
一个简单程序通常主要由三部分构成: 1、常量定义(#define),类型重定义(typedef)及函数原型(#include)声明;还有针对 每一种数据结构的类型定义,由于本实验是要求实现对线性表的顺序存储和链式存储两种存 储结构的定义,因此不同的物理存储结构的定义和其基本操作最好是以独立的文件存在,因 此本实验将顺序表和链表可分解为两个不同的实验部分。 2、算法函数,对于顺序表,每一个函数具有独立的功能,组合成为模块的形式, 如 ListInit_Sq、ListInsert_Sq、ListDelete_Sq、 ListReverse_Sq、ListPrint_Sq 等; 对于链表,每一个函数具有独立的功能,组合成为模块的形式,如 ListInit_Link、 ListInsert_Link 、 ListDelete_Link 、 ListTraverse_Link 、 PriorElem_Link 、 NextElem_Link、GetElem_Link、MergeList_Link 等; 3、主函数(main)。
对顺序表的各项操作一定要编写成为 C(C++)语言函数,组合成模块化的形式,每个 算法的实现要从时间复杂度和空间复杂度上进行评价; . “初始化算法”的操作结果:构造一个空的顺序线性表。对顺序表的空间进行动态管理, 实现动态分配、回收和增加存储空间; . “位置插入算法” 的初始条件:顺序线性表 L 已存在,给定的元素位置为 i,且 1≤i≤ ListLength(L)+1 ;
. 求前驱结点是根据给定结点的值,在单链表中搜索其当前结点的后继结点值为给定的值, 将当前结点返回; . 求后继结点是根据给定结点的值,在单链表中搜索其当前结点的值为给定的值,将后继结 点返回; . 两个有序链表的合并是分别将两个单链表的结点依次插入到第 3 个单链表中,继续保持结 点有序; 2.实现要求: . “求前驱算法”初始条件: 线性表 L 已存在;
操作结果:将所有在线性表 Lb 中但不在 La 中的数据元素插入到 La 中; . “有序合并算法”的初始条件: 已知线性表 La 和 Lb 中的数据元素按值非递减排列;
操作结果:归并 La 和 Lb 得到新的线性表 Lc,Lc 的数据元素也按值非递减 排列; (四)扩展实验内容(链表) 1.问题描述: