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. 利用位运算提高效率 位运算是嵌入式开发中非常常见的操作,因为它可以大幅提高程序效率。以下是一些常见的位运算技巧: (1) 判断奇偶性 使用&运算符可以判断一个数是奇数还是偶数,比如: int x = 13; if (x & 1) { printf("x是奇数\n&quot…

    C 2023年5月23日
    00
  • angular指令笔记ng-options的使用方法

    下面我将详细讲解“angular指令笔记ng-options的使用方法”的完整攻略。首先,让我们来看一下ng-options的作用是什么。 什么是ng-options ng-options是AngularJS中的一条指令,它用于创建选项列表。在使用这个指令时,我们可以简单地通过设置相关的属性来定义可选项。ng-options指令通常与ng-model指令一起…

    C 2023年5月22日
    00
  • 超简单 如何一招隐藏本地磁盘(C/D/E…)

    超简单 如何一招隐藏本地磁盘(C/D/E…) 有时候我们需要隐藏本地磁盘,比如防止别人误操作或者保护隐私。本文将介绍如何一招隐藏本地磁盘。 方法 打开“运行”窗口(Win+R),输入“diskmgmt.msc”,打开磁盘管理工具。 找到要隐藏的磁盘,右键单击磁盘对应的图标,在下拉菜单中选择“更改驱动器号和路径…”选项,在弹出的窗口中点击“删除(D)”…

    C 2023年5月23日
    00
  • 基于Matlab制作一个不良图片检测系统

    下面是基于Matlab制作一个不良图片检测系统的完整攻略: 步骤1:数据准备 在制作不良图片检测系统之前,需要准备一些数据。首先需要准备一个包含正常图片和不良图片的数据集,这些图片最好都是经过标记的,以便后续的训练和测试。其次,还需要抽取这些图片的特征,这里我们使用的是灰度直方图特征和颜色直方图特征。 步骤2:特征提取 对于每一张图片,在计算其特征之前需要读…

    C 2023年5月23日
    00
  • 怎么在C++二进制文件中注入git信息详解

    下面是在C++二进制文件中注入git信息的完整攻略。 介绍 在C++开发中,我们经常需要借助版本控制工具Git来管理我们的项目代码,并且会在代码的开头注释中增加一些Git信息,如版本号、提交时间等。但是,这些Git信息只存在于代码中,如果我们需要将代码编译成二进制文件,如可执行文件或库文件,那么这些Git信息就无法被保留下来了。本教程将介绍如何在C++二进制…

    C 2023年5月23日
    00
  • C语言中如何进行数组操作?

    C语言中数组操作是开发过程中必须掌握的基础知识之一。本文将从定义数组、数组的初始化、数组的访问和遍历、数组的函数传递、数组的常用操作等几个方面详细介绍C语言中如何进行数组操作。 定义数组 定义数组时需要指定数组的数据类型、数组名称和数组长度。例如: int arr[10]; 以上代码定义了一个名为arr的整型数组,长度为10。 数组初始化 数组的初始化可以在…

    C 2023年4月27日
    00
  • 详解C++中的万能头文件

    好的。首先让我解释一下什么是万能头文件。 在C++中,头文件是开发者定义新类型、函数和变量的地方。当一个程序中需要使用某些函数或变量时,我们需要包含对应的头文件。万能头文件指的是一些包含了大量库函数和其他头文件信息的头文件,如: #include <iostream> #include <stdio.h> #include <s…

    C 2023年5月23日
    00
  • C语言执行程序时遇到的常见问题及解决

    C语言执行程序时遇到的常见问题及解决 C语言是一种非常流行的编程语言,但在执行程序时,常会遇到各种问题。下面我们来看一些常见问题及解决方案。 1. 编译错误 在编译程序时,我们可能会遇到各种编译错误,如语法错误、未定义的变量或函数等。解决这些错误需要仔细检查代码,并修改错误的部分。 示例: #include <stdio.h> int main(…

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