【数据结构】之起飞(三)线性表 ——看这篇就够了(C语言)

    💖我不知道将要去向何方,但我已在路上!💖

文章目录

  • 前言
  • 一、线性表的定义和基本操作(逻辑结构和基本运算)
  •      1.线性表定义
  •      2.几个概念
  •      3.线性表的基本操作
  • 二、顺序表的定义和基本操作(顺序存储结构)
  •      1.顺序表
  •      2.顺序表的实现——静态分配
  •      3.顺序表的实现——动态分配
  •      4.顺序表的特点
  •      5.顺序表的插入、删除
  •      6.顺序表的查找
  • 三、链表的定义和基本操作(链式存储结构)
  •      1.单链表
  •      2.双链表
  •      3.循环链表
  •      4.静态链表
  • 四、顺序表VS链表

总结


前言

    线性表分为顺序表和链表,根据不同的存储方式有不同的实现过程,今天学习线性表有关的内容,从定义初始化到增删改查再过渡到以后的学习。这是数据结构的开始,加油xdm!冲!🤞🤞🤞


一、线性表的定义和基本操作

1.线性表定义

       线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列(有次序),n为表长,n=0时线性表为空表。若用L命名,则表示为:L=(a1,a2,···,an)

     问:所有的整数按递增次序排列,是线性表吗?

     答:不是,整数是无限的! 

2.几个概念

     位序:ai是线性表中的第i个元素,位序为i。

     a1为表头元素,an为表尾元素

     除第一个元素外,每个元素有且仅有一个直接前驱,除最后一个元素外,每个元素有且仅有一个直接后继。

     注:位序从1开始,数组下标从0开始

3.线性表的基本操作

①InitList(&L):初始化表,构造一个空的线性表L,分配内存空间。

②DestoryList(&L):销毁操作,销毁线性表,并释放空间。

③Lislnsert(&L,i,e):插入操作,在表L的第i个位置插入元素e。

④LiDelete(&L,i,&e):删除操作,删除表L中的第i个位置的元素,并用e返回删除元素的值。

⑤LocateElem(L,e):按值查找,在表L中查找给定的值的元素。

⑥GetElem(L,i):按位查找,获取表L第i个位置的元素的值。

⑦Length(L):求表长,返回线性表L的长度,即L中数据元素的个数。

⑧PrintList(L):输出操作,按顺序输出表L所以的值。

⑨Empty(L):判空操作,若L为空表返回true,否则返回false.

tip:对数据的操作无非是创销,增删改查;参数类型要看实际问题;可自己定义其他基本操作;可随自己习惯更改函数名等。

注:当对参数的修改结果要“带回来”时,需要用& 

二、顺序表的定义和基本操作(实际为线性表的顺序存储)

线性表在计算机中如何表示呢?往下看

1.定义

           用顺序存储的方式实现线性表顺序存储

2.顺序表的实现——静态分配

#define MaxSize 10//定义最大长度;
typedef struct {
    int date[MaxSize];//用静态的数组存放数据元素;
    int length;//顺序表当前长度;
}SqList;
void InitList(SqList &L)
{
    for (int i = 0; i < MaxSize; i++)
    {
        L.date[i] = 0;//初始化为0;
        L.length = 0;
    }
}
int main()
{
    SqList L;  //声明一个顺序表;
    InitList(L); //初始化顺序表;

    return 0;
}

      注意:如果不对顺序表数据进行默认初始化,内存中会有遗留的“脏数据”

   问:当“数组”存满了怎么办?

   答:放弃治疗,顺序表长确定后无法更改(存储空间是静态的)

   问:如果刚开始就声明一个很大的空间呢?

   答:浪费!!!

        要解决上述问题,可用动态分配。

3.顺序表的实现——动态分配

#include <stdio.h>
#include <stdlib.h>
#define InitSize 10//默认的最大长度。
typedef struct {
    int* date;     //指示动态分配数组的指针
    int MaxSize;   //数组的最大长度
    int length;    //顺序表的当前长度
}SeqList;

void InitList(SeqList& L)
{
    L.date = (int*)malloc(InitSize * sizeof(int));//用malloc申请一片连续的内存空间
    L.length = 0;
    L.MaxSize = InitSize;
}
//增加长度
void IncreaseSize(SeqList& L, int len)
{
    int* p = L.date;
    L.date = (int*)malloc((L.MaxSize + len) * sizeof(int));
    for (int i = 0; i < L.MaxSize; i++)
    {
        L.date[i] =
  • 15
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小沐想秃头

你的鼓励是我肝到死的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值