c-顺序表实现

#include <stdio.h>
#include <stdlib.h>
typedef int Type_data;
// 创建顺序表结构体
typedef struct SequentialList {
    Type_data *data; // 顺序表起始地址
    int size; // 空间大小
    int index; //当前索引
}SequenList;
typedef enum SequentialOrder {
    top,
    bottom
}SequenOrder;
// 初始化顺序表
SequenList * sequen_list_init(Type_data size) {
    SequenList *manager = (SequenList *)calloc(1, sizeof(SequenList));
    if (!manager) {
        exit(-1); //空间都没分配直接退出
    }
    manager->data = (Type_data *)calloc(size, sizeof(Type_data));
    if (!manager->data) {
        free(manager);
        exit(-1);
    }
    manager->size = size;
    manager->index = 0;
    return manager;
}
// 增加顺序表元素
void sequen_list_add(SequenList *manager,SequenOrder order,Type_data data) {
    if (manager->index + 1 == manager->size) {
        perror("数据已满,不能新增数据");
        return;
    }
    if (!manager->data) {
        perror("数据插入失败");
        return;
    }
    if (order == top) { //头插法
        if (manager->index == 0) {
            manager->data[0] = data;
            manager->index++;
        } else {
            int index = manager->index;
            while (index > 0) {
                manager->data[index] = manager->data[index-1];
                index--;
            }
            manager->data[0] = data;
            manager->index++;
        }
    } else { // 尾插法
        manager->data[manager->index++] = data;
    }
}
// 删除顺序表元素
void sequen_list_delete(SequenList *manager,SequenOrder order) {
    if (!manager->data) {
        perror("数据删除失败");
        return;
    }
    if (manager->index == 0) {
        perror("顺序表为空,不能再删除");
        return;
    }
    if (order == top) { // 从头部开始删除
        int index = manager->index;
        for (int i = 0; i < index; i++) {
            manager->data[i] = manager->data[i + 1]; // 将后续元素前移
        }
        manager->index--;
    } else { // 从尾部开始删除
        for (int i = manager->index; manager->index <= 0; i--) {
            manager->data[i+1] = manager->data[i];
        }
        manager->index--;
    }
}
// 打印顺序表元素
void sequen_list_print(SequenList *manager) {
    if (manager->index == 0) {
        printf("当前顺序表无元素");
        return;
    }
    printf("当前元素有%d个\n",manager->index);
    for (int i = 0; i < manager->index; ++i) {
        if (manager->data) {
            printf("[%d]=%d\n",i,manager->data[i]);
        } else {
            printf("打印数据失败");
        }
    }
}
// 顺序表内存管理
void sequen_list_free(SequenList *manager) {
    free(manager->data);
    manager->data = nullptr;
    free(manager);
}
int main() {
    SequenList *manager = sequen_list_init(10);
    sequen_list_add(manager,top,111);
    sequen_list_add(manager,bottom,222);
    sequen_list_delete(manager,top);
    sequen_list_delete(manager,bottom);
    sequen_list_print(manager);
    sequen_list_free(manager);
}


作者头像
文墨书生创始人

上一篇:c - 字符串操作
下一篇:已是最新文章

发表评论

评论列表

2025-11-13 09:48:30

xCObnOutFUssNtDzBkgJtjFR

2025-12-15 10:23:25

gLaUvgKkiSKCTTEXjpKpeJj