一、线性表的抽象数据类型描述
类型名:线性表(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. c#枚举转字典或表格

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  2. 亚马逊云推出基于机器学习的企业搜索服务Kendra,剑指微软

    近日,在AWS re:Invent全球大会上,亚马逊发布了五项新的基于机器学习的人工智能 (AI) 服务. 这五项服务包括机器学习驱动的企业搜索.代码审核与分析.欺诈检测.医疗转录和 AI 预测的人工 ...

  3. LOJ#508. 「LibreOJ NOI Round #1」失控的未来交通工具

    题意 一个带边权无向图,有两种操作:加边以及询问在\(x,x+b,...,x+(c-1)b\)这些数中,有多少个数存在至少一条与之模\(m\)同余的从\(u\)到\(v\)的路径(可以不是简单路径). ...

  4. JVM内存模型以及HotSpot的GC策略

    概述 想要进一步掌握Java语言,必须要深入了解一下Java程序的运行环境.本文会对JVM的内存模型.Java内存自动管理机制.以及Oracle官方虚拟机HotSpot在GC方面的实现策略进行大概的梳 ...

  5. 【Unity|C#】基础篇(17)——字符串处理(String/StringBuilder)

    [学习资料] <C#图解教程>(第25章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...

  6. 牛客CSP-S提高组赛前集训营3 赛后总结

    货物收集 二分答案.复杂度\(O(n\log n)\). 货物分组 用费用提前计算的思想,考虑用一个新的箱子来装货物会发生什么. 显然费用会加上后面的所有货物的总重. \(60\)分的\(O(n^2) ...

  7. 机器学习作业(二)逻辑回归——Python(numpy)实现

    题目太长啦!文档下载[传送门] 第1题 简述:实现逻辑回归. 此处使用了minimize函数代替Matlab的fminunc函数,参考了该博客[传送门]. import numpy as np imp ...

  8. hive创建表时报错

    这是因为mysql字符集的原因.修改mysql的字符集. mysql> alter database hive character set latin1; 参考博客:https://blog.c ...

  9. python3练习100题——034

    题目:练习函数调用. 这个很容易了. def hello_world(): return "hello, world!" def fun(): print(hello_world( ...

  10. 从客户端中检测到有潜在危险的request.QueryString

    1. 修改 web.config文件 1.1 <pages validateRequest="false"></pages> (如果存在这个节点 直接加属性 ...