王道数据结构实践代码----动静态顺序表的实现(C语言版)

王道数据结构实践代码----动静态顺序表的实现(C语言版)

前言

日期:2021年10月14日
书籍:王道2021年数据结构考研复习指导
代码内容:实现顺序表的基本实现,包括初始化,插入新元素,删除新元素,输出,查询

代码展示

1. 预编译内容

//[1]定义顺序表最大长度和动态数组初始默认的最大容量
#define MaxSize 10      //静态顺序表的最大长度
#define InitSize 10     //动态顺序表的初始最大长度
//需要包含的头文件
#include <stdio.h>
#include <stdlib.h>
//C语言自定义bool变量
#define bool char
#define true 1
#define false 0
//自定义数据元素的数据类型
typedef int Elemtype;

2. 结构体编写

//顺序表数据元素结构体(静态分配)
typedef struct SqList
{
   
    //[1]用静态的“数组”存放数据元素
    Elemtype data[MaxSize];
    //[2]顺序表的当前长度
    int length;
}SqList;//顺序表的类型定义(静态分配方式)

//顺序表数据元素结构体(动态分配)
typedef struct SeqList
{
   
    //[1]指示动态分配数组的指针
    Elemtype *data;
    //[2]顺序表的当前长度
    int length;
    //[3]顺序表的最大容量
    int maxsize;
}SeqList;//顺序表的类型定义(动态分配方式)

3. 初始化

//基本操作----初始化一个静态顺序表
bool InitsqList(SqList *L)
{
   
    //[1]将所有数据元素设为默认初始值
    for(int i = 0; i < MaxSize; i++)
    {
   
        L->data[i] = 0;
    }
    /*
    1.本步骤其实可以省略
    2.之所以赋初值是因为内存中会有遗留的"脏数据"
    3.但是常规操作下,用户无法访问大于
      当前表长的数据元素,所以可以在需要时再赋值
    */

    //[2]顺序表初始长度设为0
    L->length = 0;

    return true;
}

//基本操作----初始化一个动态顺序表
bool InitseqList(SeqList *L)
{
   
    //[1]用malloc函数申请一片连续的存储空间
    L->data = (Elemtype *)malloc(sizeof(Elemtype) * InitSize);
    //[2]表长和默认最大长度初始化
    L->length = 0;
    L->maxsize = InitSize;

    return true;
}

4. 动态顺序表的加长

//动态顺序表的加长
bool IncreaseSize(SeqList *L,int len)
{
   
    //[1]生成指向原来顺序表存储位置的指针
    int *p = L->data;
    //[2]为顺序表开辟一片比原来更大的空间
    L->data = (Elemtype *)malloc((L->maxsize + len) * sizeof(Elemtype));
    //[3]转移数据
    for (int i = 0; i < L->length; i++)
    {
   
        L->data[i] = p[i];
    }
    //[4]修改顺序表的最大长度,为其增加len
    L->maxsize = L->maxsize + len;
    //[5]释放原来的存储空间
    free(p);

    return true;
}

5. 顺序表的插入

//基本操作----顺序表的插入
//[1]静态顺序表的插入
bool SqListInsert(SqList *L,int i,Elemtype e)
{
   
    //[1]判断i的合法性
    if(i < 1 || i > L->length + 1)
    {
   
        printf("The position of the element to be inserted is invalid!\n");
        return false;
    }
    if(L->length >= MaxSize)
    {
   
        printf("This sequence table is full!\n");
        return false;
    }

    //[2]将第i个元素及之后的元素都后移
    for(int j = L->length; j >= i; j--)
    {
   
        L->data[j] = L->data[j-1];      //第i个元素对应数组下标为i-1的数组元素 
    }
    //[3]在正确的位置插入新元素
    L->data[i-1] = e;
    //[4]顺序表长+1(注意:顺序表的最大长度不变)
    L->length++;
    //[5]插入成功,返回成功信号
    return true;
}
//[2]动态顺序表的插入
bool SeqListInsert(SeqList *L,int i,Elemtype e)
{
   
    //[1]判断i的合法性
    if(i < 1 || i > L->length + 1)
    {
   
        printf("The position of the element to be inserted i
  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值