数据结构(C++)学习篇(二):线性表(顺序表示和实现)

目录

线性结构

线性表逻辑结构

顺序存储结构

线性表的顺序表示和实现

1.线性表的定义

2. 线性表的初始化

3.销毁线性表L和清空线性表L

4.判断线性表L是否为空和求线性表L长度

5.根据位置i获取对应位置的元素内容

6.按值查找

7.插入

8.删除

顺序表优缺点

课外阅读


线性结构

  1. 只有一个头结点和尾结点;
  2. 除头尾结点外,其他结点只有一个直接前驱和一个直接后驱

线性结构反映结点间的逻辑关系是:一对一(1:1)

=========================================================================

线性表逻辑结构

注意:同一线性表中的元素必定具有相同的特性!   

顺序存储结构

特点:逻辑上相邻的元素在物理上也相邻

方法:用一组地址连续的存储单元依次存储线性表的元素

                       ↓↓ ↓↓ ↓↓

                       数组V[n]

notes:c语言中数组下标从0开始,即V[n]有效范围:V[0]~V[n-1]

线性表的顺序表示和实现

1.线性表的定义
//状态返回类型
#define TRUE      (1)
#define FALSE     (0)
#define OK        (1)
#define ERROR      (0)
#define INFEASIBLE (-1)
#define OVERFLOW   (-2)

typedef int Status;
typedef char ElemType;

#define LIST_INIT_SIZE 100

typedef struct {
    ElemType elem[LIST_INIT_SIZE];
    int length;
}SqList;

2. 线性表的初始化
Status InitList_Sq(SqList &L)
{
    L.elem = new ElemType[MAXSIZE];
    if(!L.elem)
        return OVERFLOW;
    L.length = 0;
    return OK;
}
3.销毁线性表L和清空线性表L
//销毁
void DestroyList(SqList &L)
{
    if(L.elem)
        delete L.elem;
}
//清空
void ClearList(SqList &L)
{
    L.length = 0;
}
4.判断线性表L是否为空和求线性表L长度
//求L的长度
int GetLength(SqList &L)
{
    return (L.length);
}
//判断L是否为空
void IsEmpty(SqList &L)
{
    if(0==L.length)
        return 1;
    else
        return 0;
}
5.根据位置i获取对应位置的元素内容
Status GetElem(SqList L, int i, ElemType &e)
{
    if(i<1 || i>L.length) 
        return ERROR;
    e = L.elem[i-1];
    return OK;
}
6.按值查找
//顺序按值查找与指定值e相同的数据元素的位置,不存在输出为0
int LocateElem(SqList L, ElemType e){
    for(int i=0; i<L.length; i++)
    {
        if(L.elem[i] == e){
            return i+1;
        }
    }
    return 0;
}
7.插入

时间复杂度:(O(n))

//线性表L的第i个位置插入元素e
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{
    if(i<1 || i>L.length+1)
        return ERROR;
    if(L.length == MAXSIZE)
        return ERROR;
    for(int j=L.length-1; j>=i-1; j--)
    {
        L.elem[j+1] = L.elem[j];//将插入位置及之后的元素后移
    }
    L.elem[i-1] = e;//新元素e放入第i个位置
    L.length++;//长度加1
    return OK;
}
8.删除

时间复杂度:O(n)

//将线性表L的第i个位置的元素删除
Status ListDelete_Sq(SqList &L, int i)
{
    if(i<1 || i>L.length+1)
        return ERROR;
    for(int j=i; j<=L.length-1; j++)
        L.elem[j-1] = L.elem[j];//被删除元素之后的元素前移
    L.length--;//表长减一
    return OK;
}

顺序表优缺点

  1. 优点:任一元素均可随机存取
  2. 缺点:①进行插入和删除操作需要移动大量元素;②存储空间不灵活

=========================================================================

例题:设正整数a的前驱为PRIOR(a),后继为NEXT(A),用递归算法计算a+b;

int add(int a, int b)
{
    if (a == 0) return b;
    else return (add(prior(a),next(b)));
}

int addint(int a, int b)
{
    int m=0;
    if(a>b) //以较小的值作为减一计数器
    {
        m = a;
        a = b;
        b = m;
    }
    return (add(a,b));
}

课外阅读

推荐:《数学之美》《浪潮之巅》

=========================================================================

代码均为手动输入,如有错误欢迎指正。

视频:戳这里_B站大学

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值