C语言线性表顺序存储结构实例详解

yizhihongxing

C语言线性表顺序存储结构实例详解

线性表的定义

线性表是数据结构中最基本的结构之一。它们是由相同数据类型的一组数据元素组成的序列。线性表具有唯一的首元素和唯一的末元素,除第一个元素之外的每个元素都有唯一的前继,除最后一个元素之外的每个元素都有唯一的后继。

线性表的存储方式

线性表有两种存储方式: 顺序存储和链式存储。

顺序存储采用一段连续的内存空间来存储线性表中的各元素。该结构的优点是可以随机访问元素,查找和访问速度较快,但是插入和删除操作需要移动大量元素,时间复杂度较高。

链式存储通过指针连接线性表中各元素,每个元素都包含指向下一元素的指针。链式结构的优点是插入和删除操作比较方便,不需要移动其他元素,缺点是链式结构不支持快速随机访问元素。

顺序存储结构的实现

顺序存储结构的实现需要先定义一个线性表的结构体,并定义存储线性表数据的数组。

下面是一个线性表结构体的定义:

#define MAXSIZE 20 //线性表的最大长度
typedef struct{
    int data[MAXSIZE];  //存储线性表数据的数组
    int length; //线性表的长度
}SeqList;

其中,MAXSIZE表示线性表的最大长度。data数组表示存储线性表数据的数组。length表示线性表的当前长度。

线性表的基本操作

初始化操作

初始化操作主要是将线性表的长度设置为0。代码如下:

void InitList(SeqList *L){
    L->length = 0; //设置线性表的长度为0
}

插入操作

插入操作主要是向线性表中插入一个元素。该操作有两个参数:要插入的线性表和要插入的元素。通常情况下,线性表的下标从1开始。

插入操作需要考虑两个方面:是否能够插入元素;插入的位置是否合法。插入元素的位置需要满足1<=pos<=L->length+1。插入元素的位置为pos,需要将pos之后的元素位置依次向后移动一位。

插入操作的代码如下:

bool InsertList(SeqList *L, int pos, int elem){
    if (pos < 1 || pos > L->length + 1) //插入位置不合法
        return false;
    if (L->length >= MAXSIZE) //线性表已满
        return false;
    for (int i = L->length; i >= pos; i--) //将指定位置之后的元素向后移动一位
        L->data[i+1] = L->data[i];
    L->data[pos] = elem; //插入元素
    L->length++; //线性表长度增加1
    return true;
}

在上述代码中,需要注意插入位置不合法和线性表已满的处理。

删除操作

删除操作主要是删除线性表中的一个元素。该操作有两个参数:要删除的线性表和要删除的元素位置。

删除操作需要考虑两个方面:删除的位置是否合法;删除元素后是否需要将其他元素位置依次向前移动一位。

删除操作的代码如下:

bool DeleteList(SeqList *L, int pos){
    if (pos < 1 || pos > L->length) //删除位置不合法
        return false;
    for (int i = pos; i < L->length; i++) //将指定位置之后的元素依次向前移动一位
        L->data[i] = L->data[i+1];
    L->length--; //线性表长度减少1
    return true;
}

在上述代码中,需要注意删除位置不合法的处理。

线性表的示例

示例一:往线性表中插入元素

#include <stdio.h>

#define MAXSIZE 20

//线性表的结构体
typedef struct{
    int data[MAXSIZE]; //存储线性表数据的数组
    int length; //线性表的长度
}SeqList;

//线性表的基本操作

//初始化操作
void InitList(SeqList *L){
    L->length = 0; //设置线性表的长度为0
}

//插入操作
bool InsertList(SeqList *L, int pos, int elem){
    if (pos < 1 || pos > L->length + 1) //插入位置不合法
        return false;
    if (L->length >= MAXSIZE) //线性表已满
        return false;
    for (int i = L->length; i >= pos; i--) //将指定位置之后的元素向后移动一位
        L->data[i+1] = L->data[i];
    L->data[pos] = elem; //插入元素
    L->length++; //线性表长度增加1
    return true;
}

