数据结构-线性表

本文深入讲解线性表的逻辑结构与实现,包括顺序表和链表(单链表、双链表、循环链表)。重点分析了线性表的定义、基本操作,以及各种链表的特性和操作实现,如插入、删除、查找等,还涵盖了链表的逆置、排序等难点解析。

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

考纲内容

        本章节属于重难点,考试中常作为算法题考察,算法题实现往往不算复杂,但是需要达到最佳性能,往往需要一定的基础

知识梳理

1.1 线性表定义

        1)线性表是具有相同数据类型的n个数据元素的有限序列

        2)线性表必须满足:相同,即数据元素的数据类型相同、有限,即数据元素个数有限、有序,即线性表中的序列有先后顺序

1.2 线性表基本操作

        1)线性表基本操作的实现在不同的存储结构时有不同的代码

        2)操作结果不影响数据元素的数值及关系的操作被称为引用型操作,如Length、Empty

1.3 重难点解析

        1)线性表仅仅是一种逻辑结构,但由绪论的讨论我们可以知道,这种逻辑结构本身就是一种数据结构,只不过这种数据结构并没有被实现

        2)顺序表、链表是线性表的实现,它们不仅仅包括线性存储这种逻辑结构,还包括对应的存储结构及其相关运算

2.1 顺序表的定义

        1)线性表的顺序存储又称为顺序表

        2)顺序表必须满足:地址连续,即存储地址一定是连续的、依次存放,即数据元素的存储是依次存放的,中间不能出现跳跃、随机存取,即顺序表具有随机存取的特性、类型相同,即顺序表中存放的数据元素的数据类型一定相同

        3)常用数组来实现顺序表

        4)顺序表的位序从1开始,而数组的下标从0开始

        5)代码实现  

                ①静态分配定义顺序表

#define MAXSIZE 50                //数组最大长度,也就是顺序表的容量
typedef struct{                    
    ElemType data[MAXSIZE];       //数组用作数据域,用于存储顺序表中的元素
    int length;                   //顺序表当前的长度,用于表明当前顺序表中存储的数据元素个数
}SqList;                          //结构体别名

                ②动态分配定义顺序表

#define INITSIZE 50        //初始化时顺序表的最大长度
typedef struct{
    ElemType *data;        //指向动态分配的数组的指针
    int length;
    int maxsize;
}SqList;

2.2 顺序表基本操作的实现

        1)初始化

                ①静态分配初始化

void InitList(SqList &L){
    for(int i=0; i<=MAXSIZE-1; i++){
        L.data[i]=0;                    //将数组内的数据元素置为初始值0,此步可以省略
    }
    L.length=0;                         //将数组的初始长度置为0,此时顺序表内没有存储元素
}

                ②动态分配初始化

void InitList(SqList &L){
    L.data=(ElemType *)malloc(INITSIZE*sizeof(Elemtype));    //申请一片空间作为数据域
    L.lengeh=0;                                              //将当前数据域长度置为0
    L.maxsize=INITSIZE;                                      //修改数据域最大长度
}

                ③动态分配扩容

void IncreaseList(SqList &L, int l){
    ElemType *tem=L.data;                //将原本数据域指针存入临时变量
    L.data=(ElemType *)malloc((L.maxsize+l)*sizeof(ElemType));  //申请新的数据域,长度为原长度加上扩充的长度
    for(int i=0, i<L.length ,i++)        //循环将原本的数据复制进新的数据域
        L.data[i]=tem.data[i];
    L.maxsize+=l;                        //将最大长度修改为原本最大长度加上扩充长度
    free(tem);
}

        2)插入操作

                在顺序表的第i个位置插入新元素e,将i及其后的所有元素后移一位,要求代码具有一定健壮性

bool ListInsert(SqList &L, int i, ElemType e){
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值