数据结构C-数组-顺序表

数据结构中有一种结构叫顺序结构,这种结构的数据在内存中是连续的。
图1 顺序表的内存示意图

其实这种结构就是数组。我们都知道,当你创建一个数组的时候,那么计算机就会在内存中开辟一个连续的空间。比如,int a[5],那么计算机就会在内存中开辟一个5个连续的空间用来存储数据。

数组的特点就是长度固定,可以通过索性快速搜索。但是数组也有缺点,比如我们定义的数组长度为5,那么我们就无法为他添加第6个数据,所以为了解决这个问题,我们要重新开辟一个具有6个长度的数组。所以我们需要对数组重新封装,封装出一个功能强大的数组,而这个强大的数组就是我们要学习的顺序表。

既然是数据结构,那么肯定是要定义结构体的。那么第一点就是如何定义出需要的结构体。首先我们先定义一个最简单的数组,比如:int arr[5],那这个就定义了一个数组。其次我们如何知道数组中元素的个数呢?我们在添加一个size变量即可,默认的时候size为0,每添加一个元素就执行size++,删除一个元素就执行size–。这样我们就定义出结构体了。

typedef struct {
    int array[5];
    int length;
} SeqList;

为了让这个结构体的可读性更好,我们把数字提取出来,作为全局常量来使用。

const int CAPACITY = 5;  //CAPACITY是容量的意思

typedef struct {
    int array[CAPACITY];
    int length;
} SeqList;

定义好了结构体,我们就需要使用结构体了,首先我们需要声明这个结构体变量

    SeqList list;
1. 初始化这个结构体init()

当我们声明SeqList的时候,编译器已经为list和length分配内存空间了,但是此时里面都是垃圾值,而list我们后面会通过操作把里面的值替换掉,所以不用初始化它,故我们只需要把这个length设为0即可。

void init(SeqList * list) {
    list-> length = 0;
}
2. 判断顺序表是否为空isEmpty()

顺序表是否为空的标识是顺序的长度是否为0即可。返回布尔值,等于0为true,等于1为false。由于返回的是的布尔值,而c语言中没有bool类型,以及关键词true和false,所以我们需要自己定义。

#define true 1
#define false 0

typedef int bool;

bool isEmpty(SeqList * list) {
    return list->length == 0;
}
3. 判断线性表是否已满isFull()

判断顺序表是否为满,只需要判断顺序表长度是否等于顺序表的容量

bool isFull(SeqList * list) {
  return list->length == CAPACITY;
}
4. 获得元素get()

获得某个元素只需要使用数组下标即可

int get(SeqList * list, int index) {
  return list->array[index];
}

如果要快速获得第一个或者最后一个元素,我们可以在添加以下两个方法

//获得第一个元素
int getFirst(SeqList * list) {
  return list->array[0];
}
//获得最后一个元素
int getLast(SeqList * list) {
  return list->array[list->length-1];
}
5.查找元素的下标

有时候我们需要根据元素来查找下标,如果找到则返回响应的下标,否则返回-1。
查找算法只需要从第一个元素开始,依次与e进行比较。

int locateElem(SeqList * list, int e) {
  for(int i=0; i<list->length; i++) {
     if(list->array[i] == e) {
       return i; 
     }
  }
  return -1;
}
6. 插入元素

插入操作就是在顺序表的第index位置插入新的元素e。
在第index位置插入元素e,只需要把从第i个元素依次往后移动一个位置,然后把元素e赋值给第index位置的元素。移动元素时,先移动最后一个元素,再移动倒数第二个元素,以此类推。

例如有一个顺序表,[6,2,3,1]
顺序表[6,2,3,1]
如果我们要在第1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值