typedef struct
{
ElemType data[MaxSIze];
int length;
/* data */
} SqList;
这段代码定义了一个结构体类型 SqList
(通常表示“顺序列表”或“顺序存储的线性表”),用于表示一个具有固定最大容量 MaxSIze
的线性表。这里的 ElemType
应该是一个在代码的其他部分定义的类型,它表示线性表中存储的元素类型(例如 int
、float
、char
或自定义的结构体等)。
-
typedef
关键字:typedef
用于为已存在的类型创建一个新的名字。在这里,它为下面的结构体类型创建了一个新的名字SqList
。
-
结构体定义:
- 结构体是一个用户定义的数据类型,它允许你将多个不同类型的数据项组合成一个单一的类型。
- 在这个结构体中,有两个成员:
data
:一个ElemType
类型的数组,用于存储线性表的元素。数组的大小是固定的,由MaxSIze
宏定义(这应该在代码的其他部分定义)。length
:一个int
类型的变量,用于存储当前线性表中元素的数量(或称为“长度”)
顺序表的插入
bool InsertList(SqList &L, int i, ElemType s)
{
// 判断插入i是否合法
if (i < 0 || i > L.length+1)
{
/* code */
return false;
}
// 判断储存空间是否满
if (L.length >= MaxSIze)
{
return false;
}
for (int j = L.length; j >= i; j--)
{
L.data[j] = L.data[j - 1];
/* code */
}
L.data[i - 1] = s;
L.length++;
return true;
}
- 插入位置合法性判断:
- 函数首先检查插入位置
i
是否合法。这里使用了i < 0 || i > L.length+1
作为条件。这通常是正确的,因为我们想确保插入位置i
在线性表的有效范围内。在顺序表中,如果位置是从1开始计数的,那么有效范围是1 <= i <= L.length + 1
(包括末尾的插入)。如果位置是从0开始计数的,那么有效范围是0 <= i <= L.length
(不包括末尾的插入,因为末尾的下一个位置是L.length
)。
- 函数首先检查插入位置
- 存储空间是否满的判断:
- 接下来,函数检查顺序表的当前长度
L.length
是否已经达到了其最大容量MaxSIze
。这是通过L.length >= MaxSIze
来判断的。如果顺序表已满,则无法插入新元素,函数返回false
。
- 接下来,函数检查顺序表的当前长度
- 元素后移:
- 如果插入位置合法且存储空间未满,函数会进入一个循环,从
L.length
开始递减到i
(包括i
),将每个元素向后移动一个位置。这是为了腾出空间给新元素s
。
- 如果插入位置合法且存储空间未满,函数会进入一个循环,从
- 插入新元素:
- 在所有需要后移的元素都被移动后,函数在位置
i-1
(假设位置从0开始计数)处插入新元素s
。如果位置是从1开始计数的,这里的代码就是正确的。
- 在所有需要后移的元素都被移动后,函数在位置
- 更新顺序表长度:
- 插入新元素后,函数通过
L.length++
来增加顺序表的长度
- 插入新元素后,函数通过
删除元素
bool DeleteList(SqList &L, int i, ElemType &e)
{
// 判断i是否合法
if (i < 1 || i > L.length)
{
return false;
}
e = L.data[i - 1];
// 删除
for (int j = i; j < L.length; j++)
{
L.data[j - 1] = L.data[j];
/* code */
}
L.length--;
return true;
}
- 判断i是否合法:
- 函数首先检查删除位置
i
是否合法。条件i < 1 || i > L.length
正确地确保了i
是在有效范围内的(假设位置从1开始计数)。如果i
小于1或大于当前列表长度L.length
,则返回false
。
- 函数首先检查删除位置
- 保存被删除的元素:
- 在删除元素之前,函数通过
e = L.data[i - 1];
将被删除的元素(在数组中的位置是i-1
,因为数组通常是从0开始计数的)保存到引用参数e
中。
- 在删除元素之前,函数通过
- 删除元素:
- 接着,函数通过一个从
i
到L.length-1
的循环来将后面的元素向前移动一个位置,以填补被删除元素留下的空位。注意这里循环的起始条件应该是j = i
,因为在i
位置上的元素已经被取出并保存到e
中了。
- 接着,函数通过一个从
- 更新顺序表长度:
- 在所有元素都被移动后,函数通过
L.length--;
来减少顺序表的长度,以反映已删除一个元素的事实。
- 在所有元素都被移动后,函数通过
- 返回结果:
- 如果一切顺利,函数返回
true
表示删除成功。
- 如果一切顺利,函数返回
总运行代码
#include <stdlib.h>
#include <stdio.h>
#define MaxSIze 50
typedef int ElemType;
typedef struct
{
ElemType data[MaxSIze];
int length;
/* data */
} SqList;
bool InsertList(SqList &L, int i, ElemType s)
{
// 判断插入i是否合法
if (i < 0 || i > L.length + 1)
{
/* code */
return false;
}
// 判断储存空间是否满
if (L.length >= MaxSIze)
{
return false;
}
for (int j = L.length; j >= i; j--)
{
L.data[j] = L.data[j - 1];
/* code */
}
L.data[i - 1] = s;
L.length++;
return true;
}
void PrintList(SqList L)
{
for (int i = 0; i < L.length; i++)
{
printf("%3d", L.data[i]);
/* code */
}
printf("\n");
}
bool DeleteList(SqList &L, int i, ElemType &e)
{
// 判断i是否合法
if (i < 1 || i > L.length)
{
return false;
}
e = L.data[i - 1];
// 删除
for (int j = i; j < L.length; j++)
{
L.data[j - 1] = L.data[j];
/* code */
}
L.length--;
return true;
}
int main()
{
SqList L;
L.length = 3;
L.data[0] = 1;
L.data[1] = 2;
L.data[2] = 3;
bool ret;
bool ret1;
ret = InsertList(L, 2, 5);
if (ret)
{
PrintList(L);
}
printf("''''''''''\n");
ElemType del;
DeleteList(L, 1, del);
printf("del=%d", del);
if (ret1)
{
PrintList(L);
}
return 0;
}