下面是对大学课程——数据结构(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语言)第三版,李云清,杨庆红,揭安全编著