//删除操作
bool DeleteList(SeqList *L, int pos){
    if (pos < 1 || pos > L->length) //删除位置不合法
        return false;
    for (int i = pos; i < L->length; i++) //将指定位置之后的元素依次向前移动一位
        L->data[i] = L->data[i+1];
    L->length--; //线性表长度减少1
    return true;
}

int main(){
    SeqList L; //定义线性表结构体
    int i, pos, elem;

    //初始化线性表
    InitList(&L);

    //往线性表中插入6个元素
    for (i = 1; i <= 6; i++)
        L.data[i] = i;
    L.length = 6;

    //输出线性表中的元素
    printf("原始线性表中的元素为:");
    for (i = 1; i <= L.length; i++)
        printf("%d ", L.data[i]);
    printf("\n");

    //向线性表中插入一个元素
    pos = 4; //插入的位置
    elem = 10; //插入的元素
    if (InsertList(&L, pos, elem) == true){
        printf("成功向线性表中插入元素%d,插入后线性表中的元素为:", elem);
        for (i = 1; i <= L.length; i++)
            printf("%d ", L.data[i]);
        printf("\n");
    }
    else{
        printf("插入元素失败\n");
    }

    return 0;
}

运行结果:

原始线性表中的元素为:1 2 3 4 5 6
成功向线性表中插入元素10,插入后线性表中的元素为:1 2 3 10 4 5 6

示例二:删除线性表中指定位置的元素

#include <stdio.h>

#define MAXSIZE 20

//线性表的结构体
typedef struct{
    int data[MAXSIZE]; //存储线性表数据的数组
    int length; //线性表的长度
}SeqList;

//线性表的基本操作

//初始化操作
void InitList(SeqList *L){
    L->length = 0; //设置线性表的长度为0
}

//插入操作
bool InsertList(SeqList *L, int pos, int elem){
    if (pos < 1 || pos > L->length + 1) //插入位置不合法
        return false;
    if (L->length >= MAXSIZE) //线性表已满
        return false;
    for (int i = L->length; i >= pos; i--) //将指定位置之后的元素向后移动一位
        L->data[i+1] = L->data[i];
    L->data[pos] = elem; //插入元素
    L->length++; //线性表长度增加1
    return true;
}

//删除操作
bool DeleteList(SeqList *L, int pos){
    if (pos < 1 || pos > L->length) //删除位置不合法
        return false;
    for (int i = pos; i < L->length; i++) //将指定位置之后的元素依次向前移动一位
        L->data[i] = L->data[i+1];
    L->length--; //线性表长度减少1
    return true;
}

int main(){
    SeqList L; //定义线性表结构体
    int i, pos;

    //初始化线性表
    InitList(&L);

    //往线性表中插入6个元素
    for (i = 1; i <= 6; i++)
        L.data[i] = i;
    L.length = 6;

    //输出线性表中的元素
    printf("原始线性表中的元素为:");
    for (i = 1; i <= L.length; i++)
        printf("%d ", L.data[i]);
    printf("\n");

    //删除线性表中指定位置的元素
    pos = 3;
    if (DeleteList(&L, pos) == true){
        printf("成功删除线性表中位置为%d的元素,删除后线性表中的元素为:", pos);
        for (i = 1; i <= L.length; i++)
            printf("%d ", L.data[i]);
        printf("\n");
    }
    else{
        printf("删除元素失败\n");
    }

    return 0;
}

运行结果:

