C语言创建线性表的基本操作_建立、插入、删除、清空、销毁(操作结构体)

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

typedef struct node {
    void **Array;
    int size;
    int capacity;
}nodes;

typedef struct info {
    int id;
    int age;
    char name[20];
}info_s;

nodes* Line_Array_Init(int capacity_in);
void Insert_Array(nodes* p_node, void *value);
void Insert_Pos_Array(nodes* p_node, int pos,void *value);
void Foreach_Line_Array(nodes *p_node, void(*my_printf)(void *));
void my_printf1(void * node_in);
void Remove_Pos_Array(nodes* p_node, int pos);
void Remove_value_Array(nodes* p_node, void *value, int(*my_compare)(void*, void*));
int my_compare1(void*, void*);
void Clear_Line_Array(nodes *p_node);
void Destroy_Line_Array(nodes *p_node);

int main() {

    printf("---开始创建线性表---\n");
    nodes* p_head = Line_Array_Init(10);
    printf("---线性表创建完毕---\n");
    
    info_s n1 = {1, 21, "花木兰"};
    info_s n2 = {2, 21, "凯皇"};
    info_s n3 = {3, 21, "百里守约"};
    info_s n4 = {4, 19, "百里玄策"};
    info_s n5 = {5, 22, "苏烈"};
    info_s n6 = {6, 20, "李信"};

    printf("---开始后插数据--\n");
    Insert_Array(p_head, &n1);
    Insert_Array(p_head, &n2);
    Insert_Array(p_head, &n3);
    Insert_Array(p_head, &n4);
    Insert_Array(p_head, &n5);
    printf("---后插数据完毕---\n");
    Foreach_Line_Array(p_head, my_printf1);

    printf("---开始在特定位置插入数据--\n");
    Insert_Pos_Array(p_head, 1, &n6);
    printf("---在特定位置插入数据完毕---\n");
    Foreach_Line_Array(p_head, my_printf1);

    printf("---开始在特定位置删除数据--\n");
    Remove_Pos_Array(p_head, 0);
    printf("---在特定位置删除数据完毕---\n");
    Foreach_Line_Array(p_head, my_printf1);

    printf("---开始在特定数值删除数据---\n");
    int id_temp = 3;
    Remove_value_Array(p_head, &id_temp, my_compare1);
    printf("---在特定数值删除数据完毕---\n");
    Foreach_Line_Array(p_head, my_printf1);

    printf("---开始清空线性表---\n");
    Clear_Line_Array(p_head);
    printf("---清空线性表完毕---\n");
    Foreach_Line_Array(p_head, my_printf1);

    printf("---开始销毁线性表---\n");
    Destroy_Line_Array(p_head);
    p_head = NULL;
    printf("---销毁线性表完毕---\n");
    Foreach_Line_Array(p_head, my_printf1);

    system("pause");
    return 0;
    system("pause");
    return 0;
}

nodes* Line_Array_Init(int capacity_in) {
    nodes *Line_Array = (nodes*)malloc(sizeof(nodes));
    Line_Array -> Array = (void**)malloc(sizeof(void*) * capacity_in);
    Line_Array -> size = 0;
    Line_Array -> capacity = capacity_in;
    return Line_Array;
}

void Insert_Array(nodes* p_node, void *value_in) {
    if(p_node == NULL)
        return;
    if(p_node -> size >= p_node -> capacity) {
        void **New_Array = (void **)malloc(sizeof(void*) * p_node -> capacity * 2);
        memcpy(New_Array, p_node -> Array, p_node -> capacity);
        free(p_node -> Array);
        p_node -> Array = New_Array;
        p_node -> capacity = p_node -> capacity * 2;
    }
    p_node -> Array[p_node -> size] = value_in;   
    p_node -> size ++;
}

void Insert_Pos_Array(nodes* p_node, int pos,void *value_in) {
    if(p_node == NULL)
        return;
    if(p_node -> size >= p_node -> capacity) {
        void **New_Array = (void **)malloc(sizeof(void*) * p_node -> capacity * 2);
        memcpy(New_Array, p_node -> Array, p_node -> capacity);
        free(p_node -> Array);
        p_node -> Array = New_Array;
        p_node -> capacity = p_node -> capacity * 2;
    }
    if(pos < 0 || pos >= p_node -> size)
        p_node -> Array[p_node -> size] = value_in;
    else {
        for(int i = p_node -> size; i > pos; i--)
            p_node -> Array[i] = p_node -> Array[i - 1];
        p_node -> Array[pos] = value_in;
    }
    p_node -> size ++;
}

void Foreach_Line_Array(nodes *p_node, void(*my_printf)(void *)) {
    if(p_node == NULL)
        return;
    for(int i = 0; i < p_node -> size; i++)
        my_printf(p_node -> Array[i]);
}

void my_printf1(void * node_in) {
    info_s* p1 = (info_s*) node_in;
    printf("id : %d, 年龄 :%d, 姓名:%s\n", p1 ->id, p1 -> age, p1 -> name);
}

void Remove_Pos_Array(nodes* p_node, int pos) {
    if(p_node == NULL)
        return;
    if(pos < 0 || pos >= p_node -> size)
        return;
    else {
        for(int i = pos; i < p_node -> size - 1; i++)
            p_node -> Array[i] = p_node -> Array[i + 1];
    }
    p_node -> size --;
}

void Remove_value_Array(nodes* p_node, void *value_in, int(*my_compare)(void*, void*)){
    if(p_node == NULL)
        return;
    for(int i = 0; i < p_node -> size; i++) {
        if(my_compare(value_in, p_node -> Array[i])) {
            p_node -> Array[i] = NULL;
            for(int ii = i; ii < p_node -> size - 1; ii++)
                p_node -> Array[ii] = p_node -> Array[ii + 1];
            break;
        }
    }
    p_node -> size --;
}

int my_compare1(void* value_in, void* node_in) {
    int *p1 = (int*)value_in;
    info_s *p2 = (info_s*)node_in;
    if(*p1 == p2 -> id)
        return 1;
    else
        return 0;
}

void Clear_Line_Array(nodes *p_node) {
    if(p_node == NULL)
        return;
    free(p_node -> Array);
    p_node -> Array = NULL;
    p_node -> size = 0;
}

void Destroy_Line_Array(nodes *p_node) {
    if(p_node == NULL)
        return;
    Clear_Line_Array(p_node);
    free(p_node);
    p_node = NULL;
}
  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值