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++读写文件流实例程序讲解

    C++读写文件流实例程序讲解 1. 概述 C++中,通过文件流(fstream)可以方便地进行文件读写操作。文件流不仅可以读写文本文件,还可以读写二进制文件。对于程序开发中需要处理的大量数据,文件读写操作显得尤为重要。 本文将详细讲解如何在C++中使用文件流进行文件读写操作。 2. 文件流的基本操作 C++文件流中,主要有三种文件流类型:ifstream、o…

    C 2023年5月23日
    00
  • 手把手教你如何一眼分辨是C还是C++

    手把手教你如何一眼分辨是C还是C++ 介绍 C和C++作为编程语言很相似,因此对于初学者来说有时很难分辨是C还是C++。本文将从语法、命名惯例和拓展名等方面进行详细讲解,帮助初学者一眼分辨是C还是C++。 语法 在语法方面,C与C++的区别不是很大,但有几个明显的区别,我们可以通过这些区别来分辨出它们所属的语言。 1. 头文件 C使用.h作为头文件拓展名,而…

    C 2023年5月23日
    00
  • C语言实现推箱子代码

    C语言实现推箱子代码完整攻略 1. 简介 推箱子,又称”推石头游戏”,是一种经典的益智游戏。在游戏中,玩家需要推动箱子到目标位置,从而完成关卡任务。现在我们就来详细讲解如何使用C语言实现一个推箱子游戏。 2. 攻略 2.1 游戏规则 在推箱子游戏中,游戏界面通常由一个二维地图构成,地图上包含玩家、箱子、目标位置和障碍物等元素,如下所示: ####### #*…

    C 2023年5月23日
    00
  • JSONP基础知识详解

    当在跨域请求数据时,由于浏览器的同源策略限制,一般会遇到跨域的问题。而JSONP作为一种解决跨域问题的方式,也被广泛应用在前端开发中。本文将详细讲解JSONP的相关知识和使用方法。 什么是JSONP? JSONP是JSON with Padding的缩写,即使用json数据,并使用JavaScript函数来执行该数据的回调的一种技术。JSONP不是官方的规范…

    C 2023年5月23日
    00
  • c语言连接mysql数据库的实现方法

    下面是详细讲解连接MySQL数据库的实现方法的完整攻略: 1. 安装MySQL C连接库 在连接MySQL数据库时,我们需要使用到MySQL C连接库,因此我们需要先安装该库。在Linux系统中,我们可以使用以下命令来安装: sudo apt install libmysqlclient-dev 在Windows系统中,我们需要从MySQL官网或源码中下载并…

    C 2023年5月23日
    00
  • C 递归

    C 递归的完整使用攻略 什么是递归 递归是一种常用的编程技巧,它使程序能够对自身进行调用。在递归函数中,函数会不断调用自身,并在每次调用中传递不同的参数,从而使函数能够对复杂的问题进行处理。 递归函数的特点 递归函数必须有一个基本情况,即结束递归的条件,否则会无限循环下去。 每次递归都会使问题规模缩小,直到达到基本情况为止。 递归函数需要调用自身,直到达到基…

    C 2023年5月10日
    00
  • C++实现单例模式的方法

    C++实现单例模式的方法可以通过以下两种方式实现: 1. 饿汉式单例模式 在饿汉式单例模式中,单例实例在程序启动时被立即初始化,它是线程安全的。具体实现如下: class Singleton { private: Singleton() {} static Singleton* m_instance; public: static Singleton* In…

    C 2023年5月23日
    00
  • C语言 模拟实现strlen函数详解

    C语言模拟实现strlen函数详解 1. 什么是strlen函数 strlen函数是C语言标准库中的一个字符串处理函数,该函数的作用是计算字符串的长度,即字符串中字符的个数(不包括字符串末尾的’\0’)。该函数的原型声明如下: size_t strlen(const char* str); 其中,str是待计算长度的字符串。返回值为字符串中字符的个数。 2.…

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