《数据结构》(C语言版)学习笔记——第2章 线性表(顺序表的基本操作)

2.4.1 线性表的顺序存储表示

//定义顺序表
typedef struct
{
  Elempty *elem;//存储空间的基地址
  int length;//当前长度
}*SqList,LNode;//顺序表的结构类型

2.4.2 顺序表中基本操作的实现

可以看出, 当线性表以上述定义的顺序表表示时,某些操作很容易实现。 因为表的长度是顺序表的一个 “属性”,所以可以通过返回length的值实现求表长的操作, 通过判断length的值是否为0 判断表是否为空,这些操作算法的时间复杂度都是O(1)。下面讨论顺序表其他几个主要操作的实现。

算法2.1 顺序表的初始化
顺序表的初始化操作就是构造一个空的顺序表。
【算法步骤】

①为顺序表L动态分配一个预定义大小的数组空间,使elem指向这段空间的基地址。

②将表的当前长度设为0。

【算法描述】

Status InitList(SqList &L)
{
  L = new LNode;//新建一个结点
  L->elem= new ElemType[MAXSIZE];  //为顺序表分配一个大小为MAXSIZE的数组空间
  if (! L->elem) return ERROR; //存储分配返回ERROR
  L->length=O;                     //空表长度为0
  return OK;
}

