仿c++的vector简单实现

来源:互联网 发布:php socket编程 断开 编辑:程序博客网 时间:2024/06/07 03:54

学到数据结构了,所以想写点什么,以后回来看看,因为刚开始学,所以就写了个仿vector的程序吧。。没有c++的强大,这个vector是特定的类型,针对int的= =改改就好了。。

/*************************************************************************    > File Name: vector.c    > Author: Netcan    > Mail: 1469709759@qq.com     > Created Time: 2014/12/8 15:52:07 ************************************************************************/#include<stdio.h>#include<malloc.h>#include<string.h>#include<time.h>typedef struct vector {int * pBase;  //数组元素首地址int growfact; //增长因子int cnt; //当前有效元素个数int len; // 数组最大长度} vector;bool initV(vector * v); // 初始化vectorvoid freeV(vector *v); // 释放vectorvoid showV(vector * v); // 输出vectorvoid showCntV(vector *v); // 显示有效元素个数void insertV(vector *v,int pos,int val); // 插入val到vector[pos-1]中void appendV(vector *v,int val); // 往vector后追加元素bool is_fullV(vector *v); // 检测vector是否满了bool is_emptyV(vector *v);// 检测vector是否为空void inversionV(vector *v); // 倒置vectorvoid sortV(vector *v); // 冒泡排序vectorint getVEle(vector *v,int pos); // 获取vector[pos-1]int getVSize(vector *s); // 获取vector大小int main() {srand(int(time(0)));vector v;initV(&v);for(int i=0;i<50;i++)appendV(&v,rand()%100); // 测试追加和自动增长内存printf("vector size: %d\n", getVSize(&v));showV(&v); // 测试输出puts("inversion vector");inversionV(&v); // 测试倒置showV(&v);puts("sort vector");sortV(&v); // 测试排序showV(&v);puts("find vector element");printf("vector[2]=%d\n",getVEle(&v,3)); // 测试获取元素freeV(&v); // 释放vectorreturn 0;}bool initV(vector *v){v->growfact = 5; // 默认增长因子为5v->cnt = 0;v->len = v->growfact; if( NULL == (v->pBase = (int *)malloc(sizeof(int) * v->len))) {puts("malloc error");return false;}}void freeV(vector *v){free(v->pBase);}bool is_emptyV(vector *v){if( v->cnt == 0)return true;elsereturn false;}bool is_fullV(vector *v){if(v->cnt == v->len )return true;elsereturn false;}void showV(vector * v){if(is_emptyV(v) ) {puts("vector empty");return;}for(int i=0;i<v->cnt;++i)printf("%d ",v->pBase[i]);puts("");}void appendV(vector *v, int val){if(is_fullV(v)) {puts("vector full,automatic grow space.");int * pNew = (int *)malloc(sizeof(int) * (v->len + v->growfact)); // 扩展内存if(memcpy(pNew, v->pBase, sizeof(int) * v->len) == NULL ){ //复制内存puts("vector grow space falut");return;}else{v->len += v->growfact;free(v->pBase); // 删除原内存v->pBase = pNew; // 指向新内存puts("vector grow space success");}}v->pBase[v->cnt++] = val;}void insertV(vector *v,int pos,int val){if(is_fullV(v)) {puts("vector full");return;}if( pos < 1 || pos > v->cnt) {puts("insert error"); return;}for(int i=v->cnt-1;i>=pos-1;i--)v->pBase[i+1]=v->pBase[i];v->pBase[pos-1]=val;v->cnt++;}void showCntV(vector *v){printf("vector cnt: %d\n",v->cnt);}void inversionV( vector * v){if(is_emptyV(v) ) {puts("vector empty");return;}for(int i=0;i<v->cnt/2;++i) {int t=v->pBase[i];v->pBase[i] = v->pBase [v->cnt - i -1];v->pBase[v->cnt - i -1] = t;}}void sortV(vector *v){if(is_emptyV(v) ) {puts("vector empty");return;}for(int i=0;i<v->cnt;++i)for(int j=i+1;j<v->cnt;++j)if(v->pBase[i] > v->pBase[j]){int t=v->pBase[i];v->pBase[i]=v->pBase[j];v->pBase[j]=t;}}int getVEle(vector *v,int pos){if( pos < 1 || pos > v->cnt ) {printf("Outside the range finding\n");return 0;}return v->pBase[pos-1];}int getVSize( vector *v){return v->len;}


0 0