学习笔记:顺序表(动态创建)vscode实现

动态分配的顺序表的优缺点:

优点:可以动态增加主题

缺点:动态增加长度中的迁徙工作时间增加

实现方式(删除操作与静态一样)

#include   
#include   
#include   

#define InitSize 1  

typedef struct {
    int* data;      // 指向分配空间的起始地址  
    int MaxSize;    // 最大容量  
    int length;     // 当前长度  
} SqList;

// 初始化  
void InitList(SqList* L) {
    L->data = (int*)malloc(InitSize * sizeof(int)); // 正确分配初始内存  
    L->MaxSize = InitSize;
    L->length = 0;
}

// 动态分配  
void IncreaseSize(SqList* L, int len) {
    int* p = L->data; // 保存旧数据的指针  
    L->data = (int*)malloc((L->MaxSize + len) * sizeof(int)); // 新分配更大容量  
    if (L->data == NULL) { // 检查内存分配是否成功  
        fprintf(stderr, "Memory allocation failed!\n");
        exit(EXIT_FAILURE);
    }

    // 先迁移数据  
    for (int i = 0; i < L->length; i++) {
        L->data[i] = p[i];  // 将原数据迁移至新区域  
    }
    L->MaxSize += len; // 更新最大容量  

    free(p); // 释放原有内存  
}

// 插入(容量不够,动态增加)  
bool ListInsert(SqList* L, int i, int e) {
    if (i < 1 || i > L->length + 1) {
        return false;  // 位置无效  
    }
    if (L->length >= L->MaxSize) {  // 只有在容量不足时才扩展  
        IncreaseSize(L, 10);         // 扩展容量  
    }

    for (int j = L->length; j >= i; j--) {  // 移动元素  
        L->data[j] = L->data[j - 1];         // 逐个后移  
    }

    L->data[i - 1] = e;  // 插入新元素  
    L->length++;
    return true;         // 插入成功  
}

// 输出函数  
void PrintList(SqList L) {
    printf("L: ");
    for (int i = 0; i < L.length; i++) {
        printf("%d ", L.data[i]);
    }
    printf("\n");
}
//销毁操作
void DestoryList(SqList* L) {
    free(L->data);
    L->length = 0;
    L->MaxSize = 0;
    L->data = NULL;

}
int main() {
    SqList L;
    InitList(&L);  // 初始化顺序表  

    // 向顺序表插入元素  
    ListInsert(&L, 1, 10);
    ListInsert(&L, 2, 20);
    ListInsert(&L, 3, 30);

    // 插入时需要动态增加容量  
    ListInsert(&L, 4, 45);
    ListInsert(&L, 5, 50);

    PrintList(L);  // 打印顺序表的内容  

    // 释放动态分配的内存以避免内存泄漏  
    free(L.data);
    return 0;
}

运行结果:

可一看到虽然InitSize =1但是通过动态增长依然可以存储多个数据

你可能感兴趣的:(学习,笔记,考研,vscode)