【数据结构】使用C语言实现顺序表

C语言实现顺序表

定义结构体

//结构体
typedef struct {
    int *data;   //动态分配的指针
    int maxsize; //顺序表的最大容量
    int length;  //静态顺序表的当前长度
} SeqList;

此处声明函数

//声明基本操作
void initList(SeqList *L);
void increaseSize(SeqList *L);
int getLength(SeqList L);
int locateElem(SeqList L, int e);
int getElem(SeqList L, int i);
bool insertData(SeqList *L, int i, int e);
bool deleteData(SeqList *L, int i, int *e);
void printList(SeqList L);
bool isEmpty(SeqList L);
void destoryList(SeqList *L);

初始化顺序表。使用 malloc 进行内存的动态分配。

void initList(SeqList *L) {
    L->data = (int *)malloc(INITSIZE * sizeof(int)); // 使用malloc动态分类空间
    L->length = 0;                                   //设置初始长度为0
    L->maxsize = INITSIZE; //设置当前最大容量为初始容量
}

使用 realloc 函数重新分配内存。当插入时溢出调用该方法扩容。

void increaseSize(SeqList *L) {
    printf("即将溢出,进行数组扩容\n");
    int tempSize = L->maxsize;
    L->data = (int *)realloc(L->data, INITSIZE * 2 * sizeof(int));
    L->maxsize = L->maxsize * 2;
    printf("扩容成功,原容量为:%d,扩容后容量为:%d\n", tempSize, L->maxsize);
}

获取当前表的长度。

int getLength(SeqList L) {
    printf("当前表的最大容量:%d\n", L.maxsize);
    return L.length;
}

查找值为 e 的位序。注意位序从 1 开始而不是 0。

int locateElem(SeqList L, int e) {
    for (int i = 0; i < L.length; i++) {
        if (L.data[i] == e) {
            return i + 1;
        }
    }
    return 0;
}

查找位序为 i 的值。

int getElem(SeqList L, int i) {
    if (i < 1 || i > L.length) { //查找的元素位序不合法
        printf("查找的元素位序不合法!\n");
        return 0;
    } else {
        return L.data[i - 1];
    }
}

在第 i 个位序中插入元素 e。

bool insertData(SeqList *L, int i, int e) {
    if (i < 1 || i > L->length + 1) { //插入位置不合法
        return false;
    } else if (L->length == L->maxsize) { //容量已满,扩容
        increaseSize(L);
    }
    for (int j = L->length; j >= i; j--) { //将第j-1个元素的值赋值给第j个元素
        L->data[j] = L->data[j - 1];
    }
    L->data[i - 1] = e; //将e赋值给第i-1个元素
    L->length++;        //当前长度+1
    return true;
}

删除第 i 个位序的值。

bool deleteData(SeqList *L, int i, int *e) {
    if (i < 1 || i > L->length + 1) { //位置不合法
        return false;
    } else {
        *e = L->data[i - 1];
        printf("将被删除的值为:%d\n", *e);
        for (int j = i; j < L->length; j++) { //将后一个元素的值赋值给前一个元素
            L->data[j - 1] = L->data[j];
        }
        L->length--;
        return true;
    }
}

判断表是否为空。

bool isEmpty(SeqList L) { return L.length == 0; }

销毁表,释放空间。

void destoryList(SeqList *L) {
    free(L->data);
    L->length = 0;
    L->maxsize = 0;
}

遍历顺序表,打印输出。

void printList(SeqList L) {
    printf("打印当前表\n");
    for (int i = 0; i < L.length; i++) {
        printf("L.data[%d]=%d\n", i, L.data[i]);
    }
}

测试结果

在这里插入图片描述
在这里插入图片描述

完整代码

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#define INITSIZE 10 //定义初始容量

//结构体数组
typedef struct {
    int *data;   //动态分配的指针
    int maxsize; //顺序表的最大容量
    int length;  //静态顺序表的当前长度
} SeqList;

//声明基本操作
void initList(SeqList *L);
void increaseSize(SeqList *L);
int getLength(SeqList L);
int locateElem(SeqList L, int e);
int getElem(SeqList L, int i);
bool insertData(SeqList *L, int i, int e);
bool deleteData(SeqList *L, int i, int *e);
void printList(SeqList L);
bool isEmpty(SeqList L);
void destoryList(SeqList *L);