原始线性表中的元素为:1 2 3 4 5 6
成功删除线性表中位置为3的元素,删除后线性表中的元素为:1 2 4 5 6

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言线性表顺序存储结构实例详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C++数据结构之链表详解

    C++数据结构之链表详解 链表是一种重要的数据结构,它可以动态的分配内存空间,实现灵活的元素插入,删除等操作。本文将详细讲解链表的定义、实现、常见操作以及链表的应用。 定义与特点 链表是一种线性表数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表分为单向链表和双向链表,其中单向链表的每个节点只包含一个指针,指向下一个节点,而双向链表的每…

    数据结构 2023年5月17日
    00
  • Python 树表查找(二叉排序树、平衡二叉树)

    下面是 Python 树表查找(二叉排序树、平衡二叉树)的完整攻略: 什么是树表查找 树表查找是一种数据结构,用于在数据集合中快速查找、插入和删除数据。树表查找的基本思想是利用特定的树形结构,在不断比较和移动中找到目标数据。常见的树表查找有二叉排序树和平衡二叉树。 二叉排序树(Binary Search Tree) 二叉排序树是一种特殊的二叉树结构,它满足以…

    数据结构 2023年5月17日
    00
  • Python实现的数据结构与算法之双端队列详解

    Python实现的数据结构与算法之双端队列详解 什么是双端队列? 双端队列是一种具有队列和栈的性质的数据结构,可以在队列两端进行插入和删除操作。双端队列可以实现两端的操作,因此可以在队列两端进行插入和删除操作,既可以像队列一样先进先出,也可以像栈一样后进先出。 双端队列的操作 add_front(item):在队头插入一个元素; add_rear(item)…

    数据结构 2023年5月17日
    00
  • 字符串算法–$\mathcal{KMP,Trie}$树

    \(\mathcal{KMP算法}\) 实际上,完全没必要从\(S\)的每一个字符开始,暴力穷举每一种情况,\(Knuth、Morris\)和\(Pratt\)对该算法进行了改进,称为 \(KMP\) 算法。 而\(KMP\)的精髓在于,对于每次失配之后,我都不会从头重新开始枚举,而是根据我已经得知的数据,从某个特定的位置开始匹配;而对于模式串的每一位,都有…

    算法与数据结构 2023年4月18日
    00
  • C语言实现学生信息管理系统(链表)

    C语言实现学生信息管理系统(链表) 简介 学生信息管理系统是管理学生的一种系统,可以实现添加、查找、删除和修改学生信息等功能。本文将使用C语言实现学生信息管理系统,并通过链表的方式进行实现。 前提条件 在开始之前,我们需要了解如下内容: C语言基础知识 链表的基本概念和使用 系统架构 学生信息管理系统主要包含以下几个模块: 学生信息结构体 添加学生信息 查找…

    数据结构 2023年5月17日
    00
  • Java数据结构之线段树的原理与实现

    Java数据结构之线段树的原理与实现 什么是线段树 线段树是一种基于分治思想的数据结构,它可以用来解决各种区间查询问题,例如区间求和、最大值、最小值等等。在算法竞赛和数据结构课程中,线段树被广泛应用,是一种非常实用的数据结构。 线段树的基本原理 线段树是一种二叉树,它的每个节点包含一个区间,叶子节点表示区间中的单个元素,非叶子节点表示区间的合并。 线段树的建…

    数据结构 2023年5月17日
    00
  • 在matlab中创建类似字典的数据结构方式

    当需要使用类似字典的数据结构时,Matlab中可以使用结构体来实现。结构体是一种有序的数据集合,每个元素都可以包含不同类型的数据(如字符串、数值等),并通过指定一个名称来唯一地标识该元素。 创建一个空结构体 使用struct函数可以创建一个空的结构体,可以使用下面的代码: st = struct; 添加键值对 可以将键值对添加到结构体中,可以使用下面的代码向…

    数据结构 2023年5月17日
    00
  • 牛客小白月赛71

    A.猫猫与广告 题目: 分析: 只需考虑c * d的矩阵竖着摆和横着摆两种情况。本题提示了考虑两矩阵对应边平行的情况,实际上可以证明倘若能斜着放,那么一定可以横着放或竖着放,证明方式可已通过构造三角形来证明a* b的矩阵的长宽一定小于c * d矩阵的长宽。 code: #include <iostream> #include <cmath&…

    算法与数据结构 2023年4月25日
    00
合作推广
合作推广
分享本页
返回顶部