模仿c++的vector简易实现list的几个接口,初学者不妨来练习一下,由于直接上代码影响观看,我改成了截图,一起来看看吧!为了方便复现,我把全部代码单独放在最后,来试试吧!
1.头文件lis.h
2.源文件main.c
3.运行结果
4.函数实现list.c
5.结语
如果这篇博客帮助到您,记得点赞收藏哦!你的点赞和收藏是我更新的动力!!!想看更多C语言相关问题,关注我吧 !!!
6.全部代码
1.list.h
#include <assert.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define listData_t int
#define DEFAULT_CAPACITY 4
typedef struct {
listData_t *data;
size_t size;
size_t capacity;
} List;
void InitList(List *plist);
void DestoryList(List *plist);
void PrintList(const List *plist);
// list容量充足或者扩容成功返回1,满了并且扩容失败返回0
int CheckCapacity(List *plist, size_t insertSize);
void PushBack(List *plist, listData_t data);
void PopBack(List *plist);
void PushFront(List *plist, listData_t data);
void PopFront(List *plist);
void SortList(List *plist);
void RandomInsert(List *plist, size_t count, size_t maxNum);
// 找到数据返回该数据的索引(下标),找不到返回-1
int FindList(const List *plist, listData_t target);
void PosInsert(List *plist, int pos, listData_t data);
void PosErase(List *plist, int pos);
size_t ListSize(List *plist);
size_t ListCapacity(List *plist);
2.list.c
#include "list.h"
void InitList(List *plist) {
assert(plist);
listData_t *ptr = malloc(DEFAULT_CAPACITY * sizeof(listData_t));
if (ptr == NULL) {
printf("malloc fail!\n");
exit(-1);
}
plist->data = ptr;
plist->capacity = DEFAULT_CAPACITY;
plist->size = 0;
}
void DestoryList(List *plist) {
assert(plist);
free(plist->data);
plist->data = NULL;
plist->capacity = plist->size = 0;
}
int CheckCapacity(List *plist, size_t insertSize) {
assert(plist);
if (insertSize <= plist->capacity - plist->size) {
return 1;
}
if (insertSize > 1) {
listData_t *ptr = (listData_t *)realloc(
plist->data,
(insertSize + plist->capacity) * sizeof(listData_t));
if (ptr == NULL) {
printf("realloc fail!");
return 0;
}
plist->data = ptr;
plist->capacity = insertSize + plist->capacity;
return 1;
}
listData_t *ptr = (listData_t *)realloc(
plist->data, 2 * plist->capacity * sizeof(listData_t));
if (ptr == NULL) {
printf("realloc fail!");
return 0;
}
plist->data = ptr;
plist->capacity = 2 * plist->capacity;
return 1;
}
void PushBack(List *plist, listData_t data) {
assert(plist);
if (1 == CheckCapacity(plist, 1)) {
plist->data[plist->size] = data;
plist->size++;
}
}
void PopBack(List *plist) {
assert(plist);
if (plist->size > 0) {
plist->size--;
}
}
void PushFront(List *plist, listData_t data) {
assert(plist);
if (1 == CheckCapacity(plist, 1)) {
for (int i = plist->size - 1; i >= 0; i--) {
plist->data[i + 1] = plist->data[i];
}
plist->data[0] = data;
plist->size++;
}
}
void PopFront(List *plist) {
assert(plist);
for (int i = 0; i < plist->size; i++) {
plist->data[i] = plist->data[i + 1];
}
plist->size--;
}
void PrintList(const List *plist) {
assert(plist);
if (plist->size > 0) {
for (int i = 0; i < plist->size; i++) {
printf("%d ", plist->data[i]);
}
printf("\n");
} else {
printf("无数据!\n");
}
}
void SortList(List *plist) {
for (int i = 0; i < plist->size - 1; i++) {
int flag = 1;
for (int j = 0; j < plist->size - 1 - i; j++) {
if (plist->data[j] > plist->data[j + 1]) {
listData_t tmp = plist->data[j];
plist->data[j] = plist->data[j + 1];
plist->data[j + 1] = tmp;
flag = 0;
}
}
if (1 == flag) {
break;
}
}
}
void RandomInsert(List *plist, size_t count, size_t maxNum) {
assert(plist);
srand((unsigned int)time(NULL));
if (1 == CheckCapacity(plist, count)) {
for (int i = 0; i < count; i++) {
plist->data[i] = rand() % (maxNum + 1);
plist->size++;
}
}
}
int FindList(const List *plist, listData_t target) {
assert(plist);
for (int i = 0; i < plist->size; i++) {
if (target == plist->data[i]) {
return i;
}
}
return -1;
}
void PosInsert(List *plist, int pos, listData_t data) {
assert(plist);
assert(pos >= 0 && pos < plist->size);
if (1 == CheckCapacity(plist, 1)) {
for (int i = plist->size - 1; i >= pos; i--) {
plist->data[i + 1] = plist->data[i];
}
plist->data[pos] = data;
plist->size++;
}
}
void PosErase(List *plist, int pos) {
assert(plist);
assert(pos >= 0 && pos < plist->size);
for (int i = pos; i < plist->size; i++) {
plist->data[i] = plist->data[i + 1];
}
plist->size--;
}
size_t ListSize(List *plist) {
assert(plist);
return plist->size;
}
size_t ListCapacity(List *plist) {
assert(plist);
return plist->capacity;
}
3.main.c
#include "list.h"
int main(void) {
List list;
InitList(&list);
printf("list size:%zu\n", ListSize(&list));
printf("list capacity:%zu\n", ListCapacity(&list));
PrintList(&list);
RandomInsert(&list, 13, 9);
printf("bf:\n");
PrintList(&list);
SortList(&list);
printf("af:\n");
PrintList(&list);
PopBack(&list);
PopFront(&list);
PrintList(&list);
PushBack(&list, 1314);
PushFront(&list, 520);
PrintList(&list);
int index = FindList(&list, 6);
printf("index:%d\n", index);
if (-1 == index) {
printf("没有找到目标数据!\n");
} else {
PosInsert(&list, index, 888);
PrintList(&list);
PosErase(&list, index);
PrintList(&list);
}
printf("list size:%zu\n", ListSize(&list));
printf("list capacity:%zu\n", ListCapacity(&list));
PosErase(&list, ListSize(&list) - 1);
PosErase(&list, 0);
PrintList(&list);
printf("list size:%zu\n", ListSize(&list));
printf("list capacity:%zu\n", ListCapacity(&list));
DestoryList(&list);
return 0;
}