第二章、线性表

2024-06-10 07:28
文章标签 线性表 第二章

本文主要是介绍第二章、线性表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

一、线性表的基本概念

1.定义

2.线性表的一些操作

(1).基本操作(增删改查)

(2).线性表其他常用操作

(3)在定义这些操作时的注意事项

3.重要考点总结

4.易错题总结

二、顺序表

1.顺序表定义

2.顺序表实现方式

3.顺序表元素的插入和删除

(1)插入元素

(2)删除元素

4.顺序表查找

(1)按数组下标查找

(2)按元素值查找

5.易错题总结

(1)选择题

(2)简答题

三、链表

1.单链表

(1)单链表的结构体定义

(2)插入元素

①带头结点插入

②不带头结点插入

(3)删除元素

①按位序删除

②指定结点删除

(4)查找元素

①按位查找

②按值查找

③遍历链表求链表长度

(5)根据给定元素创建单链表

①头插法

②尾插法

③总结

2.双链表

(1)初始化

(2)插入元素

(3)删除元素

(4)遍历

3.循环链表

4.静态链表

四、顺序表和链表对比

1.对比角度

(1)逻辑结构

(2)存储结构

(3)基本操作

(4)选用场景

2.总结

五、易错题总结

1.选择题

2.简答题

六、本章归纳总结

七、参考


一、线性表的基本概念

1.定义

这里线性表是指的逻辑结构,它可以使用顺序存储也可以使用链式存储,和物理结构区分开。

2.线性表的一些操作

这些操作是数据结构中线性表的基础,掌握它们对于理解和应用线性表至关重要。

(1).基本操作(增删改查)

初始化表 (InitList(&L)) :这个操作用于构造一个空的线性表L,并为其分配必要的内存空间。这是从无到有的过程,为后续的操作提供一个空的框架。

销毁操作 (DestroyList(&L)) :这个操作用于销毁线性表,并释放线性表L所占用的内存空间。这是从有到无的过程,确保内存的有效管理和释放。

插入操作 (ListInsert(&L, i, e)) :在表L中的第i个位置上插入指定的元素e。这个操作实现了线性表的“增”功能,可以根据需要在任意位置添加元素。

删除操作 (ListDelete(&L, i, &e)) :删除表L中第i个位置的元素,并通过参数e返回被删除元素的值。这个操作实现了线性表的“删”功能,可以根据需要移除元素。

按值查找操作 (LocateElem(L, e))):在表L中查找具有给定关键字值的元素。这个操作用于检索特定值的元素,实现“查”的功能

按位查找操作 (GetElem(L, i)) :获取表L中第i个位置的元素的值。这也是“查”功能的一种,通过位置索引来获取元素。

(2).线性表其他常用操作

求表长 (Length(L)) :返回线性表L的长度,即L中数据元素的个数。

输出操作 (PrintList(L)) :按前后顺序输出线性表L的所有元素值。

判空操作 (Empty(L)) :判断线性表L是否为空,若为空则返回true,否则返回false。

(3)在定义这些操作时的注意事项

命名要有可读性:函数名和参数应该具有明确的含义,方便理解和使用。

参数传递:在某些情况下,如需要修改参数的值并返回到调用者时,需要使用引用(如C/C++中的&)来传递参数。

3.重要考点总结

4.易错题总结

问题:

        02. 以下(        )是一个线性表。

        A.由"个实数组成的集合                 B.由100个字符组成的序列

        C.所有整数组成的序列                  D.邻接表

解答:

        02. B

        线性表定义的要求为:相同数据类型、有限序列。选项C的元素个数是无穷个,错误;选项A集合中的元素没有前后驱关系,错误;选项D属于存储结构,线性表是一种逻辑结构,不要将二者混为一谈。只有选项B符合线性表定义的要求。

二、顺序表

        顺序表就是一种顺序表示的线性表,形式上就是我们常说的数组

        在考察顺序表时,其实就是对数组的操作(数据结构的选择题算法大题常考察),在本章中我们着重对选择题的知识点进行总结,算法大题常考查的是查找和排序,这部分后面会有专题总结

        ※选择题知识点主要是掌握顺序表的基本操作:初始化、增、删、改、查

        👇🏻👇🏻👇🏻顺序表基本操作C++代码实现可以参考下面文章👇🏻👇🏻👇🏻:
顺序表相关代码-CSDN博客文章浏览阅读20次。【代码】顺序表相关代码。https://blog.csdn.net/hehe_soft_engineer/article/details/134235748

1.顺序表定义

2.顺序表实现方式

//顺序表静态分配结构体定义
typedef struct{int data[InitSize];int length;
}SeqListStatic;//顺序表动态分配结构体定义
typedef struct{int *data;int MaxSize;int length;
}SeqList;

3.顺序表元素的插入和删除

(1)插入元素

