2007-07-15
c实现的vector
关键字: 数据结构,vectorvector.h
c 代码
- #ifndef __VECTOR_H__
- #define __VECTOR_H__
- /////////////////////////////////////
- //
- typedef struct vecElem{
- int n;
- }vecElem;
- int vecElem_equal(const vecElem * plelem, const vecElem *prelem);
- void vecElem_print(const vecElem * pelem);
- /////////////////////////////////////
- typedef void *vector_t;
- typedef const void *const_vector_t;
- vector_t vector_new();
- void vector_make_empty(vector_t vec);
- void vector_destroy(vector_t vec);
- int vector_size(const_vector_t vec);
- int vector_is_empty(const_vector_t vec);
- int vector_equal(const_vector_t lvec, const_vector_t rvec);
- //成功返回1,失败返回0;
- int vector_resize(vector_t vec, int n, const vecElem *val);
- int vector_reserve(vector_t vec, int n);
- const vecElem *vector_index(const_vector_t vec, int n);
- const vecElem *vector_front(const_vector_t vec);
- const vecElem *vector_back(const_vector_t vec);
- int vector_insert(vector_t vec, int n, const vecElem *);
- int vector_remove(vector_t vec, int n);
- int vector_pop_back(vector_t vec);
- int vector_push_back(vector_t vec, const vecElem *pelem);
- void vector_print(const_vector_t vec);
- #endif
vector.c --
c 代码
- #include "vector.h"
- #include
- #include
- #include
- ///////////////////////////////////////////
- //用户可以自己修改具体实现
- int vecElem_equal(const vecElem * plelem, const vecElem *prelem)
- {
- if (plelem ->n == prelem ->n)
- return 1;
- else
- return 0;
- }
- void vecElem_print(const vecElem * pelem)
- {
- if (pelem)
- printf("%d",pelem->n);
- }
- ///////////////////////////////////////////////
- #define CAPACITY 12
- #define MULTIPLE 2
- typedef struct _vector_t{
- vecElem *data;
- int size;
- int capacity;
- }_vector_t;
- vector_t vector_new()
- {
- _vector_t * pv = (_vector_t *)malloc(sizeof(_vector_t));
- if (pv == NULL)
- return NULL;
- pv->data = (vecElem *)malloc(sizeof(vecElem) * CAPACITY);
- if(pv->data == NULL)
- {
- free(pv);
- return NULL;
- }
- pv->capacity = CAPACITY;
- pv->size = 0;
- return (vector_t)pv;
- }
- void vector_make_empty(vector_t vec)
- {
- _vector_t *pv = (_vector_t *)vec;
- if (pv->size > 0)
- {
- free(pv->data);
- pv->size = 0;
- }
- }
- void vector_destroy(vector_t vec)
- {
- _vector_t *pv = (_vector_t *)vec;
- if (pv)
- {
- vector_make_empty(pv);
- free(pv);
- }
- }
- int vector_size(const_vector_t vec)
- {
- const _vector_t * pv = (const _vector_t *)vec;
- return pv -> size;
- }
- int vector_is_empty(const_vector_t vec)
- {
- const _vector_t *pv = (const _vector_t *)vec;
- if (pv->size == 0)
- return 1;
- else
- return 0;
- }
- int vector_equal(const_vector_t lvec, const_vector_t rvec)
- {
- const _vector_t *first = (const _vector_t *)lvec;
- const _vector_t *second = (const _vector_t *)rvec;
- int i;
- if (first->size != second->size)
- return 0;
- if(first == second)
- return 1;
- for(i = 0; i < first->size; i++)
- if (!vecElem_equal(first->data+i, second->data+i))
- return 0;
- return 1;
- }
- //如果新的size 小于0,或者要填充的val指向NULL,那么resize出现错误,
- //返回0, 其他情况,将val指向的结构拷贝到增加的单元中,但如果新的size
- //小于原来的size,只将size改变就可以了,然后返回1;
- int vector_resize(vector_t vec, int n, const vecElem *val)
- {
- _vector_t *pv = (_vector_t *)vec;
- int i;
- int step = n - pv->size;
- if(n < pv->size && n >= 0)
- {
- pv->size = n;
- return 1;
- }else if(n < 0)
- return 0;
- if (!val)
- return 0;
- if(n > pv->capacity)
- vector_reserve(pv, n * MULTIPLE);
- for(i=0; i< step; i++)
- {
- vector_push_back(pv, val);
- }
- return 1;
- }
- int vector_reserve(vector_t vec, int n)
- {
- _vector_t *pv = (_vector_t *)vec;
- vecElem *oldArray;
- if(n < pv->size)
- return 0;
- if(pv->capacity == 0)
- pv->data=(vecElem *)malloc(sizeof(vecElem) * n);
- else{
- oldArray = pv->data;
- pv->data =(vecElem *)malloc(sizeof(vecElem) * n);
- if(pv->data==NULL)
- return 0;
- memcpy(pv->data,oldArray,sizeof(vecElem)*(pv->capacity));
- free(oldArray);
- }
- pv->capacity=n;
- return 1;
- }
- const vecElem *vector_index(const_vector_t vec, int n)
- {
- const _vector_t *pv = (const _vector_t *)vec;
- if(n > pv->size || n<1)
- return NULL;
- else
- return pv->data+n-1;
- }
- const vecElem *vector_front(const_vector_t vec)
- {
- return vector_index(vec, 1);
- }
- const vecElem *vector_back(const_vector_t vec)
- {
- const _vector_t *pv = (const _vector_t *)vec;
- return vector_index(vec, pv->size);
- }
- int vector_insert(vector_t vec, int n, const vecElem *newdata)
- {
- _vector_t *pv = (_vector_t *)vec;
- int ret;
- if(n > pv->size +1 || n < 1)
- return 0;
- if(pv->size >= pv->capacity)
- {
- if(pv->capacity == 0)
- ret = vector_reserve(pv,CAPACITY);
- else
- ret = vector_reserve(pv,pv->capacity * MULTIPLE);
- if(ret == 0)
- return 0;
- }
- if(n != pv->size + 1 )
- memmove(pv->data+n,pv->data+n-1,sizeof(vecElem)*(pv->size-n+1));
- pv->data[n-1] = *newdata;
- pv->size++;
- return 1;
- }
- int vector_remove(vector_t vec, int n)
- {
- _vector_t *pv = (_vector_t *)vec;
- if(n > pv->size || n < 1)
- return 0;
- if(n != pv->size)
- memmove(pv->data+n-1,pv->data+n,sizeof(vecElem)*(pv->size-n));
- pv->size--;
- return 1;
- }
- int vector_pop_back(vector_t vec)
- {
- _vector_t *pv = (_vector_t *)vec;
- return vector_remove(pv, pv->size);
- }
- int vector_push_back(vector_t vec, const vecElem *pelem)
- {
- _vector_t *pv = (_vector_t *)vec;
- return vector_insert(pv,pv->size + 1,pelem);
- }
- void vector_print(const_vector_t vec)
- {
- const _vector_t *pv = (const _vector_t *)vec;
- int i;
- printf("vector:\n");
- printf("size is :%d\n",pv->size);
- printf("capacity is: %d\n",pv->capacity);
- for(i =0;isize;i++)
- {
- vecElem_print(pv->data+i);
- printf("\n");
- }
- }
发表评论
- 浏览: 59008 次
- 性别:

- 来自: 乌托邦

- 详细资料
搜索本博客
最近加入圈子
链接
最新评论
-
基于web的项目管理,还需 ...
我要说楼主你这一套很不实用不符合XP精神
-- by Joo -
基于web的项目管理,还需 ...
我能想到的就是:再加一个maven的reporsitory服务器(如果项目中要使 ...
-- by pipilu -
【团队管理】大家Have A ...
你分配任务的时候有询问过他们的意见吗? 你在总结的时候有说个人的优点吗? ...
-- by alanwu -
基于web的项目管理,还需 ...
svn,ftp需要服务器,自己架的话还需要维护,麻烦 trac呢无法集成到我们的 ...
-- by xombat -
基于web的项目管理,还需 ...
汗你的团员会用你的工具工作么?怎么看也是手动svn,ftp,白板,纸条方便 一些 ...
-- by 抛出异常的爱






评论排行榜