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

          相关文章
          |
          12月前
          |
          算法 数据处理 C语言
          C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
          本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
          484 1
          |
          12月前
          |
          存储 算法 搜索推荐
          【趣学C语言和数据结构100例】91-95
          本文涵盖多个经典算法问题的C语言实现,包括堆排序、归并排序、从长整型变量中提取偶数位数、工人信息排序及无向图是否为树的判断。通过这些问题,读者可以深入了解排序算法、数据处理方法和图论基础知识,提升编程能力和算法理解。
          161 4
          |
          12月前
          |
          存储 机器学习/深度学习 搜索推荐
          【趣学C语言和数据结构100例】86-90
          本文介绍并用C语言实现了五种经典排序算法:直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序。每种算法都有其特点和适用场景,如直接插入排序适合小规模或基本有序的数据,快速排序则适用于大规模数据集,具有较高的效率。通过学习这些算法,读者可以加深对数据结构和算法设计的理解,提升解决实际问题的能力。
          143 4
          |
          12月前
          |
          存储 算法 数据处理
          【趣学C语言和数据结构100例】81-85
          本文介绍了五个经典算法问题及其C语言实现,涵盖图论与树结构的基础知识。包括使用BFS求解单源最短路径、统计有向图中入度或出度为0的点数、统计无向无权图各顶点的度、折半查找及二叉排序树的查找。这些算法不仅理论意义重大,且在实际应用中极为广泛,有助于提升编程能力和数据结构理解。
          131 4
          |
          7月前
          |
          存储 前端开发 Java
          线性数据结构详解
          本文介绍了线性数据结构中的核心概念——节点,以及基于节点构建的链表、队列和栈等重要数据结构。节点是计算机科学中基本的构建单元,包含数据和指向其他节点的链接。通过添加约束或行为,可以构建出单向链表、双向链表、队列和栈等复杂结构。
          190 1
          |
          9月前
          |
          定位技术 C语言
          c语言及数据结构实现简单贪吃蛇小游戏
          c语言及数据结构实现简单贪吃蛇小游戏
          |
          10月前
          |
          搜索推荐 C语言
          数据结构(C语言)之对归并排序的介绍与理解
          归并排序是一种基于分治策略的排序算法,通过递归将数组不断分割为子数组,直到每个子数组仅剩一个元素,再逐步合并这些有序的子数组以得到最终的有序数组。递归版本中,每次分割区间为[left, mid]和[mid+1, right],确保每两个区间内数据有序后进行合并。非递归版本则通过逐步增加gap值(初始为1),先对单个元素排序,再逐步扩大到更大的区间进行合并,直至整个数组有序。归并排序的时间复杂度为O(n*logn),空间复杂度为O(n),且具有稳定性,适用于普通排序及大文件排序场景。
          |
          10月前
          |
          存储 安全 C语言
          【C语言程序设计——选择结构程序设计】预测你的身高(头歌实践教学平台习题)【合集】
          分支的语句,这可能不是预期的行为,这种现象被称为“case穿透”,在某些特定情况下可以利用这一特性来简化代码,但在大多数情况下,需要谨慎使用。编写一个程序,该程序需输入个人数据,进而预测其成年后的身高。根据提示,在右侧编辑器补充代码,计算并输出最终预测的身高。分支下的语句,提示用户输入无效。常量的值必须是唯一的,且在同一个。语句的作用至关重要,如果遗漏。开始你的任务吧,祝你成功!,程序将会继续执行下一个。常量都不匹配,就会执行。来确保程序的正确性。
          307 10
          |
          10月前
          |
          小程序 C语言
          【C语言程序设计——基础】顺序结构程序设计(头歌实践教学平台习题)【合集】
          目录 任务描述 相关知识 编程要求 测试说明 我的通关代码: 测试结果: 任务描述 相关知识 编程编写一个程序,从键盘输入3个变量的值,例如a=5,b=6,c=7,然后将3个变量的值进行交换,使得a=6,b=7,c=5。面积=sqrt(s(s−a)(s−b)(s−c)),s=(a+b+c)/2。使用输入函数获取半径,格式指示符与数据类型一致,实验一下,不一致会如何。根据提示,在右侧编辑器补充代码,计算并输出圆的周长和面积。
          225 10
          |
          10月前
          |
          存储 算法 测试技术
          【C++数据结构——线性表】求集合的并、交和差运算(头歌实践教学平台习题)【合集】
          本任务要求编写程序求两个集合的并集、交集和差集。主要内容包括: 1. **单链表表示集合**:使用单链表存储集合元素,确保元素唯一且无序。 2. **求并集**:遍历两个集合,将所有不同元素加入新链表。 3. **求交集**:遍历集合A,检查元素是否在集合B中存在,若存在则加入结果链表。 4. **求差集**:遍历集合A,检查元素是否不在集合B中,若满足条件则加入结果链表。 通过C++代码实现上述操作,并提供测试用例验证结果。测试输入为两个集合的元素,输出为有序集合A、B,以及它们的并集、交集和差集。 示例测试输入: ``` a c e f a b d e h i ``` 预期输出:
          264 7