| 
 | 
 
 
发表于 2021-12-16 19:10:23
|
显示全部楼层
 
 
 
main.c 
- #include "list.h"
 
 - #include <stdio.h>
 
  
- void output(const list_t *list, size_t index) {
 
 -     if(index >= list_size(list)) return;
 
 -     output(list, index + 1);
 
 -     int temp; list_get(list, index, &temp, sizeof(temp));
 
 -     printf("%d ", temp);
 
 - }
 
  
- int main(void) {
 
 -     list_t *list = list_init();
 
 -     for(size_t i = 0; i < 5; ++i) {
 
 -         int temp; scanf("%d", &temp);
 
 -         list_append(list, &temp, sizeof(temp));
 
 -     }
 
 -     output(list, 0); puts("");
 
 -     list_deinit(list);
 
 -     return 0;
 
 - }
 
 
  复制代码 
 
list.h 
- #ifndef _LIST_H_
 
 - #define _LIST_H_
 
  
- #include <stddef.h>
 
 - #include <stdbool.h>
 
  
- struct list_node_tag {
 
 -     void *data; size_t size;
 
 -     struct list_node_tag *next;
 
 - };
 
  
- typedef struct {
 
 -     struct list_node_tag *head;
 
 -     size_t size;
 
 - } list_t;
 
  
- list_t *list_init(void);
 
 - void list_deinit(list_t *list);
 
 - bool list_clean(list_t *list);
 
 - bool list_insert(list_t *list, size_t index, const void *data, size_t size);
 
 - bool list_delete(list_t *list, size_t index);
 
 - bool list_get(const list_t *list, size_t index, void *data, size_t size);
 
 - bool list_set(list_t *list, size_t index, const void *data, size_t size);
 
 - bool list_append(list_t *list, const void *data, size_t size);
 
 - size_t list_size(const list_t *list);
 
 - bool list_empty(const list_t *list);
 
  
- #endif
 
 
  复制代码 
 
list.c 
- #include "list.h"
 
 - #include <stdlib.h>
 
 - #include <memory.h>
 
  
- list_t *list_init(void) {
 
 -     list_t *list = malloc(sizeof(*list));
 
 -     if(!list) return NULL;
 
 -     list->head = NULL;
 
 -     list->size = 0;
 
 -     return list;
 
 - }
 
  
- void list_deinit(list_t *list) {
 
 -     if(!list) return;
 
 -     list_clean(list);
 
 -     free(list);
 
 - }
 
  
- bool list_clean(list_t *list) {
 
 -     if(!list) return false;
 
 -     while(!list_empty(list)) list_delete(list, 0);
 
 -     return true;
 
 - }
 
  
- bool list_insert(list_t *list, size_t index, const void *data, size_t size) {
 
 -     if(!list) return false;
 
 -     if(list_size(list) < index) return false;
 
 -     if(!data) return false;
 
 -     struct list_node_tag **current = &list->head;
 
 -     while(index--) current = &(*current)->next;
 
 -     struct list_node_tag *node = malloc(sizeof(*node));
 
 -     if(!node) return false;
 
 -     node->data = malloc(size);
 
 -     if(!node->data) {free(node); return false;}
 
 -     memcpy(node->data, data, size);
 
 -     node->size = size;
 
 -     node->next = *current;
 
 -     *current = node;
 
 -     ++list->size;
 
 -     return true;
 
 - }
 
  
- bool list_delete(list_t *list, size_t index) {
 
 -     if(!list) return false;
 
 -     if(list_size(list) <= index) return false;
 
 -     struct list_node_tag **current = &list->head;
 
 -     while(index--) current = &(*current)->next;
 
 -     struct list_node_tag *temp = *current;
 
 -     *current = temp->next;
 
 -     free(temp->data); free(temp);
 
 -     --list->size;
 
 -     return true;
 
 - }
 
  
- bool list_get(const list_t *list, size_t index, void *data, size_t size) {
 
 -     if(!list) return false;
 
 -     if(list_size(list) <= index) return false;
 
 -     if(!data) return false;
 
 -     struct list_node_tag *const *current = &list->head;
 
 -     while(index--) current = &(*current)->next;
 
 -     struct list_node_tag *temp = *current;
 
 -     if(temp->size > size) return false;
 
 -     memcpy(data, temp->data, temp->size);
 
 -     return true;
 
 - }
 
  
- bool list_set(list_t *list, size_t index, const void *data, size_t size) {
 
 -     bool res = list_delete(list, index);
 
 -     return res ? list_insert(list, index, data, size) : res;
 
 - }
 
  
- bool list_append(list_t *list, const void *data, size_t size) {
 
 -     if(!list) return false;
 
 -     return list_insert(list, list_size(list), data, size);
 
 - }
 
  
- size_t list_size(const list_t *list) {
 
 -     if(!list) return 0;
 
 -     return list->size;
 
 - }
 
  
- bool list_empty(const list_t *list) {
 
 -     if(!list) return true;
 
 -     return list_size(list) == 0;
 
 - }
 
 
  复制代码 
- $ gcc-debug -o main main.c list.c
 
 - $ ./main
 
 - 11 22 33 44 55
 
 - 55 44 33 22 11
 
 - $
 
  复制代码 |   
 
 
 
 |