mirror of
https://gitee.com/apaki/unicstl.git
synced 2025-05-18 03:51:35 +08:00
359 lines
6.1 KiB
C
359 lines
6.1 KiB
C
|
|
#include "list.h"
|
|
|
|
|
|
#ifdef LINK_LIST
|
|
bool list_init(plist_t *list)
|
|
{
|
|
*list = (plist_t)malloc(sizeof(list_t));
|
|
if(*list == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
(*list)->data = (list_data_t)0;
|
|
(*list)->prev = *list;
|
|
(*list)->next = *list;
|
|
return true;
|
|
}
|
|
|
|
void list_destroy(plist_t *list)
|
|
{
|
|
if (*list != NULL)
|
|
{
|
|
list_clear(*list);
|
|
free(*list);
|
|
(*list)->prev = NULL;
|
|
(*list)->next = NULL;
|
|
*list = NULL;
|
|
}
|
|
}
|
|
|
|
bool list_empty(plist_t list)
|
|
{
|
|
return (list == NULL || (list->prev == list && list->next == list)) ? true : false;
|
|
}
|
|
|
|
void list_clear(plist_t list)
|
|
{
|
|
if(!list_empty(list))
|
|
{
|
|
plist_t p = list->next;
|
|
plist_t ptmp = p;
|
|
while(p != list)
|
|
{
|
|
ptmp = p;
|
|
p->prev->next = p->next;
|
|
p->next->prev = p->prev;
|
|
p = p->next;
|
|
|
|
// finally free memory
|
|
free(ptmp);
|
|
ptmp->prev = NULL;
|
|
ptmp->next = NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool list_insert_head(plist_t list, list_data_t data)
|
|
{
|
|
plist_t new_item;
|
|
if(list == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
new_item = (plist_t)malloc(sizeof(list_t));
|
|
if(new_item == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
new_item->data = data;
|
|
|
|
// insert from head
|
|
new_item->next = list->next;
|
|
new_item->prev = list->next->prev;
|
|
list->next->prev = new_item;
|
|
list->next = new_item;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool list_insert_tail(plist_t list, list_data_t data)
|
|
{
|
|
plist_t new_item;
|
|
if(list == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
new_item = (plist_t)malloc(sizeof(list_t));
|
|
if(new_item == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
new_item->data = data;
|
|
|
|
// insert from tail
|
|
new_item->prev = list->prev;
|
|
new_item->next = list->prev->next;
|
|
list->prev->next = new_item;
|
|
list->prev = new_item;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool list_delete(plist_t list, list_data_t data)
|
|
{
|
|
if(!list_empty(list))
|
|
{
|
|
plist_t p = list;
|
|
while(p->next != list)
|
|
{
|
|
p = p->next;
|
|
if(p->data == data)
|
|
{
|
|
// delete the item
|
|
p->prev->next = p->next;
|
|
p->next->prev = p->prev;
|
|
free(p);
|
|
p->prev = NULL;
|
|
p->next = NULL;
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
uint32_t list_count(plist_t list)
|
|
{
|
|
uint32_t count = 0;
|
|
if(!list_empty(list))
|
|
{
|
|
plist_t p = list;
|
|
while(p->next != list)
|
|
{
|
|
p = p->next;
|
|
count++;
|
|
}
|
|
}
|
|
return count;
|
|
}
|
|
|
|
void list_traversal_sequence(plist_t list, list_data_disp_t disp)
|
|
{
|
|
if(!list_empty(list))
|
|
{
|
|
plist_t p = list->next;
|
|
while(p != list)
|
|
{
|
|
disp(p->data);
|
|
p = p->next;
|
|
}
|
|
}
|
|
}
|
|
|
|
void list_traversal_reversed(plist_t list, list_data_disp_t disp)
|
|
{
|
|
if(!list_empty(list))
|
|
{
|
|
plist_t p = list->prev;
|
|
while(p != list)
|
|
{
|
|
disp(p->data);
|
|
p = p->prev;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
bool list_init(list_t list)
|
|
{
|
|
// list->capacity = 64;
|
|
list->capacity = 8;
|
|
|
|
list->size = 0;
|
|
list->extend_ratio = 2;
|
|
list->array = (list_data_t *)malloc(list->capacity * sizeof(list_data_t));
|
|
if (list->array == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void list_destory(list_t list)
|
|
{
|
|
if (list->array != NULL)
|
|
{
|
|
free(list->array);
|
|
}
|
|
}
|
|
|
|
int list_capacity(list_t list)
|
|
{
|
|
return list->capacity;
|
|
}
|
|
|
|
int list_size(list_t list)
|
|
{
|
|
return list->size;
|
|
}
|
|
|
|
bool list_empty(list_t list)
|
|
{
|
|
return list_size(list) == 0 ? true : false;
|
|
}
|
|
|
|
bool list_insert(list_t list, int index, list_data_t data)
|
|
{
|
|
assert(index >= 0 && index <= list_size(list));
|
|
if (list_size(list) == list_capacity(list))
|
|
{
|
|
int capacity = list->capacity * list->extend_ratio;
|
|
list_data_t * array = (list_data_t*)realloc(list->array, capacity * sizeof(list_data_t));
|
|
if (array == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
list->array = array;
|
|
list->capacity = capacity;
|
|
}
|
|
memmove(&list->array[index + 1], &list->array[index], list_size(list) * sizeof(list_data_t));
|
|
list->array[index] = data;
|
|
list->size += 1;
|
|
return true;
|
|
}
|
|
|
|
bool list_append(list_t list, list_data_t data)
|
|
{
|
|
if (list_size(list) == list_capacity(list))
|
|
{
|
|
int capacity = list->capacity * list->extend_ratio;
|
|
list_data_t * array = (list_data_t*)realloc(list->array, capacity * sizeof(list_data_t));
|
|
if (array == NULL)
|
|
{
|
|
return false;
|
|
}
|
|
list->array = array;
|
|
list->capacity = capacity;
|
|
}
|
|
list->array[list->size] = data;
|
|
list->size += 1;
|
|
return true;
|
|
}
|
|
|
|
int list_delete(list_t list, int index)
|
|
{
|
|
assert(index >= 0 && index < list_size(list));
|
|
int temp = 0;
|
|
temp = list->array[index];
|
|
if (index != list_size(list))
|
|
{
|
|
memmove(&list->array[index], &list->array[index + 1], (list_size(list) - 1 - index) * sizeof(list_data_t));
|
|
//for (int i = index; i < list_size(list) - 1; i++)
|
|
//{
|
|
// list->array[i] = list->array[i + 1];
|
|
//}
|
|
}
|
|
list->size -= 1;
|
|
return temp;
|
|
}
|
|
|
|
bool list_clear(list_t list)
|
|
{
|
|
memset(list->array, 0, list->size);
|
|
list->size = 0;
|
|
return true;
|
|
}
|
|
|
|
list_data_t list_get(list_t list, int index)
|
|
{
|
|
assert(index >= -list_size(list) && index < list_size(list));
|
|
return index >= 0 ? list->array[index] : list->array[list_size(list) + index];
|
|
}
|
|
|
|
bool list_set(list_t list, int index, list_data_t data)
|
|
{
|
|
assert(index >= 0 && index < list_size(list));
|
|
list->array[index] = data;
|
|
return true;
|
|
}
|
|
|
|
void list_print(list_t list)
|
|
{
|
|
if (!list_empty(list))
|
|
{
|
|
for (int i = 0; i < list_size(list); i++)
|
|
{
|
|
printf("%2d ", list->array[i]);
|
|
}
|
|
printf("\n");
|
|
}
|
|
}
|
|
|
|
void list_test(void)
|
|
{
|
|
int i = 0;
|
|
|
|
list_data_t data = 0;
|
|
struct _list list;
|
|
list_init(&list);
|
|
|
|
printf("----- append -----\n");
|
|
for (i = 0; i < 18; i++)
|
|
{
|
|
list_append(&list, i);
|
|
list_print(&list);
|
|
}
|
|
|
|
printf("----- delete -----\n");
|
|
list_delete(&list, 17);
|
|
list_print(&list);
|
|
|
|
list_delete(&list, 0);
|
|
list_print(&list);
|
|
|
|
list_delete(&list, 9);
|
|
list_print(&list);
|
|
|
|
printf("----- clear -----\n");
|
|
list_clear(&list);
|
|
printf("----- insert -----\n");
|
|
for (i = 0; i < 18; i++)
|
|
{
|
|
list_insert(&list, 0, i);
|
|
list_print(&list);
|
|
}
|
|
|
|
printf("----- get -----\n");
|
|
data = list_get(&list, 0);
|
|
printf("list[0] = %2d\n", data);
|
|
|
|
data = list_get(&list, 17);
|
|
printf("list[17] = %2d\n", data);
|
|
|
|
data = list_get(&list, 5);
|
|
printf("list[5] = %2d\n", data);
|
|
|
|
printf("----- like python -----\n");
|
|
data = list_get(&list, -1);
|
|
printf("list[-1] = %2d\n", data);
|
|
|
|
data = list_get(&list, -5);
|
|
printf("list[-5] = %2d\n", data);
|
|
|
|
data = list_get(&list, -18);
|
|
printf("list[-18] = %2d\n", data);
|
|
|
|
printf("----- set -----\n");
|
|
for (i = 0; i < 18; i++)
|
|
{
|
|
list_set(&list, i, i);
|
|
list_print(&list);
|
|
}
|
|
|
|
list_print(&list);
|
|
list_destory(&list);
|
|
}
|