代码中顺序表的定义类型分为动态分配数组顺序表和静态分配数组顺序表,不管代码中演示的是哪一种,我们都要知道,这两种定义类型都能用来解决具体问题。
1、从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后一个元素填补,若顺序表为空,则显示出错信息并退出运行。
代码如下:(动态分配数组顺序表)
#include <bits/stdc++.h>
#define InitSize 5 //该顺序表初始化长度设为固定值5
using namespace std;
//顺序表的存储类型描述
typedef struct{
int *data;
int MaxSize,length;
} SeqList;
//Del_Min()函数声明
bool Del_Min(SeqList &L, int &value);//
int main(int argc, char** argv) {
SeqList SL;
int a,b;
bool c;
//16-18行是顺序表SL的初始化过程!
SL.data=new int[InitSize];
SL.length=0;
SL.MaxSize=10;
for(int i=0; i<InitSize; i++){
//scanf()函数读到文件结尾时(Windows命令行输入窗口按下Ctrl+z模拟),会返回EOF(EOF值通常为-1),
//因为要模拟空文件,所以有必要写这个条件语句
if( scanf("%d",&a) != EOF ){
SL.data[i] = a;
SL.length++;
}else{
break;
}
}
c=Del_Min(SL,b);//调用函数Del_Min(),引用型形参对应的实参直接就是对象本身
if(c){
printf("顺序表中被删除的最小元素是 %d\n",b);
printf("经过删除操作后顺序表的元素依次为:");
for(int i=0; i<SL.length; i++){
printf("%d ",SL.data[i]);
}
}
return 0;
}
//Del_Min()函数定义
bool Del_Min(SeqList &L, int &value){
//删除顺序表L中最小值元素结点,并通过引用型参数value返回其值
//若删除成功,则返回true;否则返回false
if(L.length==0){
printf("顺序表为空!");//表空,显示错误信息!
return false;//表空,终止操作!
}
value=L.data[0];
int pos=0;//假定0号元素的值最小
for(int i=1;i<L.length;i++){//循环,寻找具有最小值的元素
if(L.data[i]<value){
value=L.data[i];//让value记忆当前具有最小值的元素
pos=i;
}
}
L.data[pos]=L.data[L.length-1];//空出的位置由最后一个元素填补
L.length--;//顺序表长度减一
return true;//此时value即为最小值
}
运行截图如下:
①:正常情况:
②:顺序表为空的情况
3、对长度为n的顺序表L,编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素
解法一:(动态分配数组顺序表)
扫描并用变量k记录下顺序表L中不等于x的元素个数,将这些元素依次存入到索引为k减1的顺序表存储单元中,最后修改顺序表L的长度为,扫描顺序表全表后,最终k的值。
代码如下:
#include <iostream>
#include<cstdio>
using namespace std;
#define InitSize 5
typedef struct{
int *data;
int MaxSize,length;
} SeqList;
void del_x_l(SeqList &L,int x){//del_x_l()函数的定义式声明
//本算法实现删除顺序表L中所有值为x的数据元素
int k=0;
for(int i=0;i<L.length;i++){
if(L.data[i]!=x){ //下面两行的另一种写法,也能奏效!!
k++; //L.data[k]=L.data[i];
L.data[k-1]=L.data[i]; //k++;
}
}
L.length=k;
}
int main(void)
{
int a,b;
SeqList L;
L.data=new int[InitSize];
L.MaxSize=10;
L.length=0;
printf("请依次输入顺序表中的元素(顺序表容量初始值在上面代码中已设为5)");
for(int i=0;i<InitSize;i++){
if(scanf("%d",&a)!=EOF){
L.data[i]=a;
L.length++;
}else{
break;
}
}
printf("请输入你想要在该顺序表中删除的数据元素");
scanf("%d",&b);
del_x_l(L,b);//删除操作
printf("经过删除操作之后顺序表中的元素依次为:");
for(int j=0;j<L.length;j++){
printf("%d ",L.data[j]);
}
return 0;
}
运行截图如下:
这里咱就不考虑,顺序表为空的情况了,其实我写一个可以完整运行的程序只是为了帮助自己能够更好地理解,考试的时候可别像我这么写哦。
解法二:(静态分配数组顺序表)
用k记录顺序表L中等于x的元素个数,边扫描L变统计k,并将不等于x的元素前移k个位置,最后修改L的长度为L.length-k。
代码如下:
#include <iostream>
#include<cstdio>
using namespace std;
#define MaxSize 5
typedef struct{
int data[MaxSize];
int length;
} SeqList;
void del_x_2(SeqList &L,int x){
//本算法实现删除顺序表L中所有值为x的数据元素
int k=0,i=0;
while(i<L.length){
if(L.data[i]==x){
k++;
}else{
L.data[i-k]=L.data[i];//当前元素前移k个位置
}
i++;
}
L.length=L.length-k;//顺序表L的长度递减
return;
}
int main(void)
{
int a,b;
SeqList L;
L.length=0;
int c;
printf("你想要往你创建的顺序表中注入多少个元素呢?,请你输入元素个数(<=5):");
scanf("%d",&c);
printf("好了,请依次输入%d个要放入顺序表中的元素:",c);
for(int i=0;i<c;i++){
if(scanf("%d",&a)!=EOF){
L.data[i]=a;
L.length++;
}else{
break;
}
}
printf("现在请你输入你想要在该顺序表中删除的数据元素:");
scanf("%d",&b);
del_x_2(L,b);//删除操作
printf("经过删除操作之后顺序表中的元素依次为:");
for(int j=0;j<L.length;j++){
printf("%d ",L.data[j]);
}
return 0;
}
运行截图如下: