课程学习实录——数据结构(1)

本文详细介绍了使用C语言实现的顺序表数据结构,包括线性表的概念、顺序表的特点,以及如何通过sequence_list结构体进行初始化、添加元素、删除元素、查找和显示操作。
摘要由CSDN通过智能技术生成

      下面是对大学课程——数据结构(c语言)第三版的教材学习记录,主要是学习过程中的问题解答,有啥问题还请大家批评指正!

1.什么是线性表,有什么特点与顺序表有什么关系?

线性表是一种常见的数据结构,它是由一组具有相同数据类型的元素组成的有序序列。线性表中的元素之间存在一对一的关系,即每个元素都有一个前驱元素和一个后继元素,除了第一个元素没有前驱元素,最后一个元素没有后继元素。

线性表的特点包括:

  • 有序性:线性表中的元素按照一定的顺序排列。
  • 可重复性:线性表中的元素可以重复出现。
  • 动态性:线性表的长度可以动态地增加或减少。

顺序表是线性表的一种实现方式,它使用一段连续的存储空间来存储线性表中的元素。顺序表中的元素在内存中是连续存储的,通过元素在内存中的物理地址来访问和操作。

typedef strct{
   datatype a[maxsize];
   int size;
}sequence_list

这段C语言代码定义了一个名为sequence_list的结构体,它包含两个成员变量:

  • datatype a[maxsize]:这是一个数组,用于存储数据元素。其中,datatype是一个自定义的数据类型,可以根据实际需求进行定义,而maxsize表示数组的最大容量。
  • int size:这是一个整型变量,用于记录当前数组中实际存储的元素个数。
void init(sequence_list *slt)
{
    slt->size=0;
}

函数的功能是将顺序表的大小(size)设置为0,即顺序表清空。函数的参数是一个指向sequence_list类型的指针slt,通过该指针可以对传入的顺序表进行操作。

void append(sequence_list *slt,datatype x)
{
    if(slt->size==maxsize)
       {printf("顺序表是满的!");exit(1);}
    slt->a[slt->size]=x;
    slt->size=slt->size+1;
}

函数append,它的作用是向顺序表中添加元素。函数的参数包括一个指向顺序表的指针slt和要添加的元素x。exit(1);是一个在C或C++程序中用于退出程序的函数。作用是终止当前正在运行的程序,并返回一个指定的退出码。在这里,参数1表示程序以非正常的方式退出。

实现逻辑如下:

  • 检查顺序表是否已满,如果已满,则输出提示信息"顺序表是满的!"并退出程序。
  • 如果顺序表未满,则x赋值给顺序表数组a的第size个位置。
  • 最后,更新顺序表的大小,将size加1。
void display(sequence_list slt)
{
    int i;
    if(!slt.size)   printf("\n顺序表是空的!");
    else
    for(i=0;i<slt.size;i++)   printf("%5d",slt.a[i]);
}

函数display作用是将顺序表中的元素打印出来。

函数的实现逻辑如下:

  • 通过判断顺序表的大小(slt.size)是否为0来确定顺序表是否为空。
  • 如果顺序表为空,则打印提示信息:“顺序表是空的!”。
  • 如果顺序表不为空,则使用循环遍历顺序表中的元素,并使用printf函数将每个元素打印出来,每个元素占据5个字符的宽度。
int empty(sequence_list slt)
{
     return(slt.size==0?1:0);
}

判断顺序表slt是否为空,是则返回1,不是则返回0;

int find(sequence_list slt,datatype x)
{
     int i;
     while(i<slt.size&&a[i]!=x)  i++;
     return(i<slt.size?i:-1);
}

通过while循环+slt.size遍历顺序表元素,同时检测是否存在a数组中元素等于x。若存在则跳出while返回i值;若不存在。则在return处返回-1;

datatype get(sequence_list slt,int i)
{
       if(i<0||i>=slt.size)
             printf("\n指定位置的节点不存在");
       else
           return   slt.a[i];
}

用if语句判断i值是否符合slt长度,随后返回a【i】,类型为datatype。

void insert(sequence_list *slt,datatype x,int position)
{
     int i;
     if(slt->size==maxsize)      
          printf("\n顺序表满了sir",exit(1););
     if(position<0||position>slt->size)     
          printf("\n该位置不存在噢",exit(2););
     for(i=slt->size;i<position;i--) slt->a[i]=slt->a[i-1];
     slt->a[position]=x;
     slt->size++;
}

函数名为insert,作用是在顺序表中插入元素的函数。参数包括一个指向顺序表的指针slt,要插入的元素x,以及插入的位置position

实现逻辑如下:

  • 首先判断顺序表是否已满,如果已满则输出提示信息并退出程序。
  • 接着判断插入位置是否合法,如果位置小于0或大于顺序表的大小,则输出提示信息并退出程序。
  • 然后从顺序表的最后一个元素开始,依次将元素往后移动一位,直到插入位置。
  • 将要插入的元素x放入插入位置。
  • 最后,顺序表的大小加1。
void dele(sequence_list *slt,int position)
{
     int i;
     if(slt->size=0)    printf("顺序表不存在噢亲!",exit(1););
     if(position<0||position>slt->size)  
        printf("选择位置不对噢亲!",exit(2););
     for(i=position;i<slt->size-1;i++)
         slt->a[i]=slt->a[i+1];
     slt->size--;
}

函数名为dele,作用是删除顺序表中指定位置元素。参数包括一个指向顺序表的指针slt和要删除的位置position

实现逻辑如下:

  • 判断顺序表是否存在,如果顺序表的大小为0,则输出"顺序表不存在"并退出程序。
  • 判断要删除的位置是否合法,如果位置小于0或大于顺序表的大小,则输出"选择位置不对"并退出程序。
  • 函数使用循环将指定位置后面的元素依次向前移动一位,覆盖要删除的元素。最后,将顺序表的大小减1。

课后习题待更新...


question1:为什么 slt->size=0;为将顺序表的大小设置为0,而slt->size==maxsize则可以判断顺序表是否充满?

答:这就好比是比较slt->size=0;与slt->size=100;的区别,实际上就是对顺序表大小的判断,slt->size=0; 表示slt对象为空,没有任何数据;而slt->size=100; 表示slt对象中有100个元素或数据。

question2:slt.size和slt->size有什么区别?

答:".“操作符是直接访问结构体中的变量,而"->"操作符是通过地址间接访问结构体中的变量。

  • slt.size是用来访问顺序表slt的大小(元素个数)的变量。顺序表是一种线性表的存储结构,它通过数组实现,可以按照元素在数组中的顺序进行访问。


参考文献:

数据结构(c语言)第三版,李云清,杨庆红,揭安全编著

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值