//顺序表的插入元素,在第i个位置处插入元素elem
//平均时间复杂度O(n)
bool InsertElem(SeqList &L,int i,int &elem){if(i<1||i>L.length+1){return false;}if(L.length==L.MaxSize){//顺序表满return false;}for(int j=L.length;j>=i;j--){//从最后一个元素开始L.data[j]=L.data[j-1];//元素后移,直到第i个位置}L.data[i-1]=elem;L.length++;//不要忘记修改顺序表的长度return true;
}

(2)删除元素

删除第i个位置的元素,i+1以后的所有元素前移动一位,注意从i+1位置开始往前移动

//顺序表删除元素,删除第i个位置元素
//平均时间复杂度O(n)
bool deletElem(SeqList &L,int i,int &deletedelem){if(i<1||i>L.length){return false;}deletedelem=L.data[i-1];for(int j=i-1;j<L.length-1;j++){//后一元素前移L.data[j]=L.data[j+1];}L.length--;return true;
}

4.顺序表查找

(1)按数组下标查找

(2)按元素值查找

注意:if(L.data[i]==e)这里,基本数据类型可以直接用“==”来比较,但是结构类型元素不行,要么重载运算符,要么一个属性一个属性的去比较。

5.易错题总结

(1)选择题

题目:

        02.线性表的顺序存储结构是一种(        )        易错题!!!

        A.随机存取的存储结构                 B.顺序存取的存储结构

        C.索引存取的存储结构                 D.散列存取的存储结构

解答:

        A

        本题易误选B。注意,存取方式是指读写方式。顺序表是一种支持随机存取的存储结构,根据起始地址加上元素的序号,可以很方便地访问任意一个元素,这就是随机存取的概念。

题目:

        05. 一个线性表最常用的操作是存取任意一个指定序号的元素并在最后进行插入、删除操作,则利用(        )存储方式可以节省时间。

        A.顺序表                                   B.双链表

        C.带头结点的双循环链表         D.单循环链表

解答:

        A

        只有顺序表可以按序号随机存取,且在最后进行插入和删除操作时不需要移动任何元素。

(2)简答题

题目:

解答:

        和第5题一样,用变量k记录重复个数,后面的值往前移动k个单位即可

题目:

解答:

        通过这个题目记住这种算法思想,用一个值记录前面重复元素的个数k,后面元素前移k个位置即可!

题目:

解答:

        比较基础,需要掌握代码和思想!!

题目:

解答:

重要!逆序的思想

题目:

解答:

题目:

解答:

        主要先掌握算法思想

三、链表

         链表就是一种线性表的链式表示,链表有多种形式:单链表、双链表、循环单链表、循环双链表

        在考察链表时,对链表的结构定义和操作进行考察(数据结构的选择题算法大题常考),在本章中我们着重对选择题的知识点进行总结,算法大题常考查的是链表的结构定义以及链结点的增删操作

        ※选择题知识点主要是掌握上面四种形式链表的基本操作:增、删、改、查

        👇🏻👇🏻👇🏻链表基本操作C++代码实现可以参考下面文章👇🏻👇🏻👇🏻

        单链表:

链表相关代码-CSDN博客文章浏览阅读87次。【代码】链表相关代码。https://blog.csdn.net/hehe_soft_engineer/article/details/134235780        双链表:

双向链表相关代码-CSDN博客文章浏览阅读147次。【代码】双向链表相关代码。https://blog.csdn.net/hehe_soft_engineer/article/details/134235868

1.单链表

(1)单链表的结构体定义

C++实现链表定义:

typedef struct LNode{int data;struct LNode *next;
}LNode,*LinkList;
//LinkList L;声明一个指向单链表第一个节点的指针
//LNode *L;声明一个指针,指向单链表的第一个节点

链表可以分为带头结点和不带头结点:

①不带头结点的单链表初始化

②带头结点的单链表初始化

(2)插入元素

①带头结点插入

  • 在链头插入

  • 在链表中间插入:先找到第i个结点,然后在i结点后面加入新结点

  • 在链尾插入

  • 插入的时间复杂度:O(n)

②不带头结点插入

  • 在链头插入

  • 在链表中间插入

        指定结点后面插入元素:

        指定节点的前插操作:

        ※已知头指针可以遍历然后插入

        ※如果未知头指针,则前驱结点不可知,所以可以通过移动数据的方式

(3)删除元素

①按位序删除

②指定结点删除

        这样写是有点问题的:

(4)查找元素

①按位查找

②按值查找

③遍历链表求链表长度

(5)根据给定元素创建单链表

①头插法

②尾插法

③总结

2.双链表

(1)初始化

(2)插入元素

(3)删除元素

(4)遍历

3.循环链表

(1)循环单链表

①循环单链表的初始化代码实现:

②单链表和循环单链表对比

循环单链表从一个结点出发,就能向后遍历到全部的结点:

(2)循环双链表

①循环双链表初始化

②循环双链表的插入结点

③循环双链表的删除删除结点

④总结

4.静态链表

(1)静态链表定义代码实现

(2)静态链表的初始化

(3)查找、插入、删除元素操作

(4)静态链表的知识总结及特点说明

四、顺序表和链表对比

1.对比角度

(1)逻辑结构

都属于线性表,属于线性结构

(2)存储结构

(3)基本操作

(4)选用场景

2.总结

五、易错题总结

1.选择题

问题:

解答:

问题:

解答:

2.简答题

问题:

        1.设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点。

解答:        

问题:

        3.设L为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。

解答:

        思路:可以先逆置,然后输出;这个题目也可以用递归算法:

问题:

        8.给定两个单链表,编写算法找出两个链表的公共结点。

解答:

        这里的公共结点是指的,在某个结点处两个链表重合了,呈现Y字型;这里注意第二种算法,很巧妙:

问题:

解答:

问题:

解答:

问题:

解答:

问题:

解答:

问题:

解答:

        这个设置快慢指针的方式要注意:

六、本章归纳总结

既是知识点小结,也是算法题方法小结

七、参考

📚课件来源:王道考研

📚课本及题目:《2024数据结构考研复习指导-王道论坛》


欢迎大家交流学习,如有错误请批评指正!

下一章:栈、队列和数组

这篇关于第二章、线性表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1047517

相关文章

《offer来了》第二章学习笔记

1.集合 Java四种集合:List、Queue、Set和Map 1.1.List:可重复 有序的Collection ArrayList: 基于数组实现,增删慢,查询快,线程不安全 Vector: 基于数组实现,增删慢,查询快,线程安全 LinkedList: 基于双向链实现,增删快,查询慢,线程不安全 1.2.Queue:队列 ArrayBlockingQueue:

【数据结构】线性表:顺序表

文章目录 1. 线性表2. 顺序表2.1 概念及结构2.2 接口实现2.3 顺序表的问题及思考 1. 线性表 线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式

计算广告:第二章——计算广告基础

一、广告有效性原理 二、互联网广告的技术特点 1、技术和计算向导 2、效果的可衡量性 3、创意和投放方式的标准化 4、媒体概念的多样化 5、数据驱动的投放决策 三、计算广告的核心问题 1、广告收入的分解 2、结算方式与ECMP估计关系 四、在线广告相关行业协会 五、问题 可衡量的效果以及相应的计算优化是在线广告区别线下广告的主要特点,千次展示期望收入(expect

排序。。。用于排序的线性表

shuzu.h头文件 #ifndef _SHUZU_#define _SHUZU_#include <iostream>using namespace std;#define N 10#include<cstdlib>//产生随机数的头文件.#include<ctime>//定义一个顺序表的结构体struct sqlist{int Arry[N+1];int length;};//

第二章 权限

一、Linux权限的概念 1.Linux下有两种用户:超级用户(root)、普通用户。 超级用户:可以再 linux 系统下做任何事情,不受限制 普通用户:在 linux 下做有限的事情。 超级用户的命令提示符是 “#” ,普通用户的命令提示符是 “$” 。 命令 : su [ 用户名 ] 功能 :切换用户。 例如,要从 root 用户切

Unity Shader第二章作业

一、什么是图元,有哪几种图元 图元就是组成图像的基本单元,有点、线、面三种图元。 二、渲染流水线分哪三个概念阶段?每个概念阶段主要任务是什么,由哪个计算部件执行 应用阶段——》几何阶段——》光柵化阶段 应用阶段:应用阶段通常由CPU负责实现,先准备好场景数据,然后去除不可见的物体,提高渲染能力,设置好每个模型的渲染状态后,输出渲染图元(点,线,三角面),传递给几何阶段。 几何阶段:把渲染

【数据结构】线性表之《栈》超详细实现

栈 一.栈的概念及结构二.顺序栈与链栈1.顺序栈2.链栈1.单链表栈2.双链表栈 三.顺序栈的实现1.栈的初始化2.检查栈的容量3.入栈4.出栈5.获取栈顶元素6.栈的大小7.栈的判空8.栈的清空9.栈的销毁 四.模块化源代码1.Stack.h2.Stack.c3.test.c 一.栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入

板凳---------unix网络编程卷1:第二章传输层:TCP、UDP 和 SCTP

2.1 概述 焦点是传输层,包括TCP、UDP和SCTP(Stream Control Transmission Protocol,流控制传输协议)。绝大多数客户/服务器网络应用使用TCP或UDP。SCTP是一个较新的协议,最初设计用于跨因特网传输电话信令。这些传输协议都转而使用网络层协议IP:或是IPv4,或是IPv6。绕过传输层直接使用IPv4或IPv6,称为原始套接字。 UDP是一个简单的

空间复杂度 线性表,顺序表尾插。

各位少年,大家好,我是那一脸阳光,本次分享的主题是时间复杂度和空间复杂度 还有顺序表文章讲解和分享,如有不对可以评论区指导。 时间复杂度例题 // 计算斐波那契递归Fib的时间复杂度?long long Fib(size_t N){if(N < 3)return 1;return Fib(N-1) + Fib(N-2);} 这块的时间复杂度为O(2^N)次方 可以看到这个代码是个等比

《C++ Primer》第二章练习

注意:每十道题给一个链接,一共 42 题 目录 2.10 下列变量的初值分别是什么?2.20 请叙述下面这段代码的作用。2.30 对于下面这些语句,请说明对象被声明成了顶层 const 还是 底层 const ?2.40 根据自己的理解写出 Sales_data 类,最好与书中的有所区别。 2.1 类型 int、long、long long 和 short 的区别是什么 ?无