本代码编辑在CLion环境上,若要复制代码运行起来需要修改一些地方。
代码分为 3 个部分,头文件 list.h, 实现头文件的 list.c 和 main.c 文件。
大部分代码都有注释,但是没有配合对应的图解,需要在读代码是自己构想。
代码纯手写,如有不足之处,请多指教
main.c 部分#includelist.h 部分#include "list.h" int main() { struct list* list = list_init(); list_add(list, 99); list_print(list); list_add(list, 78); list_insert(list, 0, 88); list_print(list); list_add(list, 100); list_print(list); int e; list_remove(list, 1, &e); list_print(list); printf("%d %dn", list_get(list, 1), list_get(list, 2)); list_set(list, 0, 5); list_print(list); list_free(list); return 0; }
// // Created by Sur qing on 2022/5/17. // #ifndef SEQUENCE_LIST_H #define SEQUENCE_LIST_H struct list; struct list* list_init(); void list_free(struct list* list); int list_count(struct list* list); void list_clear(struct list* list); int list_isEmpty(struct list* list); int list_contains(struct list* list, int e); int list_insert(struct list* list, int index, int e); void list_add(struct list* list, int e); int list_set(struct list* list, int index, int e); void list_remove(struct list* list, int index, int* e); int list_get(struct list* list, int index); void list_print(struct list* list); #endif //SEQUENCE_LIST_Hlist.c 部分
//
// Created by Sur qing on 2022/5/17.
//
#include
#include "stdlib.h"
#include "stdio.h"
#include "list.h"
#define INIT_SIZE 50
#define INCR_SIZE 50
// 定义 list 结构体
struct list {
int *data;
int size;
int count;
};
struct list* list_init() {
// 为 list 结构体分配内存
struct list* list = NULL;
list = (struct list*) malloc(sizeof(struct list));
assert(list != NULL);
// 将 list 结构体初始化
list->data = NULL;
list->data = (int*) calloc(INIT_SIZE, sizeof(int));
assert(list->data);
list->size = INIT_SIZE;
list->count = 0;
return list;
}
void list_free(struct list* list) {
assert(list);
// 释放指向数据的内存
free(list->data);
// 释放指向结构体的内存
free(list);
return;
}
int list_count(struct list* list) {
assert(list);
assert(list->count >= 0);
return list->count;
}
void list_clear(struct list* list) {
assert(list);
list->count = 0;
return;
}
int list_isEmpty(struct list* list) {
assert(list);
return list->count == 0;
}
int list_contains(struct list* list, int e) {
assert(list);
int i;
for (i = 0; i < list->count; i++) {
if (list->data[i] == e) return 1;
}
return 0;
}
int list_insert(struct list* list, int index, int e) {
assert(list);
// 如果 下标不合法,返回 0 表示插入失败
if (index < 0 || index > list->count) return 0;
// 如果链表已经存满,则需要增加内存
if (list->count >= list->size) {
int* temp = NULL;
temp = (int*) realloc(list->data, sizeof(int) * (list->size + INCR_SIZE));
assert(list);
list->data = temp;
// 别忘了更新 list 的大小
list->size += INCR_SIZE;
}
// 将index后面的元素往后移,为插入的元素腾出位置
int i;
for (i = list->count; i > index; i--) {
list->data[i] = list->data[i - 1];
}
list->data[index] = e;
list->count++;
// 返回 1 表示插入成功
return 1;
}
void list_add(struct list* list, int e) {
assert(list);
// 当在末尾添加元素时,数组满了的时候,调整内存大小,同 list_insert()
if (list->count >= list->size) {
int* temp = (int*) realloc(list->data, sizeof(int) * (list->size + INCR_SIZE));
list->data = temp;
list->size += INCR_SIZE;
}
list->data[list->count++] = e;
return;
}
int list_set(struct list* list, int index, int e) {
assert(list);
// 如果index无效,返回 0 表示设置失败
if (index < 0 || index > list->count) return 0;
list->data[index] = e;
return 1;
}
void list_remove(struct list* list, int index, int* e) {
assert(list);
// 如果index无效,返回 0 表示删除元素失败
if (index < 0 || index > list->count) return;
// 将删除后的元素值保存在 e 中
*e = list->data[index];
// 将index后面的元素往前移,填补删除后的空缺
int i;
for (i = index; i < list->count - 1; i++) {
list->data[i] = list->data[i + 1];
}
list->count--;
return;
}
int list_get(struct list* list, int index) {
assert(list);
assert(index >= 0 && index < list->count);
return list->data[index];
}
void list_print(struct list* list) {
assert(list);
int i;
for (i = 0; i < list->count - 1; i++) {
printf("%d, ", list->data[i]);
}
printf("%dn", list->data[list->count - 1]);
return;
}



