DS01——线性表

0.PTA得分截图

1.本周学习内容总结

1.1总结线性表内容

1.顺序表

  • 顺序表结构体定义。存放数据以及表的长度
  • 顺序表插入。遍历顺序表,找到需要插入的位置,并将该位置及之后的元素均向后移动一个位置
  • 顺序表删除。遍历顺序表,找到需要删除的元素,将该元素之后的元素均向前挪动一个位置
  • 顺序表重复元素删除。遍历两次顺序表,找到重复元素,然后操作删除
  • 顺序表区间删除。遍历顺序表,找到区间内的元素,重新放入顺序表中,并定义自增变量,最后赋给顺序表长度

2.链表

  • 链表结构体定义。存放数据以及创建后继节点
  • 链表头插法。将每个节点放在头结点之后

  • 链表尾插法。将每个节点放在链表末端

  • 链表插入。找到插入节点的前驱,该节点指向前驱的下一个节点,前驱指向该节点
  • 链表删除。找到要删除的节点的前驱,将前驱指向要删除节点的下一个节点,释放删除的节点

3.有序表

  • 有序表单链表插入。遍历有序表,找到插入节点的前驱,该节点指向前驱的下一个节点,前驱指向该节点,有插入到末尾的情况
  • 有序表单链表删除。遍历有序表,找到要删除的节点的前驱,将前驱指向要删除节点的下一个节点,释放删除的节点
  • 有序表单链表合并。遍历两个单链表,并比较相应元素的大小,哪个链表中相应比较大,就将其放入新建列表中,并指向下一个节点,若元素大小相等,则将该元素放入新建列表里,两个链表元素指向下一个节点


4.循环链表、双链表

  • 循环链表:将表中尾结点的指针域改为指向表头结点,整个链表形成一个环。由此从表中任一结点出发均可找到链表中其他结点。
  • 双链表:从任一结点出发可以快速找到其前驱结点和后继结点,。从任一结点出发可以访问其他结点。

    ----------------------------------------------------------------------------------------------------
  • 双链表的插入及删除。前驱以及后继的关系均要改变

  • 带头结点的循环单链表和循环双链表

    1.2对线性表的认识及学习体会

    本章学了线性表及线性表的各种运算,例如插入、删除等。线性表主要有顺序表和链表两种,而链表又有单、双、循环链表。
    根据上述总结可以看出各自的优缺点:顺序表可以很快的找到相应的节点,但比较浪费空间,在处理大量元素时效率就显得低下。
    链表对相邻两个数据之间用结点中的指针来指示,不要求逻辑上相邻的两个元素存储的物理空间相邻,对碎片空间的利用率高。
    对于线性表的学习,我感觉我还是比较吃力的。上学期的关于链表的知识在现在又重新被激活,又增加了许多知识。
    我总是会在链表的操作上栽跟头,还是很不熟练,真的需要代码量来填补。做pta时不能够举一反三,还是对链表理解不够深,需要多多练习。

    2.PTA实验作业

    2.1jmu-ds-有序链表合并

    2.1.1代码截图


    2.1.2本题PTA提交列表说明

  • 刚开始没有注意重复的这种情况,改了几次后添了对重复这种情况的操作后就正确了。

    2.2jmu-ds-链表分割

    2.2.1代码截图


    2.2.2本题PTA提交列表说明

  • 刚开始是在一次循环中操作两次,即没有if判断条件,第一次操作L1,第二次操作L2,后来发现这样十分容易出错。问了同学之后,定义flag变量,交替操作就通过了。

    2.3 jmu-ds-链表区间删除

    2.3.1代码截图


2.3.2本题PTA提交列表说明


刚开始看到了需要排序,但是我不知道怎么插入排序,于是我先输入数据,在排序,期间排序错误,部分正确,后来发现删除函数也有些错误,改过来之后就对了。后来发现其实改一下就是输入插入排序了,如下

3.阅读代码

3.1题目及解题代码



3.1.1该题的设计思路


该题是一个循环链表,时间复杂度为O(n),空间复杂度为O(1)

3.1.2该题的伪代码

建立一个循环链表
while (p->next != p) 遍历循环链表
{
    找到每三个人的第三个人
        杀死该人即删掉该节点
    输出被杀掉的人
    p->next = p->next->next;       //将该节点从链表上删除。
    p = p->next;节点移动
}

3.1.3运行结果

3.1.4题目解题优势及难点

  • 优势:改代码用了循环链表,整体代码不是特别难懂,所以并无突出的特点,但该代码也拓宽了思维
  • 难点:将问题转化为循环链表,我们学习主要学习单链表,而循环链表以及双链表只是浅显学了,很少用他们,所以在面对这种题是肯不知道如何去做。题目简单,但其实可以改为n个人排成圈,第m个人自杀。

    3.2题目及解题代码


    3.2.1该题的设计思路


    时间复杂度为O(n)空间复杂度为O(1)

    3.2.2该题的伪代码

while(指针不为空)
{
    oddList->next = evenList->next  下标为单数的节点相互连接
    evenList->next = oddList->next->next  下标为双数的节点相互连接
    oddList = oddList->next;
    evenList = evenList->next;指针指向下一个节点
}
单标链后接上双标链

3.2.3运行结果

3.2.4题目解题优势及难点

  • 优点:直接用两个指针操作,一个指向单标的节点,一个指向双标的节点,利用相互关系,操作十分简单。用一个指针存放第二个节点,便于之后两个链的连接
  • 难点:该代码使用的指针是不带头结点的链表,我们学习的一般都是带头结点的链表,所以读起来会有些别扭,实际上我的运行结果是我把他的链表变为带头结点的链表的结果。

