数据结构第四课—线性表Linear List

线性表的基本概念

数据结构三要素

逻辑结构、数据的运算、存储结构(物理结构)

注:存储结构不同,运算的实现方式不同

** 线性表两大核心**

定义 → 对应逻辑结构

基本操作 → 对应运算


应用实例1:约瑟夫环问题

n个人围成环形,从指定位置开始报数,报到指定数值的人被淘汰,依次循环直到剩余最后一人,是循环链表的典型应用。

应用实例2:一元多项式运算问题

多项式形式:P = p0 + p1x + p2 x^2 + ... + pn*x^n

核心问题:

  1. 如何建立多项式
  2. 如何输出多项式
  3. 两个多项式相加
  4. 两个多项式相减
  5. 求多项式的值
  6. 求多项式的导

思考:用什么结构存储多项式,用什么方法操作多项式运算?


线性表的定义

定义:线性表是具有相同特性的数据元素有限序列

三大特性

  1. 相同特性:所有元素属于同一数据类型
  2. 有限:数据元素的个数是有限的
  3. 有序:元素由逻辑序号唯一确定,表内元素有相对先后位置

基础概念

线性表中所含元素的个数称为线性表的长度,用n表示,n≥0。

n=0时称为空表,表中不包含任何元素。


(a1, a2, ..., ai,ai+1(是下标加1) ..., an)

逻辑表示

(a1, a2, ..., ai, ..., an)

  • ai (1≤i≤n):表示第i个元素,i称为元素的逻辑位序
  • a1:表头元素
  • an:表尾元素

若用L命名线性表一般表示:L = (a1, a2, ..., ai,ai+1(是下标加1) ..., an)

注意:

1.位序从1开始

2.数组下标从0开始

前驱与后继

  • 除第一个元素a1外,每个元素有且仅有一个直接前驱
  • 除最后一个元素an外,每个元素有且仅有一个直接后继

生活实例

汽车排队、人员队列、学生成绩表、待办清单......不胜枚举

列出几个你在现实生活中见到的线性表,可以打在评论区

线性表的运算

9个基本运算:

  1. 初始化线性表 InitList(&L)

    构造一个空的线性表L。

  2. 销毁线性表 DestroyList(&L)

    释放线性表L占用的内存空间。

  3. 判断表是否为空 ListEmpty(L)

    若L为空表,返回真;否则返回假。

  4. 求线性表的长度 ListLength(L)

    返回L中元素的个数n。

  5. 输出线性表 DispList(L)

    线性表L不为空时,顺序显示L中各结点的值。

  6. 按位取元素 GetElem(L, i, &e)

    用e返回线性表中第i (1≤i≤n)个元素的值。

  7. 按值定位查找 LocateElem(L, e)

    返回L中第一个值与e相等的元素的位序;若不存在,返回值为0。

  8. 插入数据元素 ListInsert(&L, i, e)

    在L的第i (1≤i≤n+1)个元素之前插入新元素e,L的长度加1。

  9. 删除数据元素 ListDelete(&L, i, &e)

    删除L的第i (1≤i≤n)个元素,并用e返回其值,L的长度减1。


运算学习Tips

  1. 对数据的操作(记忆思路)------创销、增删改查
  2. C语言函数定义格式:<返回值类型> 函数名(<参数1类型> 参数1,< 参数2类型> 参数2, ......)
  3. 实际开发中,可根据实际需求定义其他的基本操作
  4. 函数名和参数的形式、命名都可改变
  5. 什么时候要传入引用"&"------对参数的修改结果需要"带回来"的时候

引用&核心规则

对参数的修改结果需要带回主函数,就加&

只是读取参数、不修改原值,不需要加&


示例1:普通传值(没有&,修改不会带回主函数)

c 复制代码
#include<stdio.h>

void test(int x) {
    x=1024;
    printf("test函数内部 x=%d\n",x);
}

int main() {
    int x = 1;
    printf("调用test前 x=%d\n",x);
    test(x);
    printf("调用test后 x=%d\n",x);
}
 

运行结果说明:

调用test前 x=1

test函数内部 x=1024

调用test后 x=1

👉 对参数的修改没带回来

示例2:传引用&(修改可以带回主函数)

c 复制代码
#include<stdio.h>

void test(int & x) {
    x=1024;
    printf("test函数内部 x=%d\n",x);
}

int main() {
    int x = 1;
    printf("调用test前 x=%d\n",x);
    test(x);
    printf("调用test后 x=%d\n",x);
}
 

运行结果说明:

调用test前 x=1

test函数内部 x=1024

调用test后 x=1024

👉 对参数的修改带回来了

补充:

什么时候要传入参数的引用 & :对参数的修改结果需要"带回来"的时候。

线性表中: InitList 、 DestroyList 、 ListInsert 、 ListDelete 这些函数要修改线性表本体,参数就要加 & ;

ListEmpty 、 ListLength 、 DispList 、 GetElem 、 LocateElem 只是读取,不需要 & 。

线性表的作用

  1. 程序员可以直接使用它来存放数据------作为存放数据的容器。
  2. 程序员可以直接使用它的基本运算------完成更复杂的功能。

应用程序调用线性表的基本运算,操作内部的数据,实现完整的线性表功能。


线性表的作用

  1. 程序员可以直接使用它来存放数据------作为存放数据的容器
  2. 程序员可以直接使用它的基本运算------完成更复杂的功能

核心知识点

  1. 线性表两类存储结构的差异
  2. 每种存储结构中基本运算的实现算法
  3. 利用存储结构求解实际问题
  4. 利用有序表特性设计高效算法
相关推荐
昌原的儿子LEO1 小时前
ARM 汇编核心知识点总结
嵌入式硬件·学习
Ray Wang1 小时前
Context上下文工程
python·学习·ai编程
百里香酚兰1 小时前
【Unity学习笔记】如何把粉色Prefab还原
笔记·学习·unity
索端阳2 小时前
ARM Day02 学习总结:ARM汇编基础核心知识点梳理
汇编·学习·arm
Lyyaoo.2 小时前
【动态规划】【待更新】
java·数据结构·算法
我不会起名字3222 小时前
一天一道算法题(35):电话号码的字母组合
java·数据结构·后端·python·leetcode·go·回溯
小叶肥辉2 小时前
LangChain链和LangGraph图的学习笔记【六】——提示语模板(3)——Few-Shot Prompting(少样本提示) 模板类
笔记·python·学习·langchain·prompt·aigc
for_ever_love__3 小时前
爬虫项目: 获取高分电影的数据总结
开发语言·python·学习
鹿角片ljp3 小时前
LeetCode 78:子集|回溯、选与不选、递归和path快照
java·数据结构·算法