/*
初始化顺序表
*/
void initList(SeqList *L) {
    L->data = (int *)malloc(INITSIZE * sizeof(int)); // 使用malloc动态分类空间
    L->length = 0;                                   //设置初始长度为0
    L->maxsize = INITSIZE; //设置当前最大容量为初始容量
}

/*
增加动态数组长度,默认扩容为原来的两倍
*/
void increaseSize(SeqList *L) {
    printf("即将溢出,进行数组扩容\n");
    int tempSize = L->maxsize;
    L->data = (int *)realloc(L->data, INITSIZE * 2 * sizeof(int));
    L->maxsize = L->maxsize * 2;
    printf("扩容成功,原容量为:%d,扩容后容量为:%d\n", tempSize, L->maxsize);
}

/*
获取当前表的长度
*/
int getLength(SeqList L) {
    printf("当前表的最大容量:%d\n", L.maxsize);
    return L.length;
}

/*
查找值为e的元素的位序
如果能够找到,返回该元素的位置,否则返回0。
*/
int locateElem(SeqList L, int e) {
    for (int i = 0; i < L.length; i++) {
        if (L.data[i] == e) {
            return i + 1;
        }
    }
    return 0;
}

/*
获取第i个元素的值
*/
int getElem(SeqList L, int i) {
    if (i < 1 || i > L.length) { //查找的元素位序不合法
        printf("查找的元素位序不合法!\n");
        return 0;
    } else {
        return L.data[i - 1];
    }
}

/*
在第i个位置插入元素e
*/
bool insertData(SeqList *L, int i, int e) {
    if (i < 1 || i > L->length + 1) { //插入位置不合法
        return false;
    } else if (L->length == L->maxsize) { //容量已满,扩容
        increaseSize(L);
    }
    for (int j = L->length; j >= i; j--) { //将第j-1个元素的值赋值给第j个元素
        L->data[j] = L->data[j - 1];
    }
    L->data[i - 1] = e; //将e赋值给第i-1个元素
    L->length++;        //当前长度+1
    return true;
}

/*
删除表第i个位序的值。如果删除成功则返回true并存入e。
删除失败则返回false
*/
bool deleteData(SeqList *L, int i, int *e) {
    if (i < 1 || i > L->length + 1) { //位置不合法
        return false;
    } else {
        *e = L->data[i - 1];
        printf("将被删除的值为:%d\n", *e);
        for (int j = i; j < L->length; j++) { //将后一个元素的值赋值给前一个元素
            L->data[j - 1] = L->data[j];
        }
        L->length--;
        return true;
    }
}

/*
判断表是否为空
*/
bool isEmpty(SeqList L) { return L.length == 0; }

/*
释放表的空间,销毁表
*/
void destoryList(SeqList *L) {
    free(L->data);
    L->length = 0;
    L->maxsize = 0;
}

/*
遍历顺序表,打印输出
*/
void printList(SeqList L) {
    printf("打印当前表\n");
    for (int i = 0; i < L.length; i++) {
        printf("L.data[%d]=%d\n", i, L.data[i]);
    }
}

int main(int argc, char const *argv[]) {
    SeqList L;
    printf("初始化当前顺序表...\n");
    initList(&L);
    if (isEmpty(L)) {
        printf("该表为空!\n");
    } else {
        printf("该表非空!\n");
    }
    printf("当前表的长度:%d\n", getLength(L));
    int num;
    printf("插入元素个数为:");
    scanf("%d", &num);
    for (int i = 0; i < num; i++) {
        insertData(&L, i + 1, i);
    }
    printList(L);
    printf("当前表的长度:%d\n", getLength(L));
    int e;
    printf("输入要获取位序的数:");
    scanf("%d", &e);
    printf("值为%d的位序为:%d\n", e, locateElem(L, e));
    int i;
    printf("输入位序:");
    scanf("%d", &i);
    printf("位序为%d的值为:%d\n", i, getElem(L, i));
    int *delNum, delLocal;
    printf("输入要删除位序的值:");
    scanf("%d", &delLocal);
    bool flag = deleteData(&L, delLocal, delNum);
    if (flag) {
        printf("第%d个位序被删除,删除的值为:%d\n", delLocal, *delNum);
        printf("当前表的长度:%d\n", getLength(L));
    } else {
        printf("输入的位序不合法,删除失败!\n");
    }
    printList(L);
    printf("销毁该表!\n");
    destoryList(&L);

    return 0;
}
  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步一点丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值