线性表的顺序存储实现(C语言)

线性表的顺序存储是指在内存中,用一块连续的存储空间来存储线性表的各个元素。在C语言里,一维数组在内存中的存储空间就是一块连续的存储区域。因此使用以为数组来表示线性表的顺序存储。

我们需要考虑到,因为这个数组是动态变化的,那么这个数组应该数足够大的,因此我们在初始化这个数组的时候,应该给予其相关问题的最大值。而且我们还需要有一个标记能够告诉我们该数组中已存放的元素的末尾。

返回表中元素的长度时,直接返回last+1即可

#define MAXSIZE 20      //规定最大元素容量

typedef int ElementType //表示元素类型
typedef int Position    //标记元素末尾

struct Lnode {          //将数组和标记放入到结构体中成为一个整体
  ElementType Data[MAXSIZE];
  Position last;        //last表示数组中的最后一个元素的位置(数组下标) 空表我们一般赋值为-1
};

这样我们就有了一个数组Data的变量last组成的结构体作为顺序表。

接下来来看一下顺序表的相关操作:

前提:

我们在操作顺序表的时候,如果直接将结构体作为参数穿来穿去的话是行不通的,因为C语言中的函数参数是值传递(可以查看我的上一篇文章)。因此我们使用结构体指针来传递。

typedef struct Lnode * List; //定义结构体指针List

初始化一个顺序表:

List MakeEmptyList(){ //初始化一个空表
    List L;    //创建一个新的指针
    L = (List)malloc(sizeof(struct Lnode)); //申请一块内存(结构体大小的),新指针指向这个地方
    L -> last = -1; //空表时 last为-1
    return L;  //返回该结构体指针
}

查找某个元素:

typedef int Position;//表示元素位置
#define ERROR   -1

Position Find(List L, ElementType x){ //查找元素
//List L 是结构体指针   x为数组中的元素
    Position i = 0;
    while(i <= L->last && L->Data[i] != x){
//遍历i从0开始到数组元素尾 当i大于元素个数(找完) 或 Data[i]==x时推出循环(找到)
        i++;
    }
    if (i > L->last) return ERROR;//没找到
    else return i;
}

插入元素到指定位置:

#include <stdbool.h>  //用到bool变量时需要导入该框架

bool insert(List L, ElementType x, int i){//插入元素
//i 是插入的位置 在数组中实际上是Data[i-1]的位置
    if (L->last == MAXSIZE-1){   //先检查表是否已经满
        printf("表已满,插入失败\n");
        return false;
    }
    if (i < 1 || i > L->last+2){ //检查插入位置的正确性
        printf("插入位置出错\n");
        return false;
    }
    for (int j = L->last; j >= i-1; j--){
    //将该位置的所有元素一次向后移动一位
    //注意:一定要从末尾开始,否则会出问题
        L->Data[j+1] = L->Data[j];
    }
    L->last++; //指示最后元素
    L->Data[i-1] = x; //插入元素
    return true;
}

删除指定下标的元素:

bool delete(List L, int i){ //删除下标为i的元素
    if (i < 1 || i > L->last+1){//检查插入的位置正确性(同时检查是否空表)
        printf("错误的位置\n");
        return false;
    }
    for (int j = i; j <= L->last; j++){//将所有元素向前移动一位
        L->Data[j-1] = L->Data[j];
    }
    L->last--; //标记-1
    return true;
}

 

  • 3
    点赞
  • 7
    收藏
  • 打赏
    打赏
  • 0
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论

打赏作者

Coder.L

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值