一、线性表的抽象数据类型描述
类型名:线性表(List)
数据对象集:线性表示n(>=0)个元素构成的有序序列(a1,a2,……,an)
操作集:线性表L∈List, 整数i表示位置,元素X∈ElementType
二、顺序表
1.定义
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];//存了一个数组,其最多能存MAXSIZE个元素
int Last;//最后一个元素的下标!
};
struct LNode L;
List PtrL;
访问下标为i的元素:L.Data[i]或PtrL->Data[i]
线性表的长度: L.Last+1 或 PtrL->Last+1;
2.操作
其基本操作有
1.List MakeEmpty();//初始化一个空线性表
2.ElementType FindKth(int K, List L);//返回下标为K的相应元素
3.int Find(ElementType X, List L);//在线性表L中查找X的第一次出现位置
4.void Insert(ElementType X, int i, List L);//在位序i前插入一个新元素X
5.void Delete(int i, List L);//删除指定位序i的元素
6.int Length(List L);//返回线性表的长度n
 
 (1)创建空表
List MakeEmpty() {
List PtrL;
PtrL = (List)malloc(sizeof(struct LNode));
PtrL -> Last = -;
return PtrL;
}
 
(2)查找元素X
int Find(ElementType X, List L) {
int i = ;
while(i <= PtrL->Last && PtrL->Data[i] != X)
i++;
if(i > PtrL->Last) return -;//如果没找到返回-1
else return i;//找到后返回的是存储位置 即下标
}
(3)插入
在第i(1 ≤ i ≤ n+1)个位置上插入一个值为X的新元素
void Insert(ElementType X, int i, List PtrL) {
int j;
if(PtrL->Last == MAXSIZE-) {//表空间已满,则不能插入
printf("表满");
return;
}
if(i < || i > PtrL->Last+) {//检查输入是否合法
printf("位置不合法");
return;
}
for(j = PtrL->Last; j >= i-; j--) //注意这里顺序不能从前往后
PtrL->Data[j+] = PtrL->Data[j];
PtrL->Data[i-] = X;
PtrL->Last++;//last仍指向最后元素!
return;
}
 
 (4)删除
删除第i个元素(下标为i-1)
void Delete(int i, List PtrL) {
int j;
if(i < || i > PtrL->Last+) {//检查输入是否合法
printf("不存在第%d个元素",i);
return;
}
for (j = i; j <= PtrL->Last; j++)
PtrL->Data[j-] = PtrL->Data[j];
PtrL->Last--;
return;
}
三、线性表的链式存储
重要!!链表即不要求逻辑上相邻的两个元素物理上也相邻,通过"链"建立起数据元素之间的逻辑关系。
其插入和删除不需要移动数据元素,只需要修改链。
1.定义
typedef struct LNode *List;
struct LNode {
ElementType Data;
List Next;//存放指向下一个结点的指针
}L;
List PtrL;
 
2.操作
其基本操作有
1.int Length(List PtrL)//求表长
2.List FindKth(int K, List PtrL) ;//按序号查找查找 查找链表中第K个元素
   List Find(ElementType X, List PtrL) ; //按值查找: 查找元素K
3.List Insert(ElementType X, int i, List PtrL) ;//插入(在第i-1(1<=i<=n+1)个结点后插入一个值为X的新结点)
4.List Delete(int i, List PtrL);//删除操作(删除链表第i个位置上的结点)
 (1)求表长
int Length(List PtrL) {
List p = PtrL;//p指向表的第一个节点
int j = ;
while(p) {
p = p->Next;
j++;
}
return j;
}
(2)查找
1.按序号查找:FindKth
按序号查找查找 查找链表中第K个元素
List FindKth(int K, List PtrL) {
List p = PtrL;
int i = ;
while (p != NULL && i < K) {
p = p->Next;
i++;
}
if(i == K) return p;//找到第K个返回指针
else return NULL;//否则返回空
}
2.按值查找:Find
按值查找: 查找元素K
List Find(ElementType X, List PtrL) {
List p = PtrL;
while(p != NULL && p->Data != X)
p = p->Next;
return p;
}
(3)插入操作
在第i-1(1 ≤ i ≤ n+1)个结点后插入一个值为X的新结点
(1)先构造一个新结点,用s指向 //malloc分配空间 将s的数据Data赋值为X
(2)再找到链表的第i-1个结点,用p指向
(3)然后修改指针,插入结点(p之后插入新结点是s) 
// 先将p原先的指向next给s的next指针,再将p的next指针指向s
List Insert(ElementType X, int i, List PtrL) {
List p, s;
if(i == ) {//新节点插入到表头
s = (List)malloc(sizeof(struct LNode));//申请、填装节点
s->Data = X;
s->Next = PtrL;
return s; //返回新表头指针
}
p = Find(i-,PtrL); //查找第i-1个结点
if(p == NULL) { //第i-1个不存在 无法插入
printf("参数i错");
return NULL;
} else {
s = (List)malloc(sizeof(struct LNode)); //申请、填装结点
s->Data = X;
s->Next = p->Next; //新节点插入在第i-1个节点的后面
p->Next = s;
return PtrL;
}
}
(4)删除操作
删除链表第i个位置上的结点
(1)先找到链表的第i-1个结点,用p指向;//Find(i-1,PtrL);
(2)再用指针s指向要被删除的结点(p的下一个结点)//s = p->Next;
(3)然后修改指针,删除s所指向的结点//p->Next = s->Next;
(4)最后释放s所指结点的空间!    //free(s)
List Delete(int i, List PtrL) {
List p, s;
if( i == ) { //若要删除的是表的第一个结点
s = PtrL; //s指向第1个结点
if (PtrL != NULL) PtrL = PtrL->Next; //从链表中删除
else return NULL;
free(s); //释放被删除结点
return PtrL;
}
p = FindKth(i-, PtrL); //查找第i-1个结点
if (p == NULL) {
printf("第%d个结点不存在", i-);
return NULL;
} else if (p->Next == NULL) {
printf("第%d个结点不存在",i);
return NULL;
} else {
s = p->Next; //s指向第i个结点
p->Next = s->Next; //从链表中删除
free(s); //释放被删除结点的空间
return PtrL;
}
}

