c语言 ---- ArrayList实现

来源:互联网 发布:warframe对网络要求 编辑:程序博客网 时间:2024/05/18 03:08

    c语言中,关于类似ArrayList的实现(动态数组);

优点:检索高效率;

缺点:插入/删除低效率;

注意:可存储任意类型的指针(非值存储)

/*************************************************************************

    > File Name: slist.h
    > Author: tangzs
    > Mail: 21349338@qq.com
    > Created Time: 2017年09月17日 星期日 22时16分07秒
 ************************************************************************/
#ifndef ____SLIST_H____
#define ____SLIST_H____

/*
 * 列表节点
 */
typedef struct {

    void *value; // 元素地址
} Node;

/*
 * 列表定义
 */
typedef struct {

    int size;    // 有效大小
    int buff_size;    // 当前数组大小
    Node *buff_array;    // 当前数组节点
} SList;

/*
 * 创建并初始化列表
 */
extern SList *slist_init(int init_size);

/*
 * 销毁列表
 */
extern void slist_free(SList *list);

/*
 * 向列表追加元素
 */
extern void slist_add(SList *list, void *value);

/*
 * 根据位置获取元素
 */
extern void *slist_get(SList *list, int index);

/*
 * 根据位置删除元素
 */
extern void slist_remove(SList *list, int index);

#endif


/*************************************************************************
    > File Name: slist.c
    > Author: tangzs
    > Mail: 21349338@qq.com
    > Created Time: 2017年09月17日 星期日 22时18分01秒
 ************************************************************************/
#include "slist.h"

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



extern SList *slist_init(int init_size) {

    SList *list = malloc(sizeof(SList));
    if (list == NULL) {
        perror("malloc slist error");
        exit(0);
    }
    list->size = 0;
    list->buff_size = init_size < 10? 10: init_size;
    list->buff_array = malloc(sizeof(Node) * list->buff_size);
    if (list->buff_array == NULL) {
        perror("malloc slist buff array error");
        exit(0);
    }
    return list;
}

extern void slist_free(SList *list) {

    free(list->buff_array);
    free(list);
}

extern void slist_add(SList *list, void *value) {

    if (list->size == list->buff_size) {
        list->buff_size = list->buff_size / 2 * 3 + 1;
        list->buff_array = realloc(list->buff_array, sizeof(Node) * list->buff_size);
    }
    (list->buff_array + list->size)->value = value;
    list->size++;
}

extern void *slist_get(SList *list, int index) {

    if (index < 0 || index >= list->size) {
        return NULL;
    }
    return (list->buff_array + index)->value;
}

extern void slist_remove(SList *list, int index) {

    if (index < 0 || index >= list->size) {
        return;
    }

    Node *array = list->buff_array;
    if (index < list->size-1) {
        while (index < list->size-1) {
            (array + index)->value = (array + index + 1)->value;
            index++;
        }
    }
    list->size--;
}

原创粉丝点击