首页 > 其他分享 >数据结构基础第2讲

数据结构基础第2讲

时间:2024-04-18 22:03:19浏览次数:21  
标签:matrix 基础 next pb pa 节点 数据结构 bigstar

数据结构基础第2讲 线性表\(\bigstar \bigstar \bigstar \bigstar \bigstar\)

本讲知识结构
img

考点一:基本定义和逻辑

img

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

考点二:线性表的还是顺序结构\(\bigstar \bigstar \bigstar \bigstar\)

存储要点:将线性表中的元素从前往后依次存入一个地址连续的空间中

描述顺序表:
img
img

背:

# define MaxSize 100  // 假定最打容量100
typedef int ElemType;
type struct          // 定义线性表数据类型
{
    ElemType data[MaxSize];   // 存放元素的数组
    int length;              // 线性表长度
}SeqList;

img

  1. 建立顺序表:
    img

  2. 顺序表指针引用
    img

  3. 初始化顺序表
    img

  4. 顺序表判空
    img

  5. 求顺序表长度
    img

  6. 输出顺序表:
    img

  7. 按位置查找:
    img

  8. 按值查找:
    img

  9. 顺序表插入
    img
    注意边界条件

    抄代码

    int Insert(SeqList *L, int i, ElemType e)
    {
      if(L -> length >= MaxSize)
      {
         printf("上溢错误,插入失败\n");
         return 0;
      }
      if(i < 1 || i > L -> length + 1)
      {
         printf("位置错误,插入失败\n");
         return 0;
      }
      for(int j = L -> length; j >= i; j--)
         L -> data[j] = L -> data[j - 1];
      L -> data[i - 1] = e;
      L -> length++;
      return 1;
    }
    

    img

    时间复杂度:
    img

  10. 顺序删除
    img

    抄代码
    img

    时间复杂度:
    img

查找容易,增删难。

  1. 按值删除
    img

    抄代码:
    img

    时间复杂度:
    img

    顺序表去重问题算法\(\bigstar\)

    记录当前序列中有多少个被删元素x,从前往后扫描数组,若被记录值k为0,不移动;当为被删元素,删除,记录值为1;当其不是被删除元素,且记录值不为0时,往前移动k个元素。

    抄算法代码
    img

点拨

顺序表归并问题:

