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--;
}
- c语言 ---- ArrayList实现
- c语言数组实现ArrayList部分函数
- ArrayList(c语言)
- C语言实现支持多类型的ArrayList
- 纯c实现ArrayList
- C语言简单模拟ArrayList
- 用C语言写一个数组,实现类似JAVA语言中ArrayList的功能
- java语言实现ArrayList,LinkedList,Heap,Stack
- C 实现泛型ArrayList数组
- 使用C实现类似Java ArrayList数据结构
- C#-ArrayList
- C#ArrayList
- C#-ArrayList
- C#ArrayList
- 数据结构(Java语言)——ArrayList简单实现
- Java语言解决约瑟夫环问题(ArrayList实现)
- *使用Java语言实现对ArrayList进行排序
- 链栈 C语言实现
- android stdio 之 jdk1.8
- 序列化、反序列化:serializable
- Android 之 Handler ,Looper机制详解
- 【MySQL】RHEL 6.5系统下安装MySQL 5.6.37(rpm方式)
- matlab2015中安装VLFeat库
- c语言 ---- ArrayList实现
- 谈谈Vue.js里v-if与v-show的区别
- Win10在磁盘中右键无响应问题
- poj1815(最小割点集)
- python字符串搜索与匹配
- 聚集索引 和 非聚集索引区别
- STM32学习笔记整理之(1)——MDK的设置
- HDU
- 装饰器之适配装饰器