线性数据结构

目录

一、线性表及其实现

1、多项式的表示

方法1:顺序存储结构直接表示

方法2:顺序存储结构表示非零项

方法3:链表结构存储非零项

2、什么是线性表

3、线性表的顺序存储实现

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

3.2查找

3.3插入

3.4删除

4、线性表的链式存储实现

4.1求表长

4.2查找

4.3插入

4.4删除

4.5案例:单链表的逆转

5、广义表

6、多重链表

二、堆栈

1、什么是堆栈

2、栈的顺序存储实现

2.1一个数组实现一个堆栈

2.2一个数组实现两个堆栈

3、堆栈的链式存储实现

4、堆栈应用:表达式求值

三、队列

1、什么是队列

2、队列的顺序存储实现

3、队列的链式存储实现

4、应用实例:多项式加法运算

5、多项式的相乘和相加运算

5.1题意理解

5.2求解思路


一、线性表及其实现

1、多项式的表示

【例】一元多项式及其运算

一元多项式:f(X) = a_0 + a_1x+\cdots+a_{n-1}x^{n-1} + a_nx^n

主要运算:多项式相加、相减、相乘等

【分析】多项式的关键数据:

多项式项数n
各项系数a_i及指数i

方法1:顺序存储结构直接表示

数组各分量对应多项式各项:

a[i]:项xi的系数ai

例如: f(X) = 4x^5-3x^2+1

表示成:

 两个多项式相加:两个数组对应分量相加

方法2:顺序存储结构表示非零项

每个非零项 a_ix^i 涉及两个信息:系数 a_i 和指数 i 

可以将一个多项式看成是一个 (a_i,i) 二元组的集合。

用结构数组表示:数组分量是由系数 a_i、指数 i 组成的结构,对应一个非零项

例如:P_1(x)=9x^{12}+15x^7+3x^2 和 P_2(x)=26x^{19}-4x^8-13x^6+82

 相加过程:可以从头开始,比较两个多项式当前对应项的指数

方法3:链表结构存储非零项

链表在每个结点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指数域

结点:

Struct PolyNode
{
    int coef;
    int expon;
    Polynomial link;
}

PolyNode* Polynomial;

【链表存储形式】

 

2、什么是线性表

  • 线性表(Linear List):由同类型数据元素构成有序序列的线性结构

    • 表中元素个数称为线性表的长度

    • 线性表没有元素时,称为空表

    • 表起始位置称为表头,表结束位置称为表尾

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

    • 类型名称:线性表(List)

    • 数据对象集:线性表时 n(\geq0) 个元素构成的有序序列 (a_1,a_2,\cdots,a_n)

    • 操作集:线性表 L \in List,整数i表示位置,元素 X \in 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前插入一i个新元素X;

      • 5、void Delete(int i, List L):删除指定位序i的元素;

      • 6、int Length(List L):返回线性表L的长度n。

3、线性表的顺序存储实现

利用数组的连续存储空间顺序存放相信白哦的各元素

sruct LNode
{
	ElementType Data[MAXSIZE];
    int Last;
}

LNode L;
LNode* PtrL = &L;

访问下标为 i 的元素:L.Data[i] 或 PtrL->Data[i]

线性表的长度: L.Last+1 或 PtrL->Last+1

主要操作的实现

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

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

3.2查找

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

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

3.3插入

i(1\leq i \leq n+1) 个位置上插入一个值为X的新元素

 

void Insert(ElementType X, int i, List PtrL)
{
	if (PtrL->Last == MAXSIZE - 1)
    {
        cout << "表满" << endl;
        return;
	}
    if (i < 1 || i > PtrL->Last + 2)
    {
        cout << "位置不合法" << endl;
        return;
	}
    for (int j = PtrL->Last; j >= i - 1; j--)
    {
        PrtL->Data[j + 1] = PtrL->Data[j];
        PrtL->Data[i - 1] = X;
        PrtL->Last++;
        return;
	}
}

平均移动次数为n/2,平均时间性能为O(n)

3.4删除

删除表的第 i(1 \leq i \leq n) 个位置上的元素

 

void Delete(int i, List PtrL)
{
	if (i < 1 || i > PtrL->Last + 1)
    {
        cout << "不存在该元素" << endl;
        return;
    }
    for (int j = i; j <= PtrL->Last; j++)
    {
        PtrL->Data[j - 1] = PtrL->Data[j];
        PtrL->Laast--;
	}
    return;
}

平均移动次数为(n-1)/2,平均时间习能为O(n)

4、线性表的链式存储实现

不要求逻辑上相邻的两个元素物理上也相邻;通过“链”建立起数据元素之间的逻辑关系。

故插入、删除不需要移动数据元素,只需要修改“链”。

struct LNode
{
	ElementType Data;
    List Next;
}

LNode L;
LNode* PtrL = &L;

 主要操作的实现:

4.1求表长

int Length(LNode* PtrL)
{
    LNode* p = PtrL;
    int j = 0;
    while (p)
    {
        p = p->Next;
        j++;
	}
    return j;
}

时间性能为O(N)

4.2查找

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值