说明(2018-3-11 19:58:05):
1. 郝斌的数据结构视频。
2. 用C语言模拟了泛型集合的一部分常用方法。
3. 主要使用了指针的操作。
#include<stdio.h> #include<stdbool.h> #include<malloc.h> #pragma warning(disable:4996)//忽略VS2013警告 void init_arr(struct Arr *pArr, int length); bool append_arr(struct Arr * parr, int val); bool insert_arr(struct Arr *pArr, int pos, int val); bool delete_arr(); int get(); bool is_empty(struct Arr * pArr); bool is_full(struct Arr * pArr); void sort_arr(struct Arr *pArr); void show_arr(struct Arr * pArr); void reverse_arr(struct Arr * pArr); struct Arr { int * pBase;//存储数组中第一个元素的地址 int len; int cnt; }; void main() { struct Arr arr; init_arr(&arr, 6);//分配6个元素 int del_num;//用来保存删除的数字 append_arr(&arr, 2); append_arr(&arr, 10); append_arr(&arr, 8); append_arr(&arr, 3); append_arr(&arr, -5); append_arr(&arr, 0); show_arr(&arr); printf(" "); delete_arr(&arr, 1, &del_num); printf("删掉的值是%d ", del_num); //insert_arr(&arr, 0, 88); //sort_arr(&arr); reverse_arr(&arr); show_arr(&arr); system("pause"); } void init_arr(struct Arr *pArr, int length) { pArr->pBase = (int *)malloc(sizeof(int)*length); if (pArr->pBase == NULL) { printf("动态分配内存失败!"); exit(-1);//退出程序 } else { pArr->len = length; pArr->cnt = 0; } return; } bool is_empty(struct Arr * pArr) { if (pArr->cnt == 0) { return true; } else { return false; } } void show_arr(struct Arr * pArr) { if (is_empty(pArr)) { printf("数组为空!"); } else { for (int i = 0; i < pArr->cnt; i++) { printf("%d ", pArr->pBase[i]); } printf(" "); } } bool is_full(struct Arr * parr) { if (parr->cnt == parr->len) { return true; } else { return false; } } bool append_arr(struct Arr * parr, int val) { if (is_full(parr)) { return false; } else { parr->pBase[parr->cnt] = val; parr->cnt++; return true; } } bool insert_arr(struct Arr *pArr, int pos, int val) { if (is_full(pArr)) { printf("数组已满,无法插入"); return false; } else if (pos > pArr->cnt + 1 || pos <= 0) { printf("插入位置有误!"); return false; } else { //11,22,33,空,空,空 // 0, 1, 2, 3, 4, 5 pArr->cnt += 1; for (int i = pArr->cnt - 1; i >= pos; i--) { pArr->pBase[i] = pArr->pBase[i - 1]; } pArr->pBase[pos - 1] = val; return true; } } void sort_arr(struct Arr *pArr) { //2,10,8,3,-5,0冒泡排序 int t; for (int i = 0; i < pArr->cnt; i++) { for (int j = 0; j < pArr->cnt - i - 1; j++)//每次循环选出一个最大值放在最后,就不用再排它了 { if (pArr->pBase[j] > pArr->pBase[j + 1]) { t = pArr->pBase[j]; pArr->pBase[j] = pArr->pBase[j + 1]; pArr->pBase[j + 1] = t; } } } return; } bool delete_arr(struct Arr * pArr, int pos, int * del_num) { *del_num = pArr->pBase[pos - 1]; if (pos > 0 && pos <= pArr->cnt) { for (int i = pos - 1; i < pArr->cnt; i++) { pArr->pBase[i] = pArr->pBase[i + 1]; } pArr->cnt--; return true; } else { printf("该位置不存在元素 "); } } void reverse_arr(struct Arr * pArr) { int t; for (int i = 0; i < pArr->cnt / 2; i++) { t = pArr->pBase[i]; pArr->pBase[i] = pArr->pBase[pArr->cnt - i - 1]; pArr->pBase[pArr->cnt - i - 1] = t; } return; }