C语言实现的顺序表功能完整实例

yizhihongxing

C语言实现的顺序表功能完整实例攻略

什么是顺序表?

顺序表是一种线性表,它通常由一组连续的存储单元(即数组)来存储数据元素,数据上的逻辑顺序可以和物理顺序一一对应,因此可以直接通过下标访问元素。它具有随机访问的特点,而不需要像链表那样依次寻找到某一个位置。

顺序表的基本操作

顺序表的基本操作包括初始化、插入、删除、查找、修改、销毁等。

实现方法

通过定义一个结构体来表示顺序表,结构体包含若干成员,比如说数组、长度等。

// 定义顺序表结构体
#define MAXSIZE 100
typedef struct {
    int data[MAXSIZE]; // 存储数据的数组
    int length;        // 当前顺序表的长度
} SqList;

初始化

顺序表初始化就是将结构体中的数组长度设为0,即表示当前顺序表为空。

void InitList(SqList *L) {
    L->length = 0;
}

插入

在顺序表指定位置插入元素,需要将指定位置及其后面的所有元素向右移动一个位置。如果当前顺序表已满,则无法插入新元素。

bool ListInsert(SqList *L, int i, int e) {
    if (L->length == MAXSIZE) { // 判断顺序表是否已满
        return false;
    }
    if (i < 1 || i > L->length + 1) { // 判断插入位置是否有效
        return false;
    }
    for (int j = L->length; j >= i; j--) {
        L->data[j] = L->data[j - 1]; // 将元素向后移动一个位置
    }
    L->data[i - 1] = e; // 将新元素插入指定位置
    L->length++;        // 长度加1
    return true;
}

删除

在顺序表指定位置删除元素,需要将指定位置后面的所有元素向左移动一个位置。如果当前顺序表为空,则无法删除元素。

bool ListDelete(SqList *L, int i) {
    if (L->length == 0) { // 判断顺序表是否为空
        return false;
    }
    if (i < 1 || i > L->length) { // 判断删除位置是否有效
        return false;
    }
    for (int j = i; j < L->length; j++) {
        L->data[j - 1] = L->data[j]; // 将元素向左移动一个位置
    }
    L->length--; // 长度减1
    return true;
}

查找

查找顺序表指定位置的元素,即通过下标来访问数组中的元素。如果当前顺序表为空或查找位置无效,则无法查找元素。

bool GetElem(SqList L, int i, int *e) {
    if (L.length == 0 || i < 1 || i > L.length) { // 判断查找位置是否有效
        return false;
    }
    *e = L.data[i - 1]; // 将指定位置的元素值赋给*e
    return true;
}

修改

修改顺序表指定位置的元素,即通过下标来访问数组中的元素并修改它的值。如果当前顺序表为空或修改位置无效,则无法修改元素。

bool SetElem(SqList *L, int i, int e) {
    if (L->length == 0 || i < 1 || i > L->length) { // 判断修改位置是否有效
        return false;
    }
    L->data[i - 1] = e; // 将指定位置的元素值修改为e
    return true;
}

销毁

销毁顺序表,即将结构体中的数组长度设为0,释放占用的内存空间。

void DestroyList(SqList *L) {
    L->length = 0; // 将长度设为0
    free(L);        // 释放内存空间
}

示例说明

示例1

以下代码示例初始化了一个顺序表,并依次插入了4个元素,最后输出了顺序表中所有元素的值。

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100
typedef struct {
    int data[MAXSIZE];
    int length;
} SqList;

int main() {
    SqList L;
    L.length = 0;
    for (int i = 1; i <= 4; i++) {
        ListInsert(&L, i, i);
    }

    for (int i = 1; i <= L.length; i++) {
        printf("%d ", L.data[i - 1]);
    }
    printf("\n");
    return 0;
}

输出结果为:

1 2 3 4

示例2

以下代码示例初始化了一个顺序表,并依次插入了4个元素,然后删除了第3个元素,最后输出了顺序表中所有元素的值。

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 100
typedef struct {
    int data[MAXSIZE];
    int length;
} SqList;

int main() {
    SqList L;
    L.length = 0;
    for (int i = 1; i <= 4; i++) {
        ListInsert(&L, i, i);
    }
    ListDelete(&L, 3);

    for (int i = 1; i <= L.length; i++) {
        printf("%d ", L.data[i - 1]);
    }
    printf("\n");
    return 0;
}