原文地址:https://www.cnblogs.com/xingyufen/p/12433391.html

时间: 2024-08-06 06:11:12

DS01——线性表的相关文章

线性表---顺序表

线性结构的特点是:在非空的有限集合中,只有唯一的第一个元素和唯一的最后一个元素.第一个元素没有直接前驱元素,最后一个没有直接的后继元素.其它元素都有唯一的前驱元素和唯一的后继元素. 线性表是一种最简单的线性结构.线性表可以用顺序存储结构和链式存储结构存储,可以在线性表的任意位置进行插入和输出操作. 要想将线性表在计算机上实现,必须把其逻辑结构转化为计算机可识别的存储结构.线性表的存储结构主要有两种:顺序存储结构和链式存储结构. 线性表的顺序表示与实现 线性表的顺序存储结构 线性表的顺序存储结构指

数据结构 笔记2 线性表

线性表是最简单,最常用的一种数据结构,它是由n个数据元素(结点)组成的有限序列. 线性表的基本运算 1.置空表 InitList(L) ,构造一个空的线性表L 2.求表长 ListLength(L) ,返回线性表L中元素个数,即表长. 3.取表中第i个元素GetNode(L,i) ,若1 <= i <= ListLength(L) ,则返回第i个元素a[i] 4.按值查找LocateNode(L,x),在表L中查找第一个值为x的元素,并返回该元素在表L中的位置,若表中没有元素的值为x,则返回0

数据结构与算法之线性表

前言 上一篇<数据结构和算法之时间复杂度和空间复杂度>中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明.这一篇主要介绍线性表. 线性表属于数据结构中逻辑结构中的线性结构.回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构.几何结构.树形结构和图形结构四大结构.其中,线性表就属于线性结构.剩余的三大逻辑结构今后会一一介绍. 线性表 基本概念 线性表(List):由零个或多个数据元素组成的有限序列. 注意: 1.线性表是一个序列. 2.0个元素构成的线性表是空表.

数据导论——线性表

线性表是一种线性结构,由n个数据元素组成的又穷序列,数据元素又称为节点,线性表中的每个数据元素的含义,在不同的应用中各不相同,但在同一个线性表中的数据元素具有相同的特性. 下面的图总结了第二章的主要内容,用于总结和回想,巩固学习: 线性表的基本运算包括:初始化.求表长.读表元素.定位.插入.删除等基本运算,不同的存储结构实现细节可能不同. 在线性表的存储方式有顺序存储和链式存储. 顺序存储的存储方式是最简单的,逻辑顺序对应于存储顺序,数组就是顺序表的表现之一.顺序存储的运算包括插入.删除和定位,

数据结构——线性表顺序存储结构

 关于线性表 线性表是零个或者多个数据元素的集合.它主要有以下三个特征: 1:线性表的数据元素之间是有顺序的. 2:线性表中数据元素个数是有限的. 3:线性表中数据元素数据类型是相同的. 关于线性表的操作,主要有 创建线性表.销毁线性表.清空线性表.将元素插入线性表.将元素从线性表中删除.获取线性表中某个位置的元素.获取线性表的长度. 线性表主要有两种存储结构: 1:线性表的顺序存储结构,c语言中的数组及采用这种方式. 2:线性表的链式存储结构. 关于顺序存储结构 定义: 是指用一段地址连续的内

数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列

#include<iostream> #include<stdlib.h> #define LIST_INIT_SIZE 10/*线性表初始长度*/ #define LIST_CREATENT 2/*每次的增量*/ typedef int ElemType; using namespace std; typedef struct SqList/*线性表的数据结构定义*/ { ElemType *elem;/*线性表基址*/ int length;/*当前线性表所含的元素个数*/ i

数据结构和算法学习总结04 线性表---栈

栈 栈(Stack)是特殊的线性表,是只允许在一端进行插入和删除的线性表. 允许插入和删除的叫栈顶,反之则是栈底. 栈的插入称为进栈,删除称为出栈. 特性是:后进先出,所以栈也叫后进先出表,简称LIFO表(Last In First Out). 因为栈是线性表,所以也有顺序表和链表两种形式,一般我们常用顺序表. 从代码中可以看出:与顺序表相比实际上就是插入和删除操作发生了改变. #include <iostream> using namespace std; const int Stack_S

大话数据结构---顺序存储结构的线性表

线性表的定义:零个或多个数据元素的有限序列. 定义的解读: 首先是由一组数据元素组成,可以基本数据类型,也可以使自定义的类型, 有限的个数,当然可以是0个,也就是空表呗, 还有一个特点就是有序 这么一看线性表抽象出来就和生活中的排队一样,一群小朋友站成一队,每个人都知道自己站在第几个,自己的前面是谁,后面谁,除了排头排位的两个数据,每个数据都有唯一的前驱和后继. 线性表的分类 今天先学习一下顺序存储结构,顺序存储结构指的就是用一段地址连续的存储单元依次存储线性表的数据元素: 这么一看线性表挺像数

【线性表2】线性表的顺序实现:顺序表

顺序表简介 特点:使用一组地址连续的存储单元依次存储表中的数据元素,常见的就是使用数组去实现. 表中逻辑相邻的数据元素,在物理内存上也相邻. 顺序表中的任意数据元素都可随机访问,是一种支持随机访问,长度自动动态调整的线性表结构. 优点:访问表中的元素很快,时间复杂度为O(1) 缺点:插入,删除元素需要移动大量的元素,时间复杂度为O(n) . 因此如果我们在编程中需要这样一种线性表数据结构:构造后对元素的访问操作很频繁,而很少进行增,删等元素位置的调整操作,那么就可以考虑使用顺序表. 代码实现 #