順序表各種操作的代碼實現

順序表

定義

typedef strcut Vector {
    int *data; 
    int length;
    int size;
}Vector; 

初始化

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

釋放空間

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

插入

int insert(Vector *v, int ind, int val) {
    if(v == NULL) return 0;
    if(ind < 0 || ind > v->length) {
        return 0;
    }
    if(v->size == v->length) {
        if(!expand(v)) return 0;
        printf("expand Vector success = (%d)\n", v->size);
    }
    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(v == NULL) return 0;
    if(ind < 0 || ind >= v->length) return 0;
    for(int i = ind + 1;i <= v->length - 1; i++) {
        v->data[i - 1] = v->data[i];
    }
    v->length -= 1;
    return 1;
}

擴容

int expand(Vector *v){
    int extr_size = v->size;
    int *p;
    while(extr_size) {
        p = (int *)realloc(v->data,sizeof(int )*(v->size + extr_size) );
        if(p) break;
        extr_size /= 2;
    }
    if(p == NULL) return 0;
    v->size += extr_size;
    v->data = p;
    return 1;
}

代碼綜合

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

typedef struct Vector{
    int *data;
    int length, size;
}Vector;

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

int expand(Vector *v){
    int extr_size = v->size;
    int *p;
    while(extr_size) {
        p = (int *)realloc(v->data,sizeof(int )*(v->size + extr_size) );
        if(p) break;
        extr_size /= 2;
    }
    if(p == NULL) return 0;
    v->size += extr_size;
    v->data = p;
    return 1;
}

int insert(Vector *v, int ind, int val) {
    if(v == NULL) return 0;
    if(ind < 0 || ind > v->length) {
        return 0;
    }
    if(v->size == v->length) {
        if(!expand(v)) return 0;
        printf("expand Vector success = (%d)\n", v->size);
    }
    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(v == NULL) return 0;
    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 clear(Vector * v) {
    if(v == NULL) return;
    free(v->data);
    free(v);
    return;
}
void output(Vector *v) {
    printf("Vector(%d) = [", v->length);
    for(int i = 0; i < v->length; i++) {
        i && printf(",");
        printf("%d", v->data[i]);
    }
    printf("]\n");
}


int main() {
    srand(time(0));
    Vector *v = init(20);
    #define max_op 20
    int op,ind, val;
    for(int i = 0; i < max_op; i++) {
        op = rand() % 2;
        ind = rand() % (v->length + 1);
        val = rand() % 100;
        switch(op) {
            case 0:{
                printf("insert %d at %d to Vector = %d\n", val, ind, insert(v,ind, val));
                output(v);
                printf("\n");
            }break;
            case 1: {
                printf("erase element at %d from Vector = %d\n", ind, erase(v, ind));
                output(v);
                printf("\n");
            }break;
        }
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章