欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > 数据结构-顺序表的相关算法实现

数据结构-顺序表的相关算法实现

2025/5/9 18:10:42 来源:https://blog.csdn.net/bachelores/article/details/144978396  浏览:    关键词:数据结构-顺序表的相关算法实现
题目1:删除最小值

题目:

从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。

具体实现
// 删除顺序表中最小值的元素
bool SqListDeleteMinimun(SqList *L,ElemType *e)
{//判断顺序表是否为空if (L->length == 0){return false;}// 用于存放最小值ElemType minValue = *(L->data + 0);// 用于存放最小值的索引int index = 0;for (size_t i = 0; i < L->length - 1; i++){if(*(L->data + i) > *(L->data + i + 1)){minValue = *(L->data + i + 1);index = i+1;}}//将删除的元素由最后一个元素填补*(L->data + index) = *(L->data + (L->length -1)); //返回删除的值*e = minValue;return true;
}

上方是通过for循环实现,时间复杂度为O(n)。

题目2:逆置顺序表

题目:

设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。

// 逆置顺序表
void SqListReverse(SqList *L)
{int left = 0;int right = L->length - 1;while (left < right){//将元素进行交换ElemType tmp = L->data[left];L->data[left] = L->data[right];L->data[right] = tmp;left++;right--;}
}

中间元素交换部分也可以采用异或的方式来实现,当然循环部分也可以使用for(int i = 0; i< L->length / 2; i++)来通过进行前一半元素和后一半元素的交换来实现。

while (left < right){//当两个值不相同时交换位置if (L->data[left]!=L->data[right]){L->data[left] = (L->data[left]) ^ (L->data[right]);L->data[right] = (L->data[left]) ^ (L->data[right]);L->data[left] = (L->data[left]) ^ (L->data[right]);}left++;right--;}
异或实现原理:
//注释表示二进制形式 异或是同位相同则为0 不相同则为1
int a = 4; //4的二进制形式为    00000000 00000000 00000000 00000100
int b = 5; //5的二进制形式为    00000000 00000000 00000000 00000101
​
a = a^b; //通过异或运算后此时a为 00000000 00000000 00000000 00000001 
b = a^b; //通过异或运算后此时b为 00000000 00000000 00000000 00000100  这里的b是和已经异或过的a重新再一次进行异或运算
a = a^b; //通过异或运算后此时a为 00000000 00000000 00000000 00000101

经过异或运算就将二进制位进行了交换从而实现元素交换。

题目3:删除顺序表中值为x的数据元素

题目:

对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。

//这题用的王道书的解法
void SqListDeleteX(SqList *L,ElemType x){int i = 0;//计算不为x的元素int k = 0;for(i = 0; i < L->length ; i++){//查询表中所有不为x的元素,并将这些元素重新排放if(L->data[i] != x){L->data[k] = L->data[i];k++;}}L->length = k;//将长度改为不包含的x元素的k,之后的元素就无法通过顺序表查询到,就达到了删除的效果
}

题目4:删除指定区间内的元素

题目:

从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。

// 删除指定区间的元素
bool SqListDeleteDomain(SqList *L, ElemType s, ElemType t)
{// 用来存储s的索引值int sIndex = -1;// 用来存储t的索引值int tIndex = -1;// 判断行为是否合法if (s >= t || L->length == 0){return false;}
​for (size_t i = 0; i < L->length; i++){// 若值为s则将索引值赋值给sIndexif (L->data[i] == s){sIndex = i;}// 若值为t则将索引值赋值给tIndexelse if (L->data[i] == t){tIndex = i;}// 若s和t的索引值都已找到就提前结束循环if (sIndex >= 0 && tIndex > 0){break;}}
​// 走这条说明s或t没有在顺序表中找到if (!sIndex && !tIndex){return false;}
​// t若为最后一个元素则直接减少长度if (L->data[tIndex] == L->data[L->length - 1]){L->length -= tIndex - sIndex;return true;}// 临时存储s的索引值int tmp = sIndex;
​// 将t往后的数据前移for (size_t i = tIndex; i < L->length; i++){L->data[tmp] = L->data[i + 1];tmp++;}L->length = L->length - (tIndex - sIndex + 1);return true;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com