\[消除回溯\left \{ \begin{matrix} 1.有序 \\ 2.位置 \end{matrix} \right . \]

  1. 合并

\[双指针法\left \{ \begin{matrix} 双指针 \\ 不回溯 \\ 尾合并 \qquad \left \{ \begin{matrix} 谁小谁合并\\ 谁小谁后移 \\ 相等要去重 \end{matrix} \right . \end{matrix} \right . \]

代码:
img

\[看到有序想\left \{ \begin{matrix} 1.双指针 \\ 2.二分法 \end{matrix} \right . \]

  1. 逆置

    对位交换法:

    总体逆置
    img

    部分逆置:
    img

    \[\divideontimes \left \{ \begin{matrix} 1.总体逆置:i 与length - i - 1交换 \\ 2.部分逆置:forme + i与 to - i交换 \end{matrix} \right . \]

  2. 分割

    题眼 分开/分割 \(\left \{ \begin{matrix} 1.快排(基准)\rightarrow 无序\\ 2. 二分法(中间)\rightarrow 有序\end{matrix} \right .\)

S = O(1);T = O(n); 当使用二分时间复杂度可以达到O(\(\log n\))

代码:
img

考点三:线性表的链式结构

运行时动态分配空间

1.单链表结构

背诵单链表结构体:
img

基本组成:
img

2. 单链表的基本操作

  1. 如何向内存申请释放一个节点
    img

  2. 初始化一个链表
    img

  3. 插入一个节点

    \[\left \{ \begin{matrix} 1.找前驱\\ 2. 防断链 \end{matrix} \right . \]

    1.先链接后继节点,防断链

    2.再将插入节点连上前驱节点
    img

  4. 删除一个节点
    同理
    img

  5. 指针后移
    发挥工作指针作用

    p = p -> next;
    

    img

  6. 赋值操作
    对工作指针经过的某一特定点用另外一个指针保存。
    img

2.单链表的实现\(\bigstar \bigstar \bigstar \bigstar \bigstar\)

头插法逆序,尾插法逆序。

  1. 头插法

    创建数据顺序与原始数据顺序相反
    img

  2. 尾插法

    创建尾指针,始终指向尾节点。
    img

    代码:

    img

3.链表实现遍历,求长度,查找

  1. 遍历
    img

    代码:
    img

  2. 求长度

    代码:
    img

  3. 查找

    按位置

    img

    按值
    img

  4. 插入与删除

    插入:

    img

    按位置删除:

    img

    按值删除:

    img

4.单链表的应用,去重和逆置等

  1. 分割问题

    问题描述:

    img

    思路:

    img

    代码:

    void split(LNode *L, LNode *L1, LNode *L2)
    {
       LNode *p = L -> next, *q, *r1;      // p指向第一格数据点
       L1 = L;     // L1利用原来L的头节点
       r1 = L1;    //r1始终指向L1的尾节点
       L2 = (LNode *)malloc*(szieof(LNode));     // 创建L2的头节点
       L2 -> next = NULL;      // 置L2的指针域为NULL
       while(p != NULL)
       {
          r1 -> next = p;      // 采用尾插法将p(data值为a)插入L1中
          r1 = p;
          p = p -> next;    // p移向下一个节点(data值为b)
          q = p -> next;       // 用q保存p的后继节点
          p -> next = L2 -> next;    // 采用头插法将p插入L2中
          L2 -> next = p;
          p = q;      // p重新指向a_i+1的结点
       }
       r1 -> next = NULL;      //尾节点next置空
    }
    
  2. 合并

    问题描述:

    img

    双指针法代码:

    LinkList Merge_LinkList(LNode *La, LNode *Lb)
    {
       LNode *Lc, *pa, *pb, *pc, *ptr;
       Lc = La;
       pc = La;
       pa = La -> next;
       pb = Lb -> next;
    
       while(pa != NULL && pb != NULL)
       {
          // 将pa所指的节点合并,pa指向下一个节点
          if(pa -> data < pb -> data)
          {
             pc ->next = pa;
             pa = pa -> nect;
          }
          else if(pa -> data > pb -> data)
          {
             pc -> next = pb;
             pc = pb;
             pb = pb -> next;
          }
          else
          {
             // 合并以La,Lb为头节点的两个有序单链表
             pc -> next = pa;
             pc = pa;
             pa = pa -> next;
             ptr = pb;
             pb = pb -> next;
             free(ptr);
          }
          // 将pa所指的节点合并,pb所指的节点删除
       }
       if(pa != NULL) pc -> next = pa;
       if(pb !=NULL) pc -> next =pb;
       free(Lb);
       return (Lc);
    }
    
  3. 删除重复节点

    问题描述:
    img

    img

  4. 逆转线性单链表

    LinkList reverse_list(LNode *head)
    {
       if(NULL == head -> next) return NULL;
       LNode *p = head -> next;
       head -> next = NULL;
       LNode *tmp = NULL;
    
       while(p)
       {
          tmp = p -> next;
          p -> next = head -> next;
          head -> next = p;
          p = tmp;
       }
       return head;
    }
    

考点五:线性表的其他链式结构

  1. 双向链表
    定义结构体(代码题不要求)

    img

头插法,尾插法,查找删除,去重,知识点拨几个

标签:matrix,基础,next,pb,pa,节点,数据结构,bigstar
From: https://www.cnblogs.com/JUANFENHUI/p/18144470

相关文章

  • 【计算几何】牛客专题第二章 二维基础
    元素的表示点1.复数类·complex<int/duble>·特点:慢,自带各种运算,不怎么用2.pair·自带排序·自由度不高·基本不在几何题目中使用3.结构体(推荐,常用)自由度高,成员函数,重载运算符structPoint{ doublex,y;};向量(直接用Point)向量点积与几何意义及应用\vec{......
  • 3.Java基础学习
    Java基础注释单行注释多行注释文档注释publicclassHelloworld{publicstaticvoidmain(String[]args){//单行注释////输出一个HelloworldSystem.out.println("Helloworld");/*多行注释多行注释......
  • Web前端基础
    HTML&CSS基础HTML:结构(页面元素和内容)css:表现(网页元素的外观和位置等页面样式)行为:JavaScript:行为(网页模型定义与页面交互)排版标签排版标签标题标签:h系列标签重要程度依次递减特点:独占一行、h1-h6文字逐渐减小段落标签:p特点:段落之间存在间隙、独占一行文本格式化标签场景......
  • [02] JS-基础语法(一)
    1.几个概念本文我们讲解一下JS中的几个简单的概念,包括标识符、关键字、保留字、大小写和字面量。这些基本概念虽然不能直接提升我们的编程能力,但它们是JS的基本组成元素。1.1标识符所谓标识符(Identifier),就是名字。JavaScript中的标识符包括变量名、函数名、参数名、属性......
  • Flask基础
    一、简介1、框架介绍Flask是一个基于Python并且依赖于Jinja2模板引擎和WerkzeugWSGI服务的一个微型框架WSGI:WebServerGatewayInterface(WEB服务网关接口),定义了使用python编写的webapp与webserver之间接口格式其他类型框架:Django:比较“重”的框架,同时也是最出名的P......
  • [03] JS-基础语法(二)
    1.判断、循环1.1if-elseif语句ifelse语句ifelseifelse语句e.g.编写一个程序,获取一个用户输入的整数,然后显示这个数是奇数还是偶数。//编写一个程序,获取一个用户输入的整数//letnum=+prompt("请输入一个整数")letnum=parseInt(prompt("请输入一个整数"......
  • RTK基础知识
    GPSGNSSRTK区别上面这三个缩写经常会遇到,当然也经常会混淆GPS(GlobalPositioningSystem)即全球定位系统,是美国从20世纪70年代开始研制,历时20年,耗资200亿美元,于1994年全面建成,具有在海、陆、空进行全方位实时三维导航与定位功能的新一代卫星导航与定位系统。能够RTK(RealTi......
  • 软件工程基础-实验一-音乐软件
    一、对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点,以下为三个工具的对比分析1.适用领域:①墨刀:墨刀适用于一些简单,快速的在线原型设计工作,设计便捷,协同办公效率高;但是使用界面免费有限页面数量,和受网络影响可能导致页面丢失让墨刀下降了一个层次,通过A......
  • 信创里程碑:Tapdata 同时通过华为云 GaussDB 及鲲鹏兼容互认证,全面支持基础设施自主创
    近日,深圳钛铂数据有限公司(以下简称钛铂数据)自主研发的钛铂实时数据平台(TapdataLiveDataPlatform)分别与华为云GaussDB、华为云公有云平台(鲲鹏)完成相互兼容性测试,经功能、性能、安全三轮测试显示,TapdataLiveDataPlatform与二者兼容性良好,系统功能正常,运行稳定,顺利获得华为云......
  • Effective Python:第6条 把数据结构直接拆分到多个变量里,不要专门通过下标访问
    使用拆分(unpacking),就可以把元组里面的元素分别赋给多个变量。优点:1,通过unpacking来赋值要比通过下标去访问元组内的元素更清晰,而且这种写法所需的代码量通常比较少。2,便于原地交换两个变量;tb=[1,2]tb[0],tb[1]=tb[1],tb[0]print(tb)3,for循环或者类似的结构(例如推......