Bootstrap

C语言线性表的实现(详解)

数据结构之线性表

线性表的基本概念:线性表是由0个或者多个数据元素的有限序列
特性是:
​ 1:数据元素之间都是有顺序的
​ 2:数据元素的个数是有限的,
​ 3:数据元素的类型是相同的
​ 性质是:
a0是线性表的第一个元素,只有一个后继,an为线性表的最后一个元素,只有一个前驱
​ 除去a0和an外的其他元素ai,既有前驱也有后继线性表可以逐项访问的顺序存取

线性表的顺序存储结构:指的是用一组地址连续的存储单元依次存储线性表中的数据元素
1: 当插入一个新的元素时,发现内存空间不足申请一块更大的内存空间
2: 将原空间的数据拷贝到新的内存空间
3: 释放旧的内存空间
4: 把元素放入新的空间

1: 动态的内存增加,将存放数据的内存放到堆上(堆的内存空间比较大,不容易发生溢出)
2: 动态数组,如果是5个元素,申请内存,拷贝数据,释放内存,插入第7个数据?
3: capacity容量表示在这一块的内存空间中可以存放多少元素
4: size的概念记录当前数组中具体的内存个数

在这里插入图片描述
程序的头部文件
在这里插入图片描述具体头文件的代码如下所示

 #ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>


/*
	  线性表的基本概念:线性表是由0个或者多个数据元素的有限序列
	  特性是:1:数据元素之间都是有顺序的,2:数据元素的个数是有限的,3:数据元素的类型是相同的
	  性质:a0是线性表的第一个元素,只有一个后继,an为线性表的最后一个元素,只有一个前驱
	  除去a0和an外的其他元素ai,既有前驱也有后继线性表可以逐项访问的顺序存取

	  线性表的顺序存储结构:指的是用一组地址连续的存储单元依次存储线性表中的数据元素
	
	  1: 当插入一个新的元素时,发现内存空间不足申请一块更大的内存空间
	  2: 将原空间的数据拷贝到新的内存空间
	  3: 释放旧的内存空间
	  4: 把元素放入新的空间
	
	  // 动态的内存增加,将存放数据的内存放到堆上
	  // 动态数组,如果是5个元素,申请内存,拷贝数据,释放内存,插入第7个数据?
	  // capacity容量表示在这一块的内存空间中可以存放多少元素
	  // size的概念记录当前数组中具体的内存个数

*/




typedef struct DYNAMICARRAY {
	int* pAddr; // 具体存放数据的地址
	int size;  // 当前有多少个元素
	int capacity;  //当前容器最大容纳多少个元素

}Dynamic_Array;



// 初始化数组
Dynamic_Array* Init_Array();
// 插入
void Push_Back_Array(Dynamic_Array* arr, int value);
// 删除,根据位置对相应的数据进行删除
void Remove_Array(Dynamic_Array* arr, int pos);
// 根据值进行删除
void RemoveByValue_Array(Dynamic_Array* arr, int value);
//查找
int Find_Array(Dynamic_Array* arr, int value);
// 打印输出动态数组当中的值
void Print_Array(Dynamic_Array* arr);
//清空数组
void Clear_Array(Dynamic_Array* arr);
// 获得动态数组容量
int Capacity_Array(Dynamic_Array* arr);
//获得动态数组当前的元素个数
int Size_Array(Dynamic_Array* arr);
int At_Array(Dynamic_Array* arr, int pos);
//释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr);


#endif

程序的主文件main
在这里插入图片描述主要文件代码如下所示:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "DynamicArray.h"



