老九学堂数据结构与算法章节2课堂笔记上

线性表的定义

  1. 定义:零个或多个数据元素的有限序列
  2. 特点:
    A.它是一个序列
    a.数据元素之间是有序的
    b.数据元素之间是一对一的关系
    B.有限性
    (零个数据元素的有限序列又称为空表)

线性表的抽象数据类型

线性表的常见操作:删除,插入,创建和初始化,查找,清空

ADT 线性表(sequencelist)
DATA
1.线性表数据元素是一个集合(a_1,a_2,a_3,…,a_n),数据元素的类型datatype(int,char,自定义)
2.除了第一个元素a_1外,每个元素有且只有一个直接的前驱元素
3.除了最后一个元素a_n外,每个元素有且只有一个直接的后继元素
4.每个数据元素之间的关系是一对一的关系
Operation

  • initlist(*list)
    初始化线性表:创建一个空的线性表list
  • insertelement(*list,index,elem)
    在线性表list的index下标插入元素elem
  • deleteelement(*list,index,*elem)
    删除线性表list中第i个元素,并返回删除元素的指针elem
  • getlenth(list)
    返回线性表list中的元素个数
  • isempty(list)
    若线性表为空,返回true,否则返回false
  • clearlist(*list)
    清空线性表
  • exsitelem(*list,elem)
    在线性表L中查找是否存在数据元素elem,存在则返回该元素在表中的下标,不存在返回-1
  • getelem(list,index,*elem)
    将线性表List中第i个位置的数据元素返回给elem

endADT

顺序存储结构的线性表–顺序表

  1. 线性表(a1,a2,a3,…,ai-1,ai,…,an)的顺序存储示意图如下:
    在这里插入图片描述
    线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素
  2. 描述线性表的顺序存储结构需要三个属性
    A.定义线性表的最大存储空间
    B.定义数据元素
    C.定义顺序表表结构
#define max_size 255
typedef int elemtype;
typedef struct
{
elemtype datas[max_size];
int length;
char *name;
...
}elemtype;
  1. 地址计算方法
    (position 位置从1开始)
    (index下标从0开始)

顺序存储结构的插入与删除

  1. 顺序表插入数据元素
  • 将数据元素a插入到顺序表下标为i的位置
    下标为i及下标为i以后的所有数据元素后移
    下标i的位置直接放入数据元素a
#include <stdio.h>
#include <string.h>
#define max 255
//1.定义数据元素
typedef struct
{
    int id;
    char *name;
}elementtype;
//2.定义顺序表结构
typedef struct
{
    elementtype data[max];
    int length;
}Seqlist;
/**
*初始化顺序表
*seqlist要初始化的顺序表
*elemarray初始化时要添加的元素内容数组
*length 初始化时添加的元素个数
*/
void initlist(Seqlist *seqlist,elementtype *elementarray,int length);
/**
*向顺序表中的index下标处插入某个元素
*seqlist要初始化的顺序表
*index 要插入的下标
*element要插入的元素
*/
void insertlist(Seqlist *seqlist,int index,elementtype element);
/**
*打印出相应数组
*/
void printflist(Seqlist *seqlist);
void insertlist(Seqlist *seqlist,int index,elementtype element)
{
    //1.验证插入后的元素空间是否超过max
    //2.index的值是否合法[0,max]
    //3.插入的index应该在length之内
    //4.从第length i个下标开始,前面一个元素赋值给后面一个元素
    if(seqlist->length+1>=max)
     {
         printf("数组已满插入失败\n");
         return;
     }
    if(index<0||index>max-1)
    {
        printf("只能在允许的下标范围内插入元素[0,%d]\n",max-1);
        return;
    }
    if(index>seqlist->length)
    {
        printf("插入的下标超过了数组的最大长度-1,插入失败\n");
        return;
    }
    for(int i=seqlist->length-1;i>=index;i--)
    {
        seqlist->data[i+1]=seqlist->data[i];
    }
    seqlist->data[index]=element;
    seqlist->length++;
}
void initlist(Seqlist *seqlist,elementtype *elemarray,int length)
{
    if(length>max)
    {
        printf("超出了数组的最大容量,初始化失败\n");
    }
    seqlist->length=0;
    for(int i=0;i<length;i++)
    {
        insertlist(seqlist,i,elemarray[i]);
    }
}
void printflist(Seqlist *seqlist)
{
    for(int i=0;i<seqlist->length;i++)
        printf("%d\t%s\n",seqlist->data[i].id,seqlist->data[i].name);
}
elementtype dataarray[]={
{1,"奇异博士"},
{2,"美国队长"},
{3,"小鱼"},
{4,"66"}
};
void test();
void test()
{
    Seqlist seqlist;
    initlist(&seqlist,dataarray,sizeof(dataarray)/sizeof(dataarray[0]));
    printflist(&seqlist);
}
int main()
{
    test();
    return 0;
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43233736/article/details/82955954