输出结果为:

1 2 4

总结

本文介绍了顺序表的基本操作及实现方法,通过结构体和数组的组合表示顺序表,在函数中实现各种操作。顺序表具有随机访问的高效性,适用于元素数量较少且需要高效查找、修改的场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现的顺序表功能完整实例 - Python技术站

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

相关文章

  • 浅析ARM架构下的函数的调用过程

    浅析ARM架构下的函数的调用过程 ARM函数调用基本流程 ARM函数调用的基本流程如下: 调用者保存寄存器(Callee saved registers):在调用函数之前,调用者需要保存被调用者需要用到的寄存器,否则这些值会被调用函数所覆盖,导致逻辑错误。在ARM架构中,callee saved registers 都是 r4-r11,他们将被保存在当前堆栈…

    C 2023年5月23日
    00
  • C++中strstr函数的实现方法总结

    C++中strstr函数的实现方法总结 什么是strstr函数 strstr函数是C/C++中的字符串函数之一,用于在字符串中查找子串。其原型如下: char * strstr ( const char * str1, const char * str2 ); 它的功能是在 str1 字符串中查找第一次出现 str2 字符串的位置,如果未找到则返回null。…

    C 2023年5月24日
    00
  • Cubase Elements 9怎么安装?Cubase Elements 9破解安装教程

    Cubase Elements 9是一款专业音乐创作软件,安装和破解过程需要注意一些细节。下面是详细的安装和破解教程。 下载Cubase Elements 9安装包 首先需要从官方网站或其他可靠下载站点下载Cubase Elements 9的安装包。这个过程需要保证下载的是完整的安装包,比如对于Windows系统,下载的文件应该是一个带有完整的安装程序的ex…

    C 2023年5月22日
    00
  • 基于C++自动化编译工具的使用详解

    基于C++自动化编译工具的使用详解 什么是自动化编译工具 自动化编译工具可以帮助我们简化编译过程,减少手动操作,提高编译效率,节省时间。目前常见的一些自动化编译工具有Makefile、CMake、SCons等。 其中,Makefile是最原始、最传统的自动化编译工具,他是通过规定一系列源文件、头文件、编译参数、依赖关系等,使代码能够被快速编译成可执行文件。 …

    C 2023年5月23日
    00
  • 逍遥自在学C语言 | 逻辑运算符

    前言 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、构成和表示方式 逻辑运算符是用来比较和操作布尔值的运算符 C语言中的逻辑运算符主要有3个,如下表所示 运算符 名称 示例 描述 && 与 a && b 当a和b都为真时,返回真 || …

    C语言 2023年4月17日
    00
  • C语言内部静态变量与外部静态变量的区别

    当我们定义一个静态变量时,它的存储位置决定了它是内部静态变量还是外部静态变量。 内部静态变量是在函数内部定义的静态变量,它只能在定义它的函数中使用,也就是说,这个静态变量的作用域只在这个函数内部。 外部静态变量是在函数外部定义的静态变量,它可以在整个程序中使用,但是作用域仅限于定义它的文件内部。 总体而言,静态变量都有着不会随时被销毁的特点,程序真正运行的时…

    C 2023年5月10日
    00
  • 如何修复Win11上的ntdll.dll崩溃错误? ntdll.dll崩溃问题解决办法

    如果你遇到了Win11上的ntdll.dll崩溃错误,可以根据以下步骤进行修复: 1. 重新启动电脑 首先,尝试重新启动电脑,因为某些系统问题可以通过重新启动来解决。如果重新启动后,错误仍然存在,请继续下一步操作。 2. 更新系统和驱动程序 从开始菜单中打开设置,并点击“更新和安全”选项。在右侧窗口中,点击“Windows 更新”并查找可用更新。如果有更新,…

    C 2023年5月23日
    00
  • c++ 面向对象的类设计

    C++ 面向对象的类设计攻略 什么是面向对象的类设计 面向对象的类设计是指基于面向对象编程思想来设计类的过程。面向对象编程思想是一种编程范式,其中的对象是一个实例或者说是类的一个实例化对象,这些对象通过类之间的消息传递进行通信,从而共同完成一个复杂的任务。 在C++编程中,面向对象的类设计尤为重要,因为它是C++中的重要组成部分。经典的面向对象编程思想是将数…

    C 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部