线性表——Data Structure(C语言描述)

本文深入探讨线性表的基本概念、顺序存储结构和链式存储结构,包括初始化、销毁、查找、插入和删除等操作。同时介绍了静态链表的特性和操作,以及循环链表和双向链表的概念,强调了它们在时间和空间性能上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

是时候补一补基础了,那么在算法之前,要搞定的就是数据结构。

基本概念

首先介绍其中比较重要的几个基本概念

  • 数据(data)是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称

  • 数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。

  • 数据对象(data object)是性质相同的数据元素的结合,是数据的一个子集。

  • 数据结构(data structure)是相互之间存在一种或多种特定关系的数据元素的集合。

  • 根据数据元素之间关系的不同特性,通常有下列四类基本结构:

    1. 集合:结构中的数据元素之间除了“同属于一个集合”的关系外,别无其他关系
    2. 线性结构:结构中的数据元素之间存在一个对一个的关系
    3. 树形结构 :结构中的数据元素之间存在一个对多个的关系
    4. 图状结构网状结构: 结构中的数据元素之间存在多个对多个的关系
  • 线性表(List):零个或者多个数据严肃的有限序列

线性表的顺序存储结构

线性表的顺序存储结构的表示和实现

线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素

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

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INIT_SIZE 10        //初始化表长
#define INCREMENT_SIZE 5    //分配增量

typedef int Status;
typedef int Elemtype;

/*
 * 存储结构
 */
typedef struct
{
    Elemtype *elem;    //存储空间基址
    int length;        //当前长度
    int size;        //当前分配的表长大小
                    // 当前分配的存储容量(以sizeof(ElemType)为单位)
}SqList;

初始化一个空的线性表(InitList)


/*
 * 初始化一个空的线性表
 */
Status InitList(SqList *L)
{
    L->elem = (Elemtype *) malloc(INIT_SIZE * sizeof(Elemtype));
    if (!L->elem)
    {
        return ERROR;
    }
    L->length = 0; //空表长度为0
    L->size = INIT_SIZE; //初始存储容量
    return OK;
}

销毁线性表(DestroyList)

/*
 * 销毁线性表
 */
Status DestroyList(SqList *L)
{
    free(L->elem);
    L->length = 0;
    L->size = 0;
    return OK;
}

清空线性表(ClearList)

/*
 * 清空线性表
 */
Status ClearList(SqList *L)
{
    L->length = 0;
    return OK;
}

判断线性表是否为空(isEmpty)

/*
 * 判断线性表是否为空
 */
Status isEmpty(const SqList L)
{
    if (0 == L.length)
    {
        return TRUE;  //这里为什么把0写前边。。。好别扭。。
    }
    else
    {
        return FALSE;
    }
}

获取长度(getLength)

/*
 * 获取长度
 */
Status getLength(const SqList L)
{
    return L.length;  //这个最简单粗暴又多此一举了

}

根据位置获取元素(GetElem)

/*
 * 根据位置获取元素
 */
Status GetElem(const SqList L, int i, Elemtype *e)
{
    if (i < 1 || i > L.length)
    {
        return ERROR; //判断合法性
    }
    *e = L.elem[i-1]; //试想一下返回第一个  那么就是第[0]个元素。所以要-1
    return OK;
}

比较两个元素是否相等(compare)

/*
 * 比较两个元素是否相等  前小返回-1 前大返回1 相等返回0
 */
Status compare(Elemtype e1, Elemtype e2)
{
    if (e1 == e2)
    {
        return 0;
    }
    else if (e1 < e2)
    {
        return -1;
    }
    else
    {
        return 1;
    }
}

查找元素(FindElem)

/*
 * 查找元素
 */
Status FindElem(const SqList L, Elemtype e, Status (*compare)(Elemtype, Elemtype))
{
    int i;
    for (i = 0; i < L.length; i++)
    {
        if (!(*compare)(L.elem[i], e))
        {
            return i + 1;
        }
    }
    if (i >= L.length)
    {
        return ERROR;
    }
}

查找前驱元素(PreElem)

/*
 * 查找前驱元素
 */
Status PreElem(const SqList L, Elemtype cur_e, Elemtype *pre_e)
{
    int i;
    for (i = 0; i <
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值