C语言手写集合List的示例代码

下面是详细讲解如何手写C语言的集合List,并附带两个示例。

什么是集合List?

集合是一种数据结构,它可以存储任意类型的数据,并且可以动态地添加、删除和查询数据。其中最常见的集合是列表(List),它可以存储一组相同或不同类型的数据,并且可以根据需要进行扩展和缩减。

List的实现

下面介绍一下如何使用C语言手写一个List。一个List由一个指针和一个大小表示,指向一个数组,存储List中的元素。特别的,使用一个宏定义,定义List中元素的最大长度。

#define MAX_LEN 1000
typedef struct {
    void* data[MAX_LEN];
    int size;
} List;

上述代码定义了一个List结构体,其中void* data[MAX_LEN]表示一个长度为MAX_LEN的数组,该数组存储了List中的元素,int size表示List的大小,即存储了多少个元素。

接下来,我们可以实现List中的主要方法(增加/删除/查询):

  • List *listCreate():创建一个新的List,并返回指针。
  • void listAdd(List* list, void* item):将一个元素添加到List中。
  • void listDelete(List* list, int index):从List中删除一个元素。
  • void* listGet(List* list, int index):获取List中指定位置的元素。
  • int listSize(List* list):获取List的大小。
  • void listDestroy(List* list):销毁List。

下面是示例代码:

List* listCreate() {
    List* list = (List*) malloc(sizeof(List));
    list->size = 0;
    return list;
}

void listAdd(List* list, void* item) {
    if(list->size == MAX_LEN) {
        return;
    }
    list->data[list->size++] = item;
}

void listDelete(List* list, int index) {
    if(index < 0 || index >= list->size) {
        return;
    }
    list->data[index] = NULL;
    for(int i = index + 1; i < list->size; i++) {
        list->data[i-1] = list->data[i];
        list->data[i] = NULL;
    }
    list->size--;
}

void* listGet(List* list, int index) {
    if(index < 0 || index >= list->size) {
        return NULL;
    }
    return list->data[index];
}

int listSize(List* list) {
    return list->size;
}

void listDestroy(List* list) {
    for(int i = 0; i < list->size; i++) {
        list->data[i] = NULL;
    }
    list->size = 0;
    free(list);
}

示例1

现在我们来看第一个示例,我们将使用上述方法实现一个存储字符串的List,并添加几个元素进行演示。

int main() {
    List* list = listCreate();
    char* s1 = "hello";
    char* s2 = "world";
    listAdd(list, s1);
    listAdd(list, s2);
    printf("list size: %d\n", listSize(list));
    for(int i = 0; i < listSize(list); i++) {
        printf("list[%d]: %s\n", i, (char*) listGet(list, i));
    }
    listDestroy(list);
    return 0;
}

运行上述代码,可以得到以下输出:

list size: 2
list[0]: hello
list[1]: world

示例2

接下来的示例,我们将把List当做一个存储数字的数组,添加一些整数,然后删除一些数据,并输出List的大小和内容。

int main() {
    List* list = listCreate();
    int n1 = 10, n2 = 20, n3 = 30;
    listAdd(list, &n1);
    listAdd(list, &n2);
    listAdd(list, &n3);
    printf("list size: %d\n", listSize(list));
    for(int i = 0; i < listSize(list); i++) {
        int* p = (int*) listGet(list, i);
        printf("list[%d]: %d\n", i, *p);
    }
    listDelete(list, 1);
    printf("list size: %d\n", listSize(list));
    for(int i = 0; i < listSize(list); i++) {
        int* p = (int*) listGet(list, i);
        printf("list[%d]: %d\n", i, *p);
    }
    listDestroy(list);
    return 0;
}

该示例输入对象为整数,在添加完整数之后,中间删除了元素:20 ,然后再输出List。运行代码,可以得到以下输出:

list size: 3
list[0]: 10
list[1]: 20
list[2]: 30
list size: 2
list[0]: 10
list[1]: 30

综上所述,我们以 C 语言手写集合 List 的示例代码为例,讲解了如何手写一个List以及如何操作它,包括其创建、添加、删除、查询和销毁方法,并且通过两个不同的示例展示了如何使用它以及如何逐步更改它。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言手写集合List的示例代码 - Python技术站

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

