Fork me on GitHub

01顺序表及其操作

01顺序表及其操作

1、顺序表结构体

typedef struct Vector
{
    int *data;
    int size, length;  // 顺序表的容量,顺序表的数组长度
}Vector;

 

2、顺序表初始化

 Vector *init(int n) ,n为初始化顺序表的容量

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

 

3、顺序表扩容

 int expand(Vector *vec) 

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

 

4、插入元素

 int insert(Vector *vec, int ind, int val) ,ind为出入的位置索引,val为插入的元素

int insert(Vector *vec, int ind, int val)
{
    if (vec == NULL) return 0;
    if (ind < 0 || ind > vec->length) return 0;
    if (vec->length == vec->size) {
        if (!expand(vec)) return 0;
        printf("Success to expand! The Vector size is %d\n", vec->size);
    }
    
    int i;
    for (i=vec->length;i>ind;i--) {
        vec->data[i] = vec->data[i-1];
    }
    vec->data[ind] = val;
    vec->length += 1;
    
    return 1;
}

 

5、删除元素

 int erase(Vector *vec, int ind) ,ind为要删除的元素的位置索引

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

 

6、打印输出顺序表的元素

 void output(Vector *vec) 

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

 

7、删除顺序表

 void clear(Vector *vec) 

void clear(Vector *vec)
{
    free(vec->data);
    free(vec);
    
    return;
}

 

8、整体代码及测试代码

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

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

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

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

int insert(Vector *vec, int ind, int val)
{
    if (vec == NULL) return 0;
    if (ind < 0 || ind > vec->length) return 0;
    if (vec->length == vec->size) {
        if (!expand(vec)) return 0;
        printf("Success to expand! The Vector size is %d\n", vec->size);
    }
    
    int i;
    for (i=vec->length;i>ind;i--) {
        vec->data[i] = vec->data[i-1];
    }
    vec->data[ind] = val;
    vec->length += 1;
    
    return 1;
}

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

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

void clear(Vector *vec)
{
    free(vec->data);
    free(vec);
    
    return;
}

int main()
{
    srand(time(0));
    #define max_op 20
    Vector *vec = init(max_op);
    int i;
    for (i=0;i<max_op;i++) {
        int op = rand() % 4;
        int ind = rand() % (vec->length + 3) - 1;
        int val = rand() % 100;
        switch(op) {
            case 0:
            case 1:
            case 2: {
                printf("insert %d at %d to Vector = %d\n", val, ind, insert(vec, ind, val));
                break;
            }
            case 3: {
                printf("erase an item at %d from Vector = %d\n", ind, erase(vec, ind));
                break;
            }
        } 
        
        output(vec);
        printf("\n");
    }
    
    clear(vec);
    #undef max_op
    
    return 0; 
 } 

 

posted @ 2020-11-05 23:00  小黑子杜  阅读(84)  评论(0编辑  收藏  举报