数据结构(一):顺序表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Magic_Ninja/article/details/83119587

线性基本概念

线性表的定义:线性表是具有相同特性数据元素的一个有序序列。

线性表的存储结构:

  1. 顺序表
  2. 链表

顺序表有随机访问的特性

链表结点的存储空间利用率较顺序表稍微低一些,但是方便插入删除,不需要移动任何元素

链表有一下五种形式:

  • 单链表
  • 双链表
  • 循环单链表
  • 循环双链表
  • 静态链表

线性表的结构体定义

顺序的结构代码

# define MAXSIZE 100  /* 存储空间初始分配量,为常量 */
typedef int ElemType;  /* ElemType是自己自定义的类型,假设为int */
typedef struct 
{
    ElemType data[MAXSIZE];   /* 存储数据元素,最大值为MAXSIZE */
    int length;  /* 线性表当前长度 */
}

链表的结构

顺序表的操作

初始化顺序表

void InitList(SqList &L) 	/* 要发生改变,所以要用引用型 */
{
    L.length = 0;
}

查找元素位置

在顺序表中查找第一个值等于e的元素,并返回其下标。

ElemType FindElem(Sqlist L, int e)
{
    for (int i = 0; i < L.length; ++i)
        if (e == L.data[i])
            return i;
    return -1;
}

获得元素

ElemType GetElem(SqList L, int i, ElemType &e)
{
    if(i < 0 || i > L.length - 1) 
        return 0;
    e = L.data[i - 1];
    return 1;
}

插入

插入算法思路:

  • 插入新元素,如果位置不正确,不合理,则抛出异常,插入失败;
  • 从最后一个元素开始向前遍历到第i个位置,分别将他们向后移动一个位置;
  • 将要插入的元素插入位置i处;
  • 顺序变长度增加1;
  • 返回代码1。

实现代码如下:

/* 初始条件:顺序表已经创建,1 <= ListLength(L) */
/* 预期结果:顺序表L在i位置插入新元素e,L长度增加1 */
ElemType ListInsert(SqList &L, int i, ElemType e) 	// L本身要发生改变所以要引用类型,e自定类型,或者int、float、double
{
    int n;
    if(i < 0 || i > L.length || L.length == MAXSIZE) 	/* 发生错误或者达到最大值,返回错误。 */
        return 0;
    for(n = L.length -1; n >= i; --n)
        L.data[n + 1] = L.data[n]; 	/* 从前往后,按顺序将每一个元素往后移动一个位置 */
    L.data[i] = e; 	/* 插入新元素 */
    ++(L.length); 	/* 表自增1 */
    return 1;
}

删除

删除顺序表L中下标为n的元素,成功返回1,删除的元素赋值给e,否则失败返回0

ElemType DeleteElem(SqList &L, int n, ElemType &e)
{
    int i;
    if(n < 0 || n > L.length -1)
        return 0;
    e = L.data[n];
    for(i = p;i < L.length - 1; ++i)
        L.data[i] = L.data[i + 1];
    --(L.length);
    return 1;
}

[1] 程杰. 大话数据结构[M]. 北京:清华大学出版社, 2016.
[2] 率辉. 2019版数据结构高分笔记[M]. 北京:机械工业出版社, 2018.
[3] 严蔚敏, 吴伟民. 数据结构(C语言版)[M]. 北京:清华大学出版社,1998.

猜你喜欢

转载自blog.csdn.net/Magic_Ninja/article/details/83119587