在C语言环境下,编写自己的Vector容器。

本文深入探讨如何在C语言环境中,从零开始编写一个功能完善的Vector容器。内容包括动态内存管理、元素添加与删除、容量调整等关键实现细节,旨在帮助读者理解数据结构与内存操作。
摘要由CSDN通过智能技术生成

 

                在C语言环境下,编写自己的Vector容器。
 
由 王宇 原创并发布 
 
       最近工作中,需要用标准C去实现一些统计数据的功能。开发过程中没有容器非常不方便,所以自己尝试着编写了一个简单的Vector容器。
 
一、功能说明:
 
     通过一个例子来说明如何使用这个Vector:
#include "containers.h"
#include <stdio.h>
// 测试用的结构体
typedef struct tagTextStruct
{
             int key;
             char* value;
}TestStruct;
 
// 失败提示函数
static void ABORT( char *file,int line)
{
             fprintf(stderr ,"*****\n\nABORT\nFile %s Line %d\n**********\n\n",file,line);
             abort();
}
#define Abort () ABORT(__FILE__,__LINE__)
 
// 摧毁资源
static int destructorFunc( void *v)
{     
            // 获得Vector中的一个元素
            TestStruct* ts = (TestStruct*)v;
             if(ts->value != NULL )
            {
                         int l = strlen (ts->value);
                         // 释放内存
                         free(ts->value);
                        ts->value = NULL;
            }
 
             return 0;          
}
 
// 遍历并打印Vector中的元素
static void PrintVector(Vector *AL)
{
            size_t i;
            TestStruct* ts;
              // 打印Vector中已有元素,和总容量
             printf("Count %ld, Capacity %ld\n",(long)iVector. Size(AL),(long )iVector.GetCapacity(AL));
              // 遍历Vector
             for (i=0; i<iVector.Size (AL);i++) {
                         // 获得Vector中的元素
                        ts = (TestStruct*)iVector. GetElement(AL, i);
                        
                         printf("%d\n" ,ts->key);
                         printf("%s\n" ,ts->value);
            }
 
             printf("\n" );
}
 
 
// 测试Vector
static int testVector(Vector** AL)
{
             int errors=0;
             char* s1 = "ts1 value." ;
             char* s2 = "ts2 value" ;
             char* temp1 = NULL ;
             char* temp2 = NULL ;
            TestStruct ts1, ts2;
            
            *AL = iVector. Create(sizeof (TestStruct),5);
           // 配置摧毁资源的回调函数,这里的destructorFunc是一个指针函数。
            iVector. SetDestructor(*AL, destructorFunc );
            
           // 初始化元素,并分配堆空间
            ts1.key = 1;
            temp1 = ( char*)malloc (strlen(s1) + 1);
            if(temp1 == NULL)
           {
               Abort();
           }
            strcpy(temp1, s1);
            ts1.value = temp1;
 
            ts2.key = 2;
            temp2 = ( char*)malloc (strlen(s2) + 1);
            if(temp2 == NULL)
            {
                    Abort();
              }
             strcpy(temp2, s2);
            ts2.value = temp2;
           // 将元素加入到Vecotor中
            iVector. Add(*AL,&ts1);
            iVector. Add(*AL,&ts2);
            // 删除一个Vector
            iVector. Erase(*AL, &ts1);
 
            // 获得容器中的实际大小
             if (1 != iVector.Size (*AL))
                         Abort();
 
             return errors;
}
 
// 主程序入口
int main (void)
{
             int errors=0;
            Vector* AL = NULL;
             // 测试Vector
            errors += testVector (&AL);
            // 释放Vector
             iVector.Finalize(*AL);
 
             return errors;
}
   
 
 
 
二、Vector的结构:
 
   
声明Vector类型:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值