数据结构学习笔记 <1> 线性表的更多相关文章

  1. C语言数据结构基础学习笔记——基础线性表

    线性表是指具有相同数据类型的n(n>=0)个数据元素的有限序列,它具有一个表头元素和一个表尾元素,并且每一个数据元素最多只有一个直接前驱和一个直接后继. 线性表的顺序存储也叫作顺序表,它的特性是 ...

  2. GJM : 数据结构学习笔记

    --------------------------数据结构 --------------------数据结构分 线性数据结构给非线性数据结构 数据和结合 线性表(顺序存储方式)特点:有且仅有一个开始 ...

  3. Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法

    Ext JS4 学习笔记之发送表单(Form)时也将表单下的表格(Grid)数据一同发送的方法 昨天在开发的时候遇到个小问题,就是如何将Grid的内容与Form一起发送到服务器端.默认情况下,表单(F ...

  4. ES6中Map数据结构学习笔记

    很多东西就是要细细的品读然后做点读书笔记,心理才会踏实- Javascript对象本质上就是键值对的集合(Hash结构),但是键只能是字符串,这有一定的限制. 1234 var d = {}var e ...

  5. 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现

    应用程序后在那个的数据大致有四种基本的逻辑结构: 集合:数据元素之间只有"同属于一个集合"的关系 线性结构:数据元素之间存在一个对一个的关系 树形结构:数据元素之间存在一个对多个关 ...

  6. C语言数据结构基础学习笔记——静态查找表

    查找:在数据集合中寻找满足某种条件的数据元素的过程称为查找. 查找表:用于查找的数据集合称为查找表,一般有以下操作:①查找是否在表中:②查找属性:③进行操作. 查找表又分为: ①静态查找表:只可以进行 ...

  7. 数据结构(Java描述)之线性表

    基础概念 数据结构:是相互之间存在一种或多种关系的数据元素的集合. 逻辑结构和物理结构 关于数据结构,我们可以从逻辑结构和物理结构这两个维度去描述 逻辑结构是数据对象中数据元素之间的关系,是从逻辑意义 ...

  8. 数据结构学习笔记——顺序数组1

    线性表最简单的刚开始就是顺序存储结构,我是看着郝斌的视频一点一点来的,严蔚敏的书只有算法,没有具体实现,此笔记是具体的实现 为什么数据结构有ADT呢,就是为了满足数据结构的泛性,可以在多种数据类型使用 ...

  9. 【Java数据结构学习笔记之二】Java数据结构与算法之栈(Stack)实现

      本篇是java数据结构与算法的第2篇,从本篇开始我们将来了解栈的设计与实现,以下是本篇的相关知识点: 栈的抽象数据类型 顺序栈的设计与实现 链式栈的设计与实现 栈的应用 栈的抽象数据类型   栈是 ...

随机推荐

  1. Java(一)环境的安装与配置

    一.JDK的安装 1.JDK与JRE的区别 Java开发环境,简称JDK(Java Development Kit),它是Java的核心,包括了Java编译器.Java运行环境.Java打包工具.Ja ...

  2. 0011 基于DRF框架开发(04 普通序列化器)

    普通序列化器和模型无关,只是对针对提交字段的定义. 本文定义三个序列化器: 教师序列化器,学生序列化器,教师学生序列化器.这三个序列化器都使用普通序列化器. 1 教师序列化器 在Application ...

  3. python multiprocessing 耗内存问题

    multiprocessing在每创建一个进程时,会将主进程的内存空间原封不动的复制一份到子进程,这样一来内存消耗很容易就翻几倍,导致程序无法运行. 究其原因,是启动进程时采用了os.fork(),使 ...

  4. mysql 基础sql语法总结(一)DDL

    mysql数据库: SQL数据库语言可分为四部分: 1.DDL:对数据库或表的进行操作结构操作 2.DML:对表的记录进行更新(增.删.改)* 3.DQL:对表的内容进行查询 **(重难点) 4.DC ...

  5. Wannafly Camp 2020 Day 2D 卡拉巴什的字符串 - 后缀自动机

    动态维护任意两个后缀的lcp集合的mex,支持在串末尾追加字符. Solution 考虑在 SAM 上求两个后缀的 LCP 的过程,无非就是找它们在 fail 树上的 LCA,那么 LCP 长度就是这 ...

  6. 华为高斯 GaussDB 100 OLTP 单机在 RHEL 7.6 上的安装

    目录 你需要知道的 操作系统安装 GaussDB 100 安装 环境设置 创建用户组/用户/文件夹 软件上传/解压/安装 启动数据库 DataStudio 连接 服务器环境设置 DataStudio ...

  7. c++ md5算法实现(转)

    原文链接:C++计算文件的MD5值 其他:c++输入文件流ifstream用法详解

  8. C++ lvalue(左值)和rvalue(右值)

    lvalue(左值)和rvalue(右值) 昨天写代码遇见一个这样的错误:{ "cannot bind non-const lvalue reference of type 'int& ...

  9. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Written by Rahul, Updated on April 3, 20

    本文系转载备份 请阅读点击下面链接阅读原文以获取更佳地阅读体验.谢谢. How to Install Oracle Java 11 on Ubuntu 18.04 LTS (Bionic) Writt ...

  10. 微信小程序 --- 日历效果

    wxml部分: <view class='box1' style='width: {{ sysW * 7 }}px'> <view class='dateBox'>{{ yea ...