UP
This commit is contained in:
43
lib/src/list/array.cpp
Normal file
43
lib/src/list/array.cpp
Normal file
@@ -0,0 +1,43 @@
|
||||
#include <cstdlib>
|
||||
#include "array.h"
|
||||
|
||||
|
||||
void insert(int *nums, int size, int num, int index) {
|
||||
// 把索引 index 以及之后的所有元素向后移动一位
|
||||
for (int i = size - 1; i > index; i--) {
|
||||
nums[i] = nums[i - 1];
|
||||
}
|
||||
// 将 num 赋给 index 处的元素
|
||||
nums[index] = num;
|
||||
}
|
||||
|
||||
void removeItem(int *nums, int size, int index) {
|
||||
// 把索引 index 之后的所有元素向前移动一位
|
||||
for (int i = index; i < size - 1; i++) {
|
||||
nums[i] = nums[i + 1];
|
||||
}
|
||||
}
|
||||
|
||||
int find(int *nums, int size, int target) {
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (nums[i] == target)
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* 扩展数组长度 */
|
||||
int *extend(int *nums, int size, int enlarge) {
|
||||
// 初始化一个扩展长度后的数组
|
||||
int *res = (int *) malloc(sizeof(int) * (size + enlarge));
|
||||
// 将原数组中的所有元素复制到新数组
|
||||
for (int i = 0; i < size; i++) {
|
||||
res[i] = nums[i];
|
||||
}
|
||||
// 初始化扩展后的空间
|
||||
for (int i = size; i < size + enlarge; i++) {
|
||||
res[i] = 0;
|
||||
}
|
||||
// 返回扩展后的新数组
|
||||
return res;
|
||||
}
|
285
lib/src/list/list.cpp
Normal file
285
lib/src/list/list.cpp
Normal file
@@ -0,0 +1,285 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "list.h"
|
||||
|
||||
void list_init(List *list) {
|
||||
list->head = NULL;
|
||||
list->tail = NULL;
|
||||
list->len = 0;
|
||||
}
|
||||
|
||||
bool list_is_empty(List *list) {
|
||||
return (list->head == NULL);
|
||||
}
|
||||
|
||||
static struct node *make_node(void *data) //把用户传递过来的数据打包为一个链表节点
|
||||
{
|
||||
struct node *n;
|
||||
|
||||
n = (struct node *) malloc(sizeof(struct node));
|
||||
assert(n != NULL);
|
||||
|
||||
n->next = NULL;
|
||||
n->data = data;
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
void list_insert_at_head(List *list, void *data) //头插法
|
||||
{
|
||||
struct node *n;
|
||||
n = make_node(data);
|
||||
|
||||
if (list->head == NULL) { //如果是空链表
|
||||
list->head = n;
|
||||
list->tail = n;
|
||||
} else { //如果不是非空链表
|
||||
n->next = list->head;
|
||||
list->head = n;
|
||||
}
|
||||
list->len++;
|
||||
}
|
||||
|
||||
void list_insert_at_index(List *list, void *data, long index) //定插法
|
||||
{
|
||||
long i = 1; //从1开始算
|
||||
struct node *p, *n;
|
||||
|
||||
p = list->head;
|
||||
|
||||
while (p && i < index) {
|
||||
p = p->next;
|
||||
i++;
|
||||
}
|
||||
|
||||
if (p) { //如果链表遍历完了,计数i还没到index,说明第index个节点不存在。
|
||||
n = make_node(data);
|
||||
n->next = p->next;
|
||||
p->next = n;
|
||||
list->len++;
|
||||
}
|
||||
}
|
||||
|
||||
void list_insert_at_tail(List *list, void *data) //尾插法
|
||||
{
|
||||
struct node *n;
|
||||
n = make_node(data);
|
||||
|
||||
if (list_is_empty(list)) { //如果是空链表
|
||||
list->head = n;
|
||||
list->tail = n;
|
||||
} else { //如果不是非空链表
|
||||
list->tail->next = n;
|
||||
list->tail = n;
|
||||
}
|
||||
list->len++;
|
||||
}
|
||||
|
||||
//void list_insert(List *list, void *data) //默认采用尾插法
|
||||
//{
|
||||
//#if 0
|
||||
// list_insert_at_tail(list, data);
|
||||
//#else
|
||||
// struct node *n;
|
||||
// n = make_node(data);
|
||||
// if(list->head == NULL){
|
||||
// list->head = n;
|
||||
// list->tail = n;
|
||||
// } else {
|
||||
// list->tail->next = n;
|
||||
// list->tail = n;
|
||||
// }
|
||||
// list->len++;
|
||||
//#endif
|
||||
//}
|
||||
|
||||
|
||||
void list_insert(List *list, void *data) {
|
||||
struct node *n;
|
||||
|
||||
n = make_node(data);
|
||||
|
||||
if (list->head == NULL) {
|
||||
list->head = n;
|
||||
list->tail = n;
|
||||
} else {
|
||||
list->tail->next = n;
|
||||
list->tail = n;
|
||||
}
|
||||
list->len++;
|
||||
}
|
||||
|
||||
void *list_delete(List *list, void *key, int (*compare)(const void *, const void *)) {
|
||||
void *data;
|
||||
struct node *n, *t;
|
||||
n = list->head;
|
||||
|
||||
if (!compare(n->data, key)) { //如果要删除的节点为首节点
|
||||
t = n;
|
||||
data = n->data;
|
||||
list->head = n->next;
|
||||
free(t);
|
||||
list->len--;
|
||||
return data;
|
||||
}
|
||||
|
||||
while (n->next != NULL) { //遍历查找符合条件的节点,删除之
|
||||
if (compare(n->next->data, key) == 0) { //只删除第一个符合条件的节点。
|
||||
t = n->next;
|
||||
if (n->next == list->tail) {
|
||||
list->tail = n;
|
||||
}
|
||||
n->next = n->next->next;
|
||||
data = t->data;
|
||||
free(t);
|
||||
list->len--;
|
||||
return data; //把删除的数据返回给用户,供用户后续的处理使用。
|
||||
}
|
||||
n = n->next;
|
||||
}
|
||||
return NULL; //没找到匹配的节点,返回NULL
|
||||
}
|
||||
|
||||
void *list_search(List *list, void *key, int (*compare)(const void *, const void *)) {
|
||||
struct node *n;
|
||||
n = list->head;
|
||||
|
||||
while (n) {
|
||||
if (!compare(n->data, key)) { //找到了,返回找到的数据
|
||||
return n->data;
|
||||
}
|
||||
n = n->next;
|
||||
}
|
||||
|
||||
return NULL; //找不到,返回NULL
|
||||
}
|
||||
|
||||
static struct node *find_min_node(List *list,
|
||||
int (*compare)(const void *, const void *)) {
|
||||
struct node *min, *n;
|
||||
|
||||
n = list->head;
|
||||
min = list->head;
|
||||
|
||||
while (n) {
|
||||
if (compare(min->data, n->data) > 0) {
|
||||
min = n;
|
||||
}
|
||||
n = n->next;
|
||||
}
|
||||
|
||||
return min;
|
||||
}
|
||||
|
||||
static void delete_node(List *list, struct node *key) {
|
||||
struct node *n;
|
||||
|
||||
n = list->head;
|
||||
|
||||
if (n == key) {
|
||||
list->head = n->next;
|
||||
return;
|
||||
}
|
||||
|
||||
while (n->next) {
|
||||
if (n->next == key) {
|
||||
if (key == list->tail) {
|
||||
list->tail = n;
|
||||
}
|
||||
n->next = n->next->next;
|
||||
return;
|
||||
}
|
||||
n = n->next;
|
||||
}
|
||||
}
|
||||
|
||||
static void insert_node(List *list, struct node *key) {
|
||||
if (list->head == NULL) {
|
||||
list->head = key;
|
||||
list->tail = key;
|
||||
} else {
|
||||
list->tail->next = key;
|
||||
list->tail = key;
|
||||
}
|
||||
}
|
||||
|
||||
void list_sort(List *list,
|
||||
int (*compare)(const void *, const void *)) {
|
||||
List tmp;
|
||||
struct node *n;
|
||||
|
||||
list_init(&tmp);
|
||||
|
||||
while (!list_is_empty(list)) {
|
||||
n = find_min_node(list, compare);
|
||||
delete_node(list, n);
|
||||
n->next = NULL;
|
||||
insert_node(&tmp, n);
|
||||
}
|
||||
list->head = tmp.head;
|
||||
list->tail = tmp.tail;
|
||||
}
|
||||
|
||||
void list_traverse(List *list, void (*handle)(void *)) {
|
||||
struct node *p;
|
||||
p = list->head;
|
||||
|
||||
while (p) {
|
||||
handle(p->data);
|
||||
p = p->next;
|
||||
}
|
||||
}
|
||||
|
||||
void list_reverse(List *list) {
|
||||
struct node *pre = NULL, *next, *p = list->head;
|
||||
|
||||
list->tail = list->head; //tail指向head;
|
||||
while (p) {
|
||||
next = p->next;
|
||||
if (!next) { //当p->next为最后一个节点时,让head指向p->next
|
||||
list->head = p;
|
||||
}
|
||||
//记录当前节点为pre,作为下一个节点的next.第一个节点为NULL,初始化时已定义。
|
||||
p->next = pre;
|
||||
pre = p;
|
||||
p = next;
|
||||
}
|
||||
}
|
||||
|
||||
long list_get_lenth(List *list) {
|
||||
return (list->len);
|
||||
}
|
||||
|
||||
void *list_get_element(List *list, int idx) {
|
||||
int i = 1;
|
||||
struct node *n;
|
||||
n = list->head;
|
||||
|
||||
while (n && i < idx) {
|
||||
i++;
|
||||
n = n->next;
|
||||
}
|
||||
|
||||
if (n) {
|
||||
return n->data;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void list_destroy(List *list, void (*destroy)(void *)) {
|
||||
list->len = 0;
|
||||
struct node *n, *t;
|
||||
n = list->head;
|
||||
|
||||
while (n) {
|
||||
t = n->next; //t只起一个记录n->next的功能,否则后面把n free掉之后,就找不到n->next了。
|
||||
if (destroy) { //传递用户自定义的数据处理函数,为0时不执行
|
||||
destroy(n->data); //使用用户提供的destroy函数来释放用户传递过来的数据。
|
||||
}
|
||||
free(n);
|
||||
n = t; //把n free掉之后,再把t给n,相当于把n->next给n,如此循环遍历链表,挨个删除,
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user