// 初始化数组
Dynamic_Array* Init_Array() {
    // 申请内存
    Dynamic_Array* myArray =(Dynamic_Array*) malloc(sizeof(Dynamic_Array));
    // 初始化
    myArray->size = 0;
    myArray->capacity = 20;
    myArray->pAddr = (int *)malloc(sizeof(int) * myArray->capacity);
    return myArray;

};
// 插入
void Push_Back_Array(Dynamic_Array* arr, int value) {
    if (arr == NULL) {
        return;
    }
    // 判断空间是否足够
    if (arr->size == arr->capacity) {
        // 第一步,申请一块更大的内存空间,新的空间默认就旧空间的2倍
        int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2);
        // 第二步,拷贝数据到新的内存空间
        memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));
        // 释放旧空间的内存
        free(arr->pAddr);
        // 更新容量
        arr->capacity = arr->capacity * 2;
        arr->pAddr = newSpace;
    }
    //插入新的元素,从尾部插入
    arr->pAddr[arr->size] = value;
    arr->size++;
};

// 删除,根据位置对相应的数据进行删除
void Remove_Array(Dynamic_Array* arr, int pos) {
    if (arr == NULL) {
        return;
    }
    // 判断位置是否有效
    if (pos < 0 || pos >= arr->size) {
        return;
    }
    // 删除元素
    for (int i = pos; i < arr->size - 1; i++) {
        arr->pAddr[i] = arr->pAddr[i + 1];
    }

    arr->size--;

};


// 根据值进行删除
void RemoveByValue_Array(Dynamic_Array* arr, int value) {
    if (arr == NULL) {
        return;
    }
    // 找到值的位置
    int pos = Find_Array(arr,value);
    for (int i = 0; i < arr->size; i++) {
        if (arr->pAddr[i] == value) {
             pos = i;
             break;
        }
    }
    // 根据位置删除
    Remove_Array(arr, pos);

};
//查找
int Find_Array(Dynamic_Array* arr, int value) {
    if (arr == NULL) {
        return -1;
    }
    int pos = -1;
    for (int i = 0; i < arr->size; i++) {
        if (arr->pAddr[i] == value) {
            pos = i;
            break;
        }
    }
    return pos;
};
// 打印
void Print_Array(Dynamic_Array* arr) {
    if (arr == NULL) {
        return;
    }
    // 使用for循环打印输出相关的数据
    for (int i = 0; i < arr->size; i++) {
        printf("%d ", arr->pAddr[i]);

    }
    printf("\n");

};


//清空数组
void Clear_Array(Dynamic_Array* arr) {
    if (arr == NULL) {
        return;
    }
    // pAddr - > 空间
    arr->size = 0;
};
// 获得动态数组容量
int Capacity_Array(Dynamic_Array* arr) {
    if (arr == NULL) {
        return -1;
    }
    return arr->capacity;
};
//获得动态数组当前的元素个数
int Size_Array(Dynamic_Array* arr) {
    if (arr == NULL) {
        return -1;
    }
    return arr->size;
};
int At_Array(Dynamic_Array* arr, int pos) {
    if (arr == NULL) {
        return -1;
    }
    return arr->pAddr[pos];
};
//释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr) {
    if (arr == NULL) {
        return;
    }

    // 先释放动态数组内存中里面那块的内存
    if (arr->pAddr != NULL) {
        free(arr->pAddr);
    }
    free(arr);

};


int main(void) {
    Dynamic_Array* myArray = Init_Array();
    // 打印输出数组容量
    printf("数组容量:%d\n", Capacity_Array(myArray));
    printf("数组大小:%d\n", Size_Array(myArray));

    // 插入元素
    for (int i = 0; i < 30; i++) {
        Push_Back_Array(myArray, i);
    }
    printf("数组容量:%d\n", Capacity_Array(myArray));
    printf("数组大小:%d\n", Size_Array(myArray));
    
    // 删除里面的数据
    RemoveByValue_Array(myArray,0);
    RemoveByValue_Array(myArray, 27);
    
    printf("数组容量:%d\n", Capacity_Array(myArray));
    printf("数组大小:%d\n", Size_Array(myArray));
    
    // 查找第五个位置
    int pos = Find_Array(myArray, 5);
    printf("查找5的位置pos:%d  %d\n",pos, At_Array(myArray,pos));


    // 打印
    Print_Array(myArray);
    
    //销毁
    FreeSpace_Array(myArray);system("pause");
    return 0;

}

使用代码模拟线性表实现数据的增,删,改,查(程序的运行结果如下所示)

在这里插入图片描述

;