题目描述:
32题:删除顺序表中最小的元素,由最后一个元素补充*
33题:逆转顺序表的元素*
思路:
32题:遍历一遍顺序表采用key记录当前最小元素,用flag记录位置,每次用key和顺序表里元素比较,找到更小的就更新key和flag,最后顺序表长度自减1。因为遍历了只一遍顺序表,时间复杂度为O(n)。*
33题:直接用left和right指向顺序表首尾向中间遍历并交换元素即可,除变量外未申请和顺序表表长相关空间,故空间复杂度为O(1),遍历一半顺序表,时间复杂度为O(n)。*
代码实现:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//32-删除顺序表中最小的元素,由最后的一个元素补充
//33-逆置顺序表
#define MaxSize 50
typedef int ElemType;//定义顺序表
typedef struct{
ElemType *data;
int len;
}SqList;
void InitList(SqList &L,int n){//初始化
L.data = (ElemType*)malloc(sizeof(ElemType)*MaxSize);
L.len = n;
srand(time(NULL));
for (int i = 0; i < n; i++)
{
L.data[i] = rand()%100;//随机初始化0~99之间数值
}
}
void Print_List(SqList L) //打印函数
{
for (int i = 0;i<L.len;i++)
{
printf("%-3d",L.data[i]);
}
printf("\n");
}
int DeletMinElem(SqList &L) //删除最小元素
{
ElemType key=L.data[0]; //记录当前最小值
int flag = 0; //记录最小元素位置
for (int i = 0;i<L.len;i++)
{
if(L.data[i] < key){
key=L.data[i];
flag = i;}
}
if(flag != L.len-1) //若最小元素不是末尾元素就将末尾元素补充到最小元素位置
{L.data[flag] = L.data[L.len-1];}
L.len = L.len-1; //删除元素,直接顺序表长度自减
return flag+1; //返回被删除位置
}
SqList ReverseList(SqList &L)//逆置顺序表
{
int left=0,right=L.len-1;
int mid = (left+right)/2;
for (int i = 0;i<=mid;i++){
//用i遍历顺序表,因为逆置具有对称的特点故只需遍历一半即可
ElemType val = L.data[left+i];
L.data[left+i] = L.data[right-i];
L.data[right-i] = val; //交换相应位置的元素
}
return L;
}
int main() {
SqList L;
InitList(L,10);//初始化顺序表,随机赋值
printf("顺序表删除前:\n");
Print_List(L); //打印初始表做对照
printf("-----------------------------\n");
int a = DeletMinElem(L);
printf("最小元素位置为:%d\n",a);
printf("删除最小元素后:\n");
Print_List(L); //打印删除最小元素后的函数
printf("-----------------------------\n");
ReverseList(L); //逆置顺序表
printf("逆置顺序表后:\n");
Print_List(L); //打印逆置后的函数
return 0;
}
输出结果:
结果1:
结果2: