顺序表的基本操作 c语言版

顺序表的基本操作 c语言版

1.初始化顺序表
2.扩展顺序表的存储空间
3.打印顺序表中的数据
4.向顺序表中插入数据
5.删除顺序表中的元素,并将删除的数据存储在变量e中

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

#define InitSize 10//默认最大长度

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

//初始化顺序表
void InitList(SeqList *L) {
    //用malloc函数申请长度为 InitSize 的连续的存储空间
    L->data = (int *) malloc(InitSize * sizeof(int));
    L->length = -1;//初始化长度为0
    L->MaxSize = InitSize;//初始化最大存储空间的标志为InitSize
    int i = 0;
    for (i = 0; i < L->MaxSize; i++) {
        L->data[i] = i;
    }
}

//扩展顺序表的存储空间
void IncreaseSize(SeqList *L, int len) {
    int *p = L->data;
    //用malloc函数申请一片长度为 (InitSize + len) 的连续的存储空间
    L->data = (int *) malloc((L->MaxSize + len) * sizeof(int));
    int i = 0;
    for (i = 0; i < L->length; i++) {
        //将原来顺序表中的数据 移动到新的更大的连续的存储空间中
        L->data[i] = p[i];
    }
    L->MaxSize = L->MaxSize + len;//增加顺序表的最大存储空间的标志
    free(p);//释放原来空间中的指针数据
}

//打印顺序表中的数据
void PrintfList(SeqList *L) {
    int i = 0;
    int real_length = -1;
    for (i = 0; i < L->length; i++) {//打印顺序表中的数据
        printf("<length : %d> %d -> %d\n", L->length, i, L->data[i]);
    }
    printf("\n");
}

//向顺序表中插入数据
void ListInsert(SeqList *L, int i, int e) {
    //如果原来的顺序表已经填满,插入失败
    if (L->length == L->MaxSize) {
        printf("\n原来的顺序表已经填满,插入失败\n");
        return;
    }
    //如果插入的序号大于顺序表的长度,插入失败
    if (i > L->length) {
        printf("\n插入的序号大于顺序表的长度,插入失败\n");
        return;
    }
    int k = 0;
    //程序里面第一个元素下标为0
    //因此程序里面的序列是 位序 - 1
    int real_i = i - 1;
    int real_length = L->length - 1;
    for (k = real_length + 1; k > real_i; k--) {
        //从后往前,将数据向后移动一个单位
        L->data[k] = L->data[k - 1];
    }
    L->data[real_i] = e;
    L->length++;//顺序表的长度+1
}

//删除顺序表中的元素,并将删除的数据存储在变量e中
void ListDelete(SeqList *L, int i, int *e) {
    //如果删除的序号大于此时顺序表的长度,删除失败
    if (i > L->length) {
        printf("\n删除的序号大于此时顺序表的长度,删除失败\n");
        return;
    }

    int k = 0;
    //程序里面第一个元素下标为0
    //因此程序里面的序列是 位序 - 1
    int real_i = i - 1;
    int real_length = L->length - 1;
    *e = L->data[real_i];
    for (k = real_i; k < real_length; k++) {
        //从后往前,将数据向后移动一个单位
        L->data[k] = L->data[k + 1];
    }

    L->length--;//顺序表的长度+1

}

int main() {
    SeqList L;//创建对象
    InitList(&L);//初始化顺序表

    int i = 0;
    for (i = 0; i < L.MaxSize; i++) {//向顺序表中添加数据
        L.data[i] = i;
        L.length += 1;
    }

    PrintfList(&L);//打印顺序表中的数据

    IncreaseSize(&L, 5);//扩展顺序表的存储空间,扩大5个存储空间

    for (i = InitSize - 1; i < L.MaxSize; i++) {//向顺序表中继续添加数据
        L.data[i] = i;
        L.length += 1;
    }
    PrintfList(&L);//打印顺序表中的数据


    ListInsert(&L, 3, 333);//向顺序表中插入数据
    PrintfList(&L);//打印顺序表中的数据

    int e = -1;
    ListDelete(&L, 3, &e);//删除顺序表中的元素,并将删除的数据存储在变量e中
    printf("\n%d\n", e);//打印e的值

    PrintfList(&L);//打印顺序表中的数据

    return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值