[数据结构]顺序表的C语言简单实现

Github:(https://github.com/FlameCharmander/DataStructure)
  线性表分为顺序表和链表。
  以下是顺序表的实现,为了简单,没用考虑健壮性(没有对i的合法性进行判断等。)

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

#define SIZE 100
#define INCREMENT 50

typedef int BOOL;
#define TRUE 1
#define FALSE 0
typedef char ElemType;

typedef struct{
    ElemType data[SIZE]; //元素数组
    int length; //长度
    int capacity;   //容量
}SqList;

void InitList(SqList* list); //初始化顺序表
BOOL Insert(SqList* list, ElemType e, int i);   //插入
BOOL Delete(SqList* list, ElemType e);   //删除
BOOL IsEmpty(SqList* list);  //判断为空

int main()
{
    SqList list;
    InitList(&list);
    printf("%d\n", IsEmpty(&list));
    Insert(&list, 'a', 1);
    printf("%d\n", IsEmpty(&list));
    Delete(&list, 'b');
    printf("%d\n", IsEmpty(&list));
    Delete(&list, 'a');
    printf("%d\n", IsEmpty(&list));
    return 0;
}

void InitList(SqList* list){
    list->length = 0;
    list->capacity = SIZE;
}

BOOL Insert(SqList* list, ElemType e, int pos){   //pos的范围1<=pos<=n
    int i;
    ++list->length;
    for (i = list->length; i > pos-1; --i){
        list->data[list->length] = list->data[list->length-1];
    }
    list->data[pos-1] = e;
    return TRUE;
}

BOOL Delete(SqList* list, ElemType e){
    int i, j;
    for (i = 0; i < list->length; ++i){
        if (list->data[i] == e){    //找到该元素
            for (j = i; j < list->length; ++j){
                list->data[j] = list->data[j+1];
                --list->length;
                return TRUE;
            }
        }
    }
    return FALSE;
}

BOOL IsEmpty(SqList* list){
    if (list->length == 0) {
        return TRUE;
    } else {
        return FALSE;
    }
}

这里我建议你打开两个窗口来讲下面的解释和代码一一对应来看。
Line 1~2 导入头文件
Line 4~5 数组的大小,以及增长的长度(这里我并没有用到,因为为了考虑健壮性)
Line 12~16 顺序表的数据结构,一个是元素数组,存放元素的,一个是顺序表的大小,一个是容量(数组有容量的大小,比如我们这里就分配了100个,超过了就会溢出,这时的解决办法就是重新分配一块更大的数组,这也就是上面增长长度的作用)。
Line 18~21 真实的一些操作远不止这些,说过了,这是简单实现,太多的代码很容易击退自信心,然后有注释,可以看一下
Line 23~35 主要是在main函数里,对表的操作进行测试
Line 37~39 为顺序表进行初始化,刚开始数组大小为0,然后容量是100
Line 42~50 这里注意,因为C语言里(包括很多别的类C语言)数组是从0开始的,而我们为了通用性,不考虑这些实现,所以那个pos的大小为1<=pos<=n,当把元素插入其中的位置时,我们需要后移元素(你们可以画个数组,比如现在有个顺序表是1 3 4 5 6,你们要元素10插入到2的位置时,先要把3 4 5 6后移,变成1 3 3 4 5 6,然后把第二个3换成10,最终形成1 10 3 4 5 6)。
Line 44 先把顺序表长度增加1位
Line 45~47 元素后移
Line 48 把插入的元素写到当前的位置,为什么是pos-1,说过了,数组是从0开始的,我们要插入第2个位置就是数组里面下标为1的那个位置。
Line 52~64 要删除顺序表的一个元素。思路就是先走到那个元素,还是刚才那个表(1 10 3 4 5 6),比如要删除3,只要找到3的位置,然后把4 5 6向前移动,变成(1 10 4 5 6 6 ),还有个6在数组怎么办,我们逻辑删除它,就是把顺序表的长度减少一位就可以了。
Line 54 循环,找到要删除的元素
Line 55 如果相等,说明找到了
Line 56~59 把元素向前移动,并且--list->length;,把长度减少。并且返回真
Line 63 如果没找到要删除的元素,会执行这句代码,返回假
Line 66~72 判断顺序表的大小是否为0就知道是否为空。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值