算法2.2 顺序表的取值
【算法步骤】
①判断指定的位置序号 i 值是否合理 (1

Status GetElem(SqList L, int i, ElemType& e)
{
    if (iL->length)
    {
        printf("查找位置非法,查找错误\n");
        return ERROR;
    }
    else
    {
        e = L->elem[i - 1];
        printf("%d\n", e);
        return OK;
    }
}

顺序表基本操作详细代码

#include
#define OK 1
#define ERROR 0
using namespace std;
typedef int ElemType;
typedef int Status;
#define MAXSIZE 100

/*定义顺序表*/
typedef struct {
    ElemType *elem;
    int length;
}*SqList,LNode;

/*初始化顺序表*/

Status InitList(SqList& L)
{
    L = new LNode;
    L->elem = new ElemType[MAXSIZE];
    if (!L->elem)
    {
        printf("初始化失败!\n");
        return ERROR;
    }
    L->length = 0;
    printf("初始化成功!\n");
    return OK;
}

/*建立顺序表*/
Status CreatList(SqList& L, int a[], int n)
{
    if (n > MAXSIZE)
    {
        printf("空间不足,无法建立顺序表! \n");
        return ERROR;
    }

    for (int i = 0; i < n; i++)
        L->elem[i] = a[i];
    L->length = n;
    return OK;
}
/*遍历操作*/
void PrintList(SqList L)
{
    for (int i = 0; i < L->length; i++)
        printf("%d ", (L->elem[i]));
}

/*取值(按位查找)*/
Status GetElem(SqList L, int i, ElemType& e)
{
    if (iL->length)
    {
        printf("查找位置非法,查找错误\n");
        return ERROR;
    }
    else
    {
        e = L->elem[i - 1];
        printf("%d\n", e);
        return OK;
    }
}
/*查找(按值查找)*/
Status LocateElem(SqList L, ElemType e)
{
    for (int i = 0; i < L->length; i++)
        if (L->elem[i] == e) return i + 1; //查找成功, 返回序号 i + l
    return ERROR;//查找失败
}

/*插入*/
Status ListInsert(SqList& L, int i, int e)
{//在顺序表 L 中第 l. 个位置之前插入新的元素 e, i值的合法范围是 1length+l
    if ((i < 1) || (i > L->length + 1)) return ERROR;//i值不合法
    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放入第l个位置
    ++L->length; //表长加1
    return OK;
}
/*删除*/
Status ListDelete(SqList& L, int i)
{//在顺序表L中删除第J.个元素,J.值的合法范围是1length+l
    if ((i < 1) || (i > L->length)) return ERROR;//i值不合法
    for (int j = i; j length - 1; j++)
        L->elem[j - 1] = L->elem[j];//被删除元素之后的元素前移
    --L->length;//表长减1
    return OK;
}

//测试主程序
int main()
{
    int a[5] = { 1,3,2,5,4 };
    int* p = new int;
    SqList List1;
    InitList(List1);//初始化
    printf("给顺序表赋值:1 2 3 4 5\n遍历并输出顺序表:\n");
    CreatList(List1, a, 5);//建立
    PrintList(List1);//遍历输出此顺序表
    printf("\n取第三位的值:\n");//按位取值
    GetElem(List1, 3, *p);
    if (LocateElem(List1, 4) == 0)printf("查无此值!\n");//按值查找
    else printf("顺序表中值为4的序号为:\n%d\n", LocateElem(List1, 4));
    ListInsert(List1, 2, 8);//在序号2位置上插入8
    printf("在序号2位置上插入8:\n");
    PrintList(List1);//遍历输出此顺序表
    ListDelete(List1, 3);//删除序号5上的元素
    printf("\n删除序号3上的元素:\n");
    PrintList(List1);//遍历输出此顺序表
}

Original: https://www.cnblogs.com/WMX-0121/p/15871954.html
Author: WMX_0121
Title: 《数据结构》(C语言版)学习笔记——第2章 线性表(顺序表的基本操作)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/583949/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 快速排序

    题目链接 快速排序板子题,练习快速排序的代码,下面是排序算法的一些对比 快速排序的思路图 快速排序的代码 #include using namespace std; const i…

    数据结构和算法 2023年6月8日
    098
  • Codeforces1575D

    思路分析 此题采用dfs,注意X选中了之后所有的X值相同,所以需要一个flag来存储X的值。 注意前导0要单独讨论,然后就是当’X’或者’_&#…

    数据结构和算法 2023年6月7日
    075
  • NOIPA层联测2 口胡题解

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/CDOI-24374/p/16749395.htmlAu…

    数据结构和算法 2023年6月7日
    0101
  • 算法竞赛进阶指南 0x54 树形DP

    总论 树状DP就是以 子树大小 节点的深度 为阶段。 当一个节点的最优解仅仅和他的儿子有关系,那么就可以。 Ural 大学有 N 名职员,编号为 1∼ N。 他们的关系就像一棵以校…

    数据结构和算法 2023年6月12日
    0107
  • 记一次 Druid 超时配置的问题 → 引发对 Druid 时间配置项的探究

    开心一刻 一天在路边看到一个街头采访 记者:请问,假如你儿子娶媳妇,给多少彩礼合适呢 大爷:一百万吧,再给一套房,一辆车 大爷沉思一下,继续说到:如果有能力的话再给老丈人配一辆车,…

    数据结构和算法 2023年6月7日
    0109
  • python爬虫配置随机请求头headers伪装User-Agent

    fake_useragent 库 调用方法 ua.random可以随机返回一个headers(User-Agent) from fake_useragent import User…

    数据结构和算法 2023年6月16日
    098
  • CF 795 div2

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月12日
    076
  • $mathcal{A,F,O}$

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据结构和算法 2023年6月8日
    070
  • HashMap的遍历

    HashMap的遍历: 1.使用map.keyset()与map.values()遍历键值 2.使用entryset() 3.使用Iterator迭代 4.做题时遇见的 hashM…

    数据结构和算法 2023年6月7日
    074
  • [LC623]在二叉树中增加一行

    题目描述 给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。 注意,根节点 root 位于深度 1 。…

    数据结构和算法 2023年6月8日
    069
  • 有序数组中找大于给定值的第一个元素,如果没有返回数组长度+1

    实验证明,查找大于某个值的第一个数 和 查找某个值 都可以用一样的二分法 唯一的区别:找某个值,如果找到了返回mid,找不到返回-1; 找大于某个值的第一个数,无论找没找到都返回l…

    数据结构和算法 2023年6月7日
    0110
  • C++ Protobuf

    Protobuf protobuf (protocol buffer) 是谷歌内部的混合语言数据标准。通过将结构化的数据进行序列化(串行化),用于通讯协议、数据存储等领域的语言无关…

    数据结构和算法 2023年6月8日
    079
  • 深度优先搜索入门

    数字的全排列 跳转链接 深度优先搜索就是先走到底走到无路可走然后再进行回溯的算法,用于全排列打表操作,数字的全排列操作就是每一个序列需要包含从1到n所有的数字,但是数字不能重复,不…

    数据结构和算法 2023年6月8日
    085
  • vscode常用快捷键

    菜单位置 File -> Preferences -> Keyboard Shortcuts 写代码会经常用的一些快捷键 增加缩进: ctrl+], 我的习惯alt+]…

    数据结构和算法 2023年6月7日
    083
  • 树状数组

    简述 什么是树状数组呢,顾名思义就是树一样的数组,本质就是用数组模拟树形结构。 树状数组有什么用呢,树状数组可以实现单点更新,单点查询,区间查询和区间更新,维护的东西和线段树可以类…

    数据结构和算法 2023年6月8日
    077
  • 大前端工程化之webpack构建流程

    webpack简单来讲就是一个打包器(bundler),负责将js应用程序的所有静态资源打包输出到一个文件中,不管你使用的是何种框架或程序中使用的任何类型的资源,它都可以将他们打包…

    数据结构和算法 2023年6月7日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球