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

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日

相关文章

  • JavaScript数据结构之链表的实现

    JavaScript数据结构之链表的实现 什么是链表 链表是一种线性数据结构,其中的元素在内存中不连续地存储,每个元素通常由一个存储元素本身的节点和一个指向下一个元素的引用组成。相比较于数组,链表具有如下优缺点: 优点:动态地添加或删除元素时,无需移动其它元素。(数组则需要移动其它元素) 缺点:不能随机地访问某个元素,必须从头开始顺序遍历。(而数组可以通过索…

    数据结构 2023年5月17日
    00
  • C++超详细讲解单链表的实现

    首先我们来了解一下单链表的概念。 单链表是一种常见的数据结构,在计算机科学中被广泛使用。它是由节点所组成的数据结构,其中每个节点都包含两部分,一个是存储数据的元素,另一个是指向下一个节点的指针。单链表的首节点被称为头部,而最后一个节点则被称为尾部。单链表可以通过在头部插入和删除元素来实现高效地数据操作。接下来我们将讲解如何实现一个 C++ 版的单链表。 实现…

    数据结构 2023年5月17日
    00
  • Java数据结构专题解析之栈和队列的实现

    Java数据结构专题解析之栈和队列的实现 什么是栈和队列? 在计算机科学中,栈(Stack)和队列(Queue)都是常见的数据结构,用于解决许多问题。它们都是线性数据结构,但它们的元素访问顺序不同。 栈是先进后出(Last In First Out,LIFO)的结构,即最后放入栈中的元素最先被访问。 队列是先进先出(First In First Out,FI…

    数据结构 2023年5月17日
    00
  • Golang实现数据结构Stack(堆栈)的示例详解

    Golang实现数据结构Stack(堆栈)的示例详解 什么是Stack? Stack,也称为堆栈,是一种先进后出(Last In First Out, LIFO)的数据结构。举个例子,比如一堆书,你按照一定的顺序叠起来,然后你想要拿出第一本,你需要先拿掉上面的书才能取到下面的。这就是典型的堆栈模型。 在编程中,Stack也是一种非常常见的数据结构,特别是在函…

    数据结构 2023年5月17日
    00
  • C语言如何建立链表并实现增删查改详解

    这是一个比较复杂的问题,需要严谨的思考和详细的解释。下面我将按照以下三个部分,分别介绍: 什么是链表,链表的基本结构和实现方法 如何在C语言中建立链表并实现增删查改 两个示例说明 1. 链表的基本结构和实现方法 链表是一种线性数据结构,每个节点包含两个域:一个数据域和一个指针域。数据域存储节点的数据,指针域存储下一个节点的地址。每个节点都可以独立分配空间,所…

    数据结构 2023年5月17日
    00
  • python算法与数据结构朋友圈与水杯实验题分析实例

    让我来详细讲解一下“python算法与数据结构朋友圈与水杯实验题分析实例”的完整攻略。 1. 前言 本文将分享两个Python的算法与数据结构问题,即朋友圈和水杯实验题。我们将分别介绍问题的背景、解题思路和代码实现。 2. 朋友圈问题 2.1 背景 给定一个M*N的矩阵,矩阵中的每个元素都是1或0。如果矩阵中的1元素相邻,即水平、垂直或对角线相邻,则将这些元…

    数据结构 2023年5月17日
    00
  • python数据结构之二叉树的建立实例

    下面是Python数据结构之二叉树的建立实例的完整攻略。 一、二叉树的概念 二叉树是一种常用的树形结构,它由一组父子关系组成,其中每个节点都最多有两个子节点。通常我们认为,一个二叉树的根节点是唯一的,它没有父节点,而叶子节点则没有子节点。在二叉树中,节点的左子树和右子树可以为空。 二、二叉树的遍历 二叉树的遍历是指访问二叉树中所有节点的操作,它分为三种不同的…

    数据结构 2023年5月17日
    00
  • C利用语言实现数据结构之队列

    C语言实现队列的完整攻略 什么是队列 队列是一种线性数据结构,它有两个端点:队头和队尾。新的元素插入到队尾,每次从队头取出一个元素。这就类似于人们排队买票,新的买票者排在队尾,每当售票员完成一笔交易,队列头的买票者出队。 基本操作 队列主要有以下3个基本操作: 入队(enqueue):将一个元素添加到队列的尾部 出队(dequeue):从队列的头部移除一个元…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部