数据结构—— 线性结构:线性表
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+...+an−1xn−1+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)=4x5−3x2+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)=26x19−4x8−13x6+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+11x8−13x6+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)=26x19−4x8−13x6+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
线性表基本操作主要有:
List MakeEmpty()
: 初始化一个空线性表L;ElementType FindKth(int K, List L)
:根据位序K,返回相应元素;int Find(ElementType X, List L)
:在线性表L中查找X的第一次出现位置;void Insert(ElementType X, int i, List L)
:在位序i前插入一个新元素X;void Delete(int i, List L)
:删除指定位序i的元素;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+1
或PtrL->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(1⩽i⩽以上是关于数据结构—— 线性结构:线性表的主要内容,如果未能解决你的问题,请参考以下文章