C语言|数据结构——线性结构(线性表及其实现)

简介: 线性表(Linear List)主要操作的实现初始化广义表实际上就是多重链表多重链表中的结点可能同时隶属多个链指针域会有多个,例如上面代码行中的Next和SubList两个指针域但双向链表中包含两个指针域,并不是多重链表基本上树、图这样相对复杂的数据结构都可以采用多重链表方式实现存储。矩阵采用典型的多重链表——十字链表来代替二维数组来存储稀疏矩阵(二维数组存储稀疏矩阵缺点:1.会造成大量空间浪费

 线性表(Linear List)


由同种数据元素构成有序序列的线性结构

    • 表中元素个数称为线性表的长度
    • 线性表没有元素时,称为空表
    • 表起始位置称表头,结束位置称表尾

    抽象数据类型描述


    类型名称:线性表(List)

    数据对象集:n(>=0)个元素构成的有序序列

    操作集:假定线性表类型为List,其中具体的一个线性表为L,里面有个元素类型为ElementType的x,主要操作有:

      1. List MakeEmpty():初始化一个空线性表L
      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):返回线性表L的长度n

      线性表的存储


      顺序存储

             利用数组的连续存储空间顺序存放线性表的各元素

      由于是连续,所以要定义一个Last来存储最后一个元素,表明结尾的位置

      typedef struct LNode*List;
      struct LNode{
              ElementType Data[MAXSIZE];
              int Last;
      };
      struct LNode L;
      List PtrL;

      image.gif

      主要操作的实现

      初始化

      List MakeEmpty()
      {
          List PtrL;
          PtrL = (List)malloc(sizeof(struct LNode));
          ptrL->Last = -1;
          return PtrL;
      }

      image.gif

      查找

      int Find(ElementType X,List PtrL)
      {
          int i = 0;
          while(i<=PtrL->Last && PtrL->Data[i]!= X )
              i++;
          if(i>PtrL->Last)
              return -1;
          else return i;
      }

      image.gif

      这种查找成功的平均比较此时为(n+1)/2,平均时间性能为O(n)

      线性表推广

      广义表(Generalized List)

      对于线性表        n个元素都是基本的单元素

      对于广义表        这些元素不仅可以是单元素也可以是另一个广义表

      typedef struct GNode *Glist;
      struct GNode{
          int Tag;                /*标志域:0表示节点是单元素,1表示结点是广义表*/
          union {
              ElemenType Data;    /*子表指针域Sublist与单元素数据域Data复用,即共用存储空间*/
              GList SubList;
              }URegion;
              GList Next;        /*指向后继结点*/
      };

      image.gif

      多重链表

      广义表实际上就是多重链表

      多重链表中的结点可能同时隶属多个链

      指针域会有多个,例如上面代码行中的Next和SubList两个指针域

      但双向链表中包含两个指针域,并不是多重链表

      用途

      基本上树、图这样相对复杂的数据结构都可以采用多重链表方式实现存储。

      矩阵

      采用典型的多重链表——十字链表来代替二维数组来存储稀疏矩阵

      (二维数组存储稀疏矩阵缺点:1.会造成大量空间浪费

                                                       2.数组大小需要事先确定)

        • 只存储矩阵非0元素项

                       结点的数据域:行坐标Row列坐标Col数值Value

          • 每个结点通过两个指针域把同行同列串起来

                         行指针(向右指针)Right

                         列指针(向下指针)Down

          相关文章
          |
          28天前
          |
          机器学习/深度学习 算法 C语言
          【趣学C语言和数据结构100例】11-15
          本文介绍了五个C语言编程问题及其实现,包括矩阵对角线元素之和、有序数组插入、数组逆序、杨辉三角输出和魔方阵生成。每个问题不仅涉及基本的数组操作,还涵盖了算法设计的核心思想,如循环、条件判断和递归。通过解决这些问题,读者可以加深对C语言和数据结构的理解,提升编程技能。这些问题的解决过程展示了如何有效处理数组和矩阵,以及如何利用算法优化程序性能,为实际应用提供了宝贵的实践经验。
          52 4
          【趣学C语言和数据结构100例】11-15
          |
          20天前
          |
          算法 数据处理 C语言
          C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
          本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
          30 1
          |
          28天前
          |
          存储 算法 搜索推荐
          【趣学C语言和数据结构100例】91-95
          本文涵盖多个经典算法问题的C语言实现,包括堆排序、归并排序、从长整型变量中提取偶数位数、工人信息排序及无向图是否为树的判断。通过这些问题,读者可以深入了解排序算法、数据处理方法和图论基础知识,提升编程能力和算法理解。
          44 4
          |
          28天前
          |
          存储 机器学习/深度学习 搜索推荐
          【趣学C语言和数据结构100例】86-90
          本文介绍并用C语言实现了五种经典排序算法:直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序。每种算法都有其特点和适用场景,如直接插入排序适合小规模或基本有序的数据,快速排序则适用于大规模数据集,具有较高的效率。通过学习这些算法,读者可以加深对数据结构和算法设计的理解,提升解决实际问题的能力。
          43 4
          |
          28天前
          |
          存储 算法 数据处理
          【趣学C语言和数据结构100例】81-85
          本文介绍了五个经典算法问题及其C语言实现,涵盖图论与树结构的基础知识。包括使用BFS求解单源最短路径、统计有向图中入度或出度为0的点数、统计无向无权图各顶点的度、折半查找及二叉排序树的查找。这些算法不仅理论意义重大,且在实际应用中极为广泛,有助于提升编程能力和数据结构理解。
          38 4
          |
          28天前
          |
          算法 数据可视化 数据建模
          【趣学C语言和数据结构100例】76-80
          本文介绍了五种图论算法的C语言实现,涵盖二叉树的层次遍历及广度优先搜索(BFS)和深度优先搜索(DFS)的邻接表与邻接矩阵实现。层次遍历使用队列按层访问二叉树节点;BFS利用队列从源节点逐层遍历图节点,适用于最短路径等问题;DFS通过递归或栈深入图的分支,适合拓扑排序等场景。这些算法是数据结构和算法学习的基础,对提升编程能力和解决实际问题至关重要。
          45 4
          |
          28天前
          |
          存储 算法 vr&ar
          【趣学C语言和数据结构100例】71-75
          本文介绍了五个C语言数据结构问题及其实现,涵盖链表与二叉树操作,包括按奇偶分解链表、交换二叉树左右子树、查找节点的双亲节点、计算二叉树深度及求最大关键值。通过递归和遍历等方法,解决了理论与实际应用中的常见问题,有助于提升编程能力和数据结构理解。
          36 4
          |
          28天前
          |
          存储 算法 C语言
          【趣学C语言和数据结构100例】66-70
          本书《趣学C语言和数据结构100例》精选了5个典型的数据结构问题及C语言实现,涵盖链表与数组操作,如有序集合的集合运算、有序序列表的合并、数组中两顺序表位置互换、三递增序列公共元素查找及奇偶数重排。通过详细解析与代码示例,帮助读者深入理解数据结构与算法设计的核心思想,提升编程技能。
          32 4
          |
          28天前
          |
          存储 算法 C语言
          【趣学C语言和数据结构100例】51-55
          本文介绍了五个关于链表操作的C语言实现案例,包括删除单链表中的重复元素、从两个有序链表中查找公共元素、判断一个链表是否为另一链表的连续子序列、判断循环双链表是否对称及合并两个循环单链表。每个案例都详细解析了算法思路与实现方法,涵盖了链表操作的多种场景,旨在帮助读者深入理解链表数据结构的应用,提升算法设计与编程能力。
          39 4
          |
          28天前
          |
          存储 算法 C语言
          【趣学C语言和数据结构100例】16-20
          本文精选了五个C语言编程问题,涵盖数组操作、字符串处理等基础领域。包括查找二维数组中的鞍点、折半查找法、统计文章中字符数量、电文解密及字符串连接。每个问题都附有详细的代码实现与分析,旨在帮助读者理解算法逻辑,提升编程技巧。通过这些实践,不仅能锻炼编程能力,还能加深对数据结构和算法的理解,为未来的学习和工作打下坚实基础。
          60 4