C语言练手之list(列表)简易实现

模仿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;
}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值