线性表的实现

先上代码:

/*************************************************************************
	> File Name: 1.vector.cpp
	> Author:Gin.TaMa 
	> Mail:1137554811@qq.com 
	> Created Time: 2019年04月09日 星期二 19时03分27秒
 ************************************************************************/
#include<stdio.h>
#include<time.h>
#include<stdlib.h>

typedef struct Vector{
    int *data;// void* 来代表任意类型
    int size,length;
}Vector;

Vector *init(int n){
    Vector *p = (Vector*) malloc(sizeof(Vector));
    p -> data = (int *)malloc(sizeof(int)*n);
    p -> size = n;
    p -> length = 0;
    return p;
}

void clear(Vector *v){
    if(v == NULL)return;
    free(v -> data);
    free(v);
    return ;
}

// calloc 申请并赋值为0
// malloc 仅申请
// realloc 重新分配
// 字节大小
int expand(Vector *v){
    // 注意内存泄露
    int extra_size = v->size;
    int*p;
    // 申请内存多次逐步减少
    while(extra_size){
        p = (int* )realloc(v->data,sizeof(int) * (v->size + extra_size));
        if(p)break;
        extra_size /= 2;
    }
    if(extra_size == 0)return 0;
    v->data = p;
    v->size += extra_size;
    return 1;
}

// 先判断错误
int insert(Vector *v, int ind,int val){
    if(ind < 0 || ind > v->length)return 0;
    if(v->length == v->size){
        if(!expand(v)){
            return 0;
        }
    }
    for(int i = v->length - 1;i >= ind;i--){
       v->data[i+1] = v->data[i]; 
    }
    v->data[ind] = val;
    v->length += 1;
    return 1;
}

int erase(Vector *v,int ind){
    if(ind < 0 || ind >= v->length)return 0;
    for(int i = ind+1;i < v->length;i ++){
        v->data[i - 1] = v->data[i];
    }
    v->length --;
    return 1;
}

void output(Vector *v){
    printf("arr=[");
    for(int i = 0;i < v->length;i++){
        printf(" %d",v->data[i]);
    }
    printf("]\n");
    return;
}

int main(){
    #define MAX_OP 20
    int op,ind,val;
    Vector *v;
    v = init(MAX_OP);
    for(int i = 0;i < MAX_OP;i ++){
        op = rand() % 4;
        ind = rand() % (v->length + 3) - 1;
        val = rand() % 100;
        switch(op){
            case 0:
            case 1:
            case 2:{
                printf("insert %d to vector at %d = %d\n"
                       ,val,ind,insert(v,ind,val));
                output(v);
            }break;
            case 3:{
                printf("erase element at %d from vector = %d\n",ind,erase(v,ind));
                output(v);
            }break;
            default: fprintf(stderr,"wrong op %d\n",op);break;
        }
    }
    clear(v);

    return 0;
}

在这里有些需要注意的

  1. 注意每次进行完操作都要去更改数据的基本信息

  2. 关于realloc 的使用

    realloc 会先尝试扩展原来的空间,扩展失败就会去执行malloc 去申请一个新的空间

    如果申请成功,接下来会进行内存的拷贝,并使用free来释放原来的空间

    这里注意哈,free 和 delete 不能混用。。new 申请的由delete 删除, free malloc realloc 啥的不要和new delete 混用。

    如果失败就会返回null ,注意这个地方是有可能造成内存泄露的。。

    比如

    v->data = realloc(v->data,100)
    

    失败的情况下会 1.v->data 变成了空 2.原来的空间没有释放,而且找不到了。。

  3. 关于扩容操作是尝试申请到最大的能申请的空间。从原来的size一点点的变小,能申请多少申请多少。

  4. 如何优化一下查找呢,实现更快的查找。

    并行查找。。多开几个线程呗。