数据结构—— 线性结构:线性表

Posted 大彤小忆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构—— 线性结构:线性表相关的知识,希望对你有一定的参考价值。

1. 线性表

1.1 引入:多项式的表示

  例:一元多项式及其运算
    一元多项式: f ( x ) = a 0 + a 1 x + . . . + a n − 1 x n − 1 + a n x n f(x) = a_{0} + a_{1}x+...+a_{n-1}x^{n-1}+a_{n}x^{n} f(x)=a0+a1x+...+an1xn1+anxn
    主要运算: 多项式相加、相减、相乘等。
    分析: 如何表示多项式?
        ⋄ \\diamond 多项式的关键数据:多项式项数n
        ⋄ \\diamond 各项系数 a i a_{i} ai及指数 i i i

  • 方法1: 顺序存储结构直接表示
          数组各分量对应多项式各项,a[i]为项 x i x^{i} xi的系数 a i a_{i} ai。例如, f ( x ) = 4 x 5 − 3 x 2 + 1 f(x) = 4x^{5}-3x^{2}+1 f(x)=4x53x2+1表示成
     
    在这里插入图片描述 
          两个多项式相加:两个数组对应分量相加。
          问题: 如何表示多项式 x + 3 x 2000 x+3x^{2000} x+3x2000

  • 方法2: 顺序存储结构表示非零项
          每个非零项 a i x i a_{i}x^{i} aixi涉及两个信息:系数 a i a_{i} ai和指数 i i i,可以将一个多项式看成是一个 ( a i , i ) (a_{i}, i) (ai,i)二元组的集合。
          用结构数组表示:数组分量是由系数 a i a_{i} ai、指数 i i i组成的结构,对应一个非零项。
          例如, P 1 ( x ) = 9 x 12 + 15 x 8 + 3 x 2 P_{1}(x) = 9x^{12}+15x^{8}+3x^{2} P1(x)=9x12+15x8+3x2 P 2 ( x ) = 26 x 19 − 4 x 8 − 13 x 6 + 82 P_{2}(x) = 26x^{19}-4x^{8}-13x^{6}+82 P2(x)=26x194x813x6+82表示成
     
    在这里插入图片描述 
          按指数大小有序存储!
          相加过程:从头开始,比较两个多项式当前对应项的指数,若相同,将系数相加。即 P 3 ( x ) = P 1 ( x ) + P 2 ( x ) = 26 x 19 + 9 x 12 + 11 x 8 − 13 x 6 + 3 x 2 + 82 P_{3}(x) = P_{1}(x)+P_{2}(x)=26x^{19}+9x^{12}+11x^{8}-13x^{6}+3x^{2}+82 P3(x)=P1(x)+P2(x)=26x19+9x12+11x813x6+3x2+82

  • 方法3: 链表结构存储非零项
          链表中每个结点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指针域。
     在这里插入图片描述 
          例如 P 1 ( x ) = 9 x 12 + 15 x 8 + 3 x 2 P_{1}(x) = 9x^{12}+15x^{8}+3x^{2} P1(x)=9x12+15x8+3x2 P 2 ( x ) = 26 x 19 − 4 x 8 − 13 x 6 + 82 P_{2}(x) = 26x^{19}-4x^{8}-13x^{6}+82 P2(x)=26x194x813x6+82,链表存储形式如下所示。
     
    在这里插入图片描述 
          链表结构定义如下所示。

typedef struct PolyNode *Polynomial;
struct PolyNode {
    int coef;
    int expon;
    Polynomial link;
}

  ​多项式表示问题的启示:1.同一个问题可以有不同的表示(存储)方法;
  ​  ​  ​  ​  ​ ​  ​2.有一类共性问题:有序线性序列的组织和管理。

1.2 什么是线性表

  线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。
  线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表,存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

  ​ “线性表(Linear List)”: 由同类型数据元素构成有序序列的线性结构。
     ⋄ \\diamond 表中元素个数称为线性表的长度
     ⋄ \\diamond 线性表没有元素时,称为空表
     ⋄ \\diamond 表起始位置称为表头,表结束位置称表尾

1.3 线性表的抽象数据类型描述

  类型名称: 线性表(List)
  数据对象集: 线性表是 n (≥0) 个元素构成的有序序列 { a 1 , a 2 , … , a n } \\{a_1,a_2,…,a_n\\} {a1,a2,,an}
  操作集: 线性表L ∈ ∈ List,整数 i 表示位置,元素 X ∈ ∈ ElementType
       线性表基本操作主要有:

  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):返回线性表 的长度n。

1.4 线性表的顺序存储实现

  利用数组的连续存储空间存放线性表的各元素。线性表的顺序存储中的下标从 0 开始。

在这里插入图片描述
   线性表的顺序存储数据结构定义如下所示。

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

   访问下标为 i 的元素:L.Data[i]PtrL->Data[i]
   线性表的长度:L.Last+1PtrL->Last+1

   主要操作的实现:

   1. 初始化(建立空的顺序表)

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

   2. 查找

   (1)按值查找:Find

int Find(ElementType X,List PtrL)
{
    int i = 0;
    while( i <= PtrL->Last && PtrL->Data[i]!= X )
    {
        i++;
    }
    if (i > PtrL->Last)
        return -1;  //如果没找到,返回-1
    else  
        return i;  //找到后返回的是存储位置·
}

   (2)按序号查找:FindKth

ElementType FindKth(int K, List L) 
{
	if (K < 0 || L->Last < K)  //位置越界
	{  
		return NULL;
	}
	return L->Data[K];
}

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

   3. 插入 (第 i ( 1 ⩽ i ⩽ n + 1 ) i (1 \\leqslant i \\leqslant n+1) i(1i以上是关于数据结构—— 线性结构:线性表的主要内容,如果未能解决你的问题,请参考以下文章

数据结构学习笔记二线性表---顺序表篇(画图详解+代码实现)

Java数据结构学习笔记之一线性表的存储结构及其代码实现

线性表的链式存储(C代码实现)

数据结构-线性表

数据结构-线性表

线性表的插入和删除操作代码(C语言)