对线性表(顺序结构)的删除、插入、判断元素是否存在、合并操作
当当当(第四声)当(第一声),嘿嘿,小白莲又登场了,学会了线性表的创建与元素获取后,小白莲又开始亲自操刀对线性表进行删除、插入、判断元素是否存在、合并操作了(莫名自信!!!)
当然,如果觉得小白莲写得还不错,记得一定!一定!要点个赞再走哦!最好关注一下也是可以的,你们的对我的点赞和关注就是对我最大的支持,我真的很需要,谢谢!说的就是你,光收藏却不点赞,哼~~
废话少说,让我们往下看
1.线性表的删除操作
哎呦嘞,好简单一操作,大伙四不四一下就看懂了
但是还是得提醒一下哦,
删除操作结束后,记得让表长-1
//创建一个删除线性表第i个元素的函数
//删除第i个元素,用e返回其值,表长减一
Status DeleteElem(SqList& L, int i, ElemType &e) {
//判断i的合法性(i>L.length 包含对线性表是否为空的判断)
if (i<0 || i>L.length) return ERROR;
//把要删除线性表的第i个值赋给e
e = L.elem[i - 1];
//进行删除操作
//将第i个元素后面的所有元素向前挪动一位
for (int k = i-1; k < L.length-1; k++)
{
L.elem[k] = L.elem[k + 1];
}
//表长减一
--L.length;
return OK;
}//DeleteElem
1.1对删除操作的测试
//测试
int main() {
//创建一个线性表list
SqList list;
//创建一个接收返回值的元素e
ElemType e;
//调用InitList函数给list初始化,并判断是否初始化成功
//若初始化成功,继续下一步,否则提示初始化失败
if (InitList(list)) {
//给线性表定义长度
list.length = 10;
//对线性表赋10个测试值
for (int i = 0; i < list.length; i++)
{
list.elem[i] = i+8;
}
//将线性表的值输出
for (int i = 0; i < list.length; i++)
{
printf("%d ", list.elem[i]);
}
printf("\n");
//对DeleteElem进行测试
if (DeleteElem(list, 6, e)) {
printf("第6个元素%d已被删除\n", e);
printf("线性表的当前长度为%d\n", list.length);
}
else
{
printf("输入了非法的i值,删除元素操作失败!\n");
}
//输出进行删除操作后的线性表
for (int i = 0; i < list.length; i++)
{
printf("%d ", list.elem[i]);
}
printf("\n");
}
return 0;
}
1.2对删除操作的测试结果
2.线性表的插入操作
看会了删除操作,我们接下来看插入操作咯,当然也是很简单的啦
但是需要注意几点:
1.需要考虑当线性表存储空间已满时的处理
2.插入操作完成后,需记得让表长+1
3.可插入的位置为元素的总数+1
//创建一个插入元素到线性表第i个位置的函数(1<=i<=L.length+1)
//插入元素后,表长加一
//初始条件:1.线性表存储空间足够,若不够则给线性表增加存储空间
//2.线性表表长大于元素个数
Status InsertElem(SqList& L, int i, ElemType e) {
//判断i的合法性(i>L.length+1 包含对线性表是否为空的判断)
if (i<1 || i>L.length+1) return ERROR;
//判断线性表的存储空间是否已满
if (L.length >= L.listsize) {
//若已满则申请增加存储空间
ElemType* newbase;
newbase = (ElemType*)realloc(L.elem,(LISTINCREMENT + L.listsize) * sizeof(ElemType));
//若申请失败则退出程序
if (!newbase) exit(OVERFLOW);
//给线性表赋上新的基址
L.elem = newbase;
//给线性表增加存储容量
L.listsize += LISTINCREMENT;
}
//进行插入操作
//1.将第i个元素后的所有元素向后挪动一位
//如果i为L中的最后一个位置则直接插入,不用挪动元素
//在for循环条件已给出判断是否为最后一个位置
for (int k = L.length-1; k >= i-1; k--)
{
L.elem[k] = L.elem[k-1];
}
//2.将e插入第i个位置
L.elem[i - 1] = e;
//3.表长加一
++L.length;
return OK;
}
}
2.1对插入操作的测试
插入操作需要注意几点:
1.代码中的length是指当前线性表的长度,由于插入操作需要线性表的长度比元素个数大1位(主要用于插入非尾位置时用于元素挪动的一个空位置),所以我就把length-1当做是元素个数了(可以自己写个查看线性表元素个数的函数会更好),当插入的是尾位置时,元素不需要挪动。
2.线性表的实际存储长度不是length!不是length!不是length!重要的话说三遍,线性表的实际存储长度取决于你初始给线性表分配的存储空间,所以就算你的length=10,线性表里面元素有十个,还是可以往线性表插入元素(线性表存储空间足够的情况),详细实例可以看下面的第4点合并操作。
//测试
int main() {
//创建一个线性表list
SqList list;
//创建一个接收返回值的元素e
//ElemType e;
//调用InitList函数给list初始化,并判断是否初始化成功
//若初始化成功,继续下一步,否则提示初始化失败
if (InitList(list)) {
//给线性表定义长度
list.length = 10;
//对线性表赋10个测试值
for (int i = 0; i < list.length; i++)
{
list.elem[i] = i + 8;
}
//将线性表的值输出
for (int i = 0; i < list.length; i++)
{
printf("%d ", list.elem[i]);
}
printf("\n");
//对InsertElem函数进行测试
//先将线性表空出一个位置
++list.length;
if (InsertElem(list, 1, 888)) {
printf("888已插入list的第1个位置\n");
printf("当前线性表的长度为%d\n", list.length);
//输出插入元素后的线性表
for (int i = 0; i < list.length - 1; i++)
{
printf("%d ", list.elem[i]);
}
}
else
{
printf("输入了非法的i值,获取元素操作失败\n");
}
}
return 0;
}
2.2对插入操作的测试结果
3.对某个元素是否存在于线性表的判断
这个很简单,不用多说吧
//创建一个判定元素e是否在线性表中的函数
Status JudgeElem(SqList L, ElemType e) {
//遍历线性表L看是否存在e,若存在返回1,否则返回0
int flag = 0;
//el用来临时存储从L中遍历到的元素
ElemType el;
for (int i = 0; i < L.length; i++)
{
//调用GetElem函数,并获取L中的元素
//看到这里有人可能会有疑惑,
//我明明直接用L.elem[]就可以获取元素,为啥还用个GetElem函数?
//答:GetElem包含了对i值的合法性判断,程序更有健壮性
if (GetElem(L, i + 1, el)) {
if (el == e) {
flag = 1;
break;
}
}
else
{
printf("i值非法,获取元素失败!\n");
}
}
return flag;
}//JudgeElem
4.两个线性表的合并操作
//创建一个将线性表L2的元素合并到L1的函数,并返回新的L1
//这里引用了L,所以会改变实参中的L,不需要用函数返回改变的L
//目标:将所有在L2中而L1没有的元素添加入L1
Status UnionList(SqList& L1, SqList L2) {
//e用来获取从L2中遍历出来的元素
ElemType e;
//遍历L2
for (int i = 0; i < L2.length; i++)
{
//调用GetElem函数,并获取L2中的元素,并赋给e
GetElem(L2, i + 1, e);
//调用JudgeElem函数,并判断e是否存在于L1
if (!JudgeElem(L1, e)) {
//如果不存在则将e插入L1的尾部
//调用InsertElem函数,进行插入操作
if (InsertElem(L1, L1.length+1, e))
continue;
else {
printf("插入操作失败!!!\n");
return ERROR;
}
}
}
return OK;
}
4.1对两个线性表的合并操作的测试
看了上面的操作后,是不是感觉合并操作也是小case?
这里就是我在插入操作那里说的实例,在这里可以看到L1的length=10,这里的length和元素个数一样,但是在代码中却给L1中直接插入了新的元素,在我的InsertElem函数里面是先插入元素,才执行++length的。具体原因我在插入操作讲了,这里不再赘述。
//测试
int main() {
//创建线性表
SqList L1,L2;
//调用InitList函数给线性表初始化,并判断是否初始化成功
//若初始化成功,继续下一步,否则提示初始化失败
if (InitList(L1)&& InitList(L2)) {
//给线性表定义长度
L1.length = 10;
L2.length = 10;
//对线性表L1赋10个测试值
printf("L1中的元素:\n");
for (int i = 0; i < L1.length; i++)
{
L1.elem[i] = i;
printf("%d ", L1.elem[i]);
}
printf("\n");
//对线性表L2赋10个测试值
printf("L2中的元素:\n");
for (int i = 0; i < L2.length; i++)
{
L2.elem[i] = i+3;
printf("%d ", L2.elem[i]);
}
printf("\n");
//测试UnionList函数
if (UnionList(L1, L2)) {
//将线性表L1的值输出
printf("合并后L1中的元素:\n");
for (int i = 0; i < L1.length; i++)
{
printf("%d ", L1.elem[i]);
}
printf("\n");
}
else
{
printf("合并线性表操作失败!\n");
}
}
return 0;
}
4.2 对两个线性表的合并操作的测试结果
end
呀,写博客好累啊,这是小白莲的第二篇博客,不过感觉不错,更有信心往下写了,好啦好啦,今天就到这里。
给人点赞,手留余香
预知后续操作如何,请看下集
@author 白莲居仙 QQ:1131977233