【计算机408学习笔记】C语言(中级) 10线性表代码实战2024-01-03

10线性表代码实战

一、与408关联解析
  • 顺序表
  • 链表
二、线性表
1.线性表——逻辑结构
  • 由n(n≥0)个相同类型的元素组成的有序集合。
  • 线性表中元素个数n,称为线性表的长度。当n=0时,为空表。
  • a1是唯一的“第一个”数据元素,an是唯一的“最后一个”数据元素。
  • ai-1为ai的直接 前驱,ai+1为ai的直接 后继
  • 特点
(1)表中元素的个数是有限的。
(2)表中元素的数据类型都相同。意味着每一个元素占用相同大小的空间。
(3)表中元素具有逻辑上的顺序性,在序列中各元素排序有其先后顺序。
  • 线性表是逻辑结构,是独立于存储结构的。
2.线性表的顺序表示——简称顺序表
  • 顺序表:逻辑上相邻的两个元素在物理位置上也相邻。
#define MaxSize 50                //定义线性表的长度
typedef struct{                   //当后面起别名时,结构体的名字可以省略
    ElemType data[MaxSize];       //顺序表的元素
    int len;                      //顺序表的当前长度
}SqList;                          //顺序表的类型定义
  • 优点:可以随机存取(根据表头元素地址和元素序号)表中任意一个元素。存储密度高,每个结点只存储数据元素。
  • 缺点:插入和删除操作需要移动大量元素。线性表变化较大时,难以确定存储空间的容量。存储分配需要一整段连续的存储空间,不够灵活。
  • 插入操作: 最好情况: 在表尾插入元素, 不需要移动元素, 时间复杂度为O(1)。 最坏情况: 在表头插入元素, 所有元素依次后移, 时间复杂度为O(n)。 平均情况: 在插入位置概率均等的情况下, 平均移动元素的次数为n/2, 时间 复杂度为O(n)。
【计算机408学习笔记】C语言(中级) 10线性表代码实战2024-01-03_第1张图片
  • 例子
//判断插入位置i是否合法(满足1≤i≤len+1)
//判断存储空间是否已满(即插入x后是否会超出数组长度)
for(int j=L.len;j>=i;j--)       //将最后一个元素到第i个元素依次后移一位
    L.data[j]=L.data[j-1];
L.data[i-1]=x;                  //空出的位置i处放入x
L.len++;                        //线性表长度加1
  • 线性表第一个元素的数组下标是0。
  • 删除操作: 最好情况:删除表尾元素, 不需要移动元素, 时间复杂度为O(1)。 最坏情况: 删除表头元素, 之后的所有元素依次前移, 时间复杂度为O(n)。平均 情况: 在删除位置概率均等的情况下, 平均移动元素的次数为(n-1)/2,时间 复杂度为O(n)。
【计算机408学习笔记】C语言(中级) 10线性表代码实战2024-01-03_第2张图片
  • 例子
//判断删除位置i是否合法( 满足1≤i≤len)
e=L.data[i-1];                   //将被删除的元素赋值给e
for(int j=i;j
  • 插入和删除时,i的合法范围是不一样的。
  • 动态分配
  • 例子
#define InitSize 100            //表长度的初始定义
typedef struct{
    ElemType *data;             //指示动态分配数组的指针
    int MaxSize,length;         //数组的最大容量和当前个数
}SeqList;                       //动态分配数组顺序表的类型定义

//C的初始动态分配语句为:
L.data=(ElemType*)malloc(sizeof(ElemType)*InitSize);
//C++的初始动态分配语句为:
L.data=new ElemType[InitSize];
  • 动态分配的数组还属于顺序存储结构吗?
三、顺序表的初始化及插入操作实战
  • 注意新建的项目是 C++可执行文件。
  • 函数及变量名的命名规范:下划线命名法(不同的单词用下划线隔开,如list_insert)和驼峰命名法(每个单词的首字母大写,如ListInsert)。
  • 顺序表的位置从1开始;数组下标从0开始。
  • 例子
#include 


//顺序表的初始化及插入操作实战
#define Maxsize 50
typedef int ElemType;//让顺序表存储其他类型元素时,可以快速完成代码修改
//静态分配
typedef struct{
    ElemType data[Maxsize];
    int length;//顺序表长度
}SqList;
//i代表插入的位置,从1开始,element为要插入的元素
bool ListInsert(SqList &L,int i,ElemType element)//顺序表的插入,因为L会改变,因此这里需要引用
{
    //判断要插入的位置是否合法
    if(i<1 || i>L.length)
    {
        return false;
    }
    //判断存储空间是否满了
    if(L.length>=Maxsize)
    {
        return false;
    }
    //移动顺序表中的元素
    for(int j=L.length;j>=i;j--)
    {
        L.data[j]=L.data[j-1];
    }
    L.data[i-1]=element;
    L.length++;
    return true;
}


//打印顺序表元素
void PrintList(SqList L)
{
    for(int i=0;i
  • 结果
   1  60   2   3
四、顺序表的删除及查询操作实战
  • 例子(删除)
#include 


//顺序表的初始化及插入操作实战
#define Maxsize 50
typedef int ElemType;//让顺序表存储其他类型元素时,可以快速完成代码修改
//静态分配
typedef struct{
    ElemType data[Maxsize];
    int length;//顺序表长度
}SqList;


//顺序表的插入,i代表插入的位置,从1开始,element为要插入的元素
bool ListInsert(SqList &L,int i,ElemType element)//顺序表的插入,因为L会改变,因此这里需要引用
{
    //判断要插入的位置是否合法
    if(i<1 || i>L.length)
    {
        return false;
    }
    //判断存储空间是否满了
    if(L.length>=Maxsize)
    {
        return false;
    }
    //移动顺序表中的元素
    for(int j=L.length;j>=i;j--)
    {
        L.data[j]=L.data[j-1];
    }
    L.data[i-1]=element;
    L.length++;
    return true;
}


//打印顺序表元素
void PrintList(SqList L)
{
    for(int i=0;iL.length)
    {
        return false;
    }
    //获取顺序表中对应的元素,赋值给del
    e=L.data[i-1];
    for(int j=i;j
  • 结果
insert sqlist success
   1  60   2   3
delete sqlist success
del=2
   1  60   3
  • 例子(查找)
#include 


//顺序表的初始化及插入操作实战
#define Maxsize 50
typedef int ElemType;//让顺序表存储其他类型元素时,可以快速完成代码修改
//静态分配
typedef struct{
    ElemType data[Maxsize];
    int length;//顺序表长度
}SqList;


//顺序表的插入,i代表插入的位置,从1开始,element为要插入的元素
bool ListInsert(SqList &L,int i,ElemType element)//顺序表的插入,因为L会改变,因此这里需要引用
{
    //判断要插入的位置是否合法
    if(i<1 || i>L.length)
    {
        return false;
    }
    //判断存储空间是否满了
    if(L.length>=Maxsize)
    {
        return false;
    }
    //移动顺序表中的元素
    for(int j=L.length;j>=i;j--)
    {
        L.data[j]=L.data[j-1];
    }
    L.data[i-1]=element;
    L.length++;
    return true;
}


//打印顺序表元素
void PrintList(SqList L)
{
    for(int i=0;iL.length)
    {
        return false;
    }
    //获取顺序表中对应的元素,赋值给del
    e=L.data[i-1];
    for(int j=i;j
  • 结果
insert sqlist success
   1  60   2   3
delete sqlist success
del=2
   1  60   3
locate success
pos=2

你可能感兴趣的:(学习,笔记,c语言)