相关文章

  • C语言MFC导出dll回调函数方法详解

    C语言MFC导出dll回调函数方法详解 在C语言MFC程序开发中,可能会需要用到回调函数,用于向调用方传递处理结果。而MFC导出dll的方式,可以让我们在其他程序中使用该函数。下面是导出dll回调函数的详细攻略。 步骤1:定义回调函数 首先需要定义回调函数,在函数名前加上__declspec(dllexport)关键字。以下是一个示例: __declspec…

    C 2023年5月23日
    00
  • C++实现简易反弹小球游戏的示例代码

    好的。首先,让我们来讲解如何使用C++实现简易反弹小球游戏的完整攻略。 准备工作 在开始编写代码之前,我们需要准备一些工具和环境: C++编译器(建议使用Visual Studio等集成开发环境) 游戏引擎或者相关库(例如SDL2等) 在本篇攻略中,我们将使用SDL2库来实现我们的游戏。因此,在开始之前,我们需要安装SDL2库及其所需的依赖项。 编写代码 接…

    C 2023年5月24日
    00
  • C语言中设置用户识别码的相关函数的简单讲解

    下面是关于C语言中设置用户识别码相关函数的简要讲解: 什么是用户识别码? 用户识别码是一种数字标识符,用于标识和区分不同的用户。在操作系统中,每个用户都有一个独特的用户识别码(UID),操作系统根据用户识别码来识别用户,以控制对资源的访问权限。 C语言中设置用户识别码的函数 在C语言中,可以使用以下函数设置当前进程的用户识别码(UID)。这些函数定义在 &l…

    C 2023年5月23日
    00
  • C语言实现密码本小项目

    C语言实现密码本小项目攻略 项目介绍 本项目实现了一个基本的密码本,可以进行用户账号和密码的添加、删除、修改、查看等操作,可以有效地保护用户的个人隐私信息。 基础知识 要完成本项目,需要掌握基本的C语言编程知识,包括变量、函数、指针、结构体、文件操作等。同时还需要了解基本的加密技术,例如MD5算法、SHA算法等。 项目架构 本项目的架构主要有以下几个部分: …

    C 2023年5月23日
    00
  • 用C语言实现三子棋

    下面我将详细讲解如何用C语言实现三子棋游戏。 实现思路 三子棋游戏是一款非常经典的井字棋类游戏,实现起来并不复杂。游戏的基本规则是:先手方执“X”,后手方执“O”,两人交替落子,先将三个同色棋子排成一行、一列或一对角线的一方获胜。 为了实现三子棋游戏,我们需要按照如下步骤进行: 绘制棋盘 判断游戏是否结束 获取玩家输入 判断输入是否合法 落子并更新棋盘 判断…

    C 2023年5月23日
    00
  • windows下vscode使用cmake的方法

    下面是详细的讲解“Windows下VSCode使用CMake的方法”的完整攻略。 1. 安装环境 首先需要安装以下软件: Visual Studio Code CMake C/C++编译器 其中CMake和C/C++编译器可以使用MinGW-w64或者Visual Studio。 2. 创建CMake项目 在VSCode中打开一个空白的文件夹,然后使用以下命…

    C 2023年5月23日
    00
  • C++ 中lambda表达式的编译器实现原理

    我来详细讲解一下”C++中lambda表达式的编译器实现原理”的攻略。 什么是Lambda表达式 首先你需要了解什么是Lambda表达式。Lambda表达式是C++11引入的一个新特性,它可以用来创建匿名函数对象。Lambda表达式可以在任何需要函数对象的地方调用,如STL中的算法函数、标准库函数、GUI程序中的事件处理函数等等。 C++11引入Lambda…

    C 2023年5月23日
    00
  • C/S和B/S两种架构区别与优缺点分析

    C/S和B/S两种架构区别与优缺点分析 C/S架构 C/S架构即客户端/服务器架构,是一种常见的软件架构模式。C/S架构中,客户端负责与用户交互,服务器负责执行核心业务逻辑。C/S架构需要在客户端和服务器端分别安装软件,因此需要专业的IT技能来安装和维护。 优点 可以在本地运行一些比较复杂或计算密集的程序,提高了程序的执行效率。 远程协作能力较强,多个用户可…

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