题目:从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后的一个元素填补,若顺序表为空,则显示出错信息并退出运行。
输入:表长length,以及表中各元素的值,类型为int。
输出:删除最小值元素后,表内的值依次输出。
优化目标:无
算法思想:搜索整个顺序表,查找最小值并记住其位置,搜索结束后用最后一个元素填补空出的原最小值元素位置。
#include#include #define MAXSIZE 20 typedef struct{ int key; //关键字 }KeyType; typedef struct{ KeyType R[MAXSIZE+1]; //R[0]闲置 int length; //顺序表的长度 }SqList; int Del_Min(SqList &L){ if(L.length == 0){ printf("顺序表为空!"); exit(0); } int i,k,key; k = 1; for(i = 1;i<=L.length;i++){ if(L.R[k].key > L.R[i].key){ k = i; } } key = L.R[k].key; L.R[k].key = L.R[L.length].key; L.length--; return key; } void ListInit(SqList &L){ int i,length,key; for(i = 1;i<=MAXSIZE;i++){ L.R[i].key = 0; } printf("请输入顺序表的长度(小于20):"); scanf("%d",&length); L.length = length; for(i = 1;i<=length;i++){ printf("请输入第%d个元素:",i); scanf("%d",&key); L.R[i].key = key; } } void PrintList(SqList L){ int i; printf("顺序表内容是:"); for(i = 1;i<=L.length;i++){ printf("%d ",L.R[i].key); } printf("n"); } int main(){ SqList L; ListInit(L); PrintList(L); int k = Del_Min(L); printf("被删除元素为:%dn",k); PrintList(L); return 0; }
题目:设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度O(1)。
输入:表长length,以及表中各元素的值,类型为int。
输出:顺序表逆置后,表内的值依次输出。
优化目标:无
算法思想:扫描顺序表L的前半部分元素,对于元素L.R[i](1<=i<=L.length),将其与后半部分的对应元素L.R[L.length-i+1]进行交换
#include#include #define MAXSIZE 20 typedef struct{ int key; //关键字 }KeyType; typedef struct{ KeyType R[MAXSIZE+1]; //R[0]闲置 int length; //顺序表的长度 }SqList; void ReserverList(SqList &L){ if(L.length == 0){ printf("顺序表为空!"); exit(0); } int i; KeyType x; for(i = 1;i<=(L.length/2);i++){ x = L.R[i]; L.R[i] = L.R[L.length-i+1]; L.R[L.length-i+1] = x; } } void ListInit(SqList &L){ int i,length,key; printf("请输入顺序表的长度(小于20):"); for(i = 1;i<=MAXSIZE;i++){ L.R[i].key = 0; } scanf("%d",&length); L.length = length; for(i = 1;i<=length;i++){ printf("请输入第%d个元素:",i); scanf("%d",&key); L.R[i].key = key; } } void PrintList(SqList L){ int i; printf("顺序表内容是:"); for(i = 1;i<=L.length;i++){ printf("%d ",L.R[i].key); } printf("n"); } int main(){ SqList L; ListInit(L); PrintList(L); ReserverList(L); PrintList(L); return 0; }
题目:对长度为n的顺序表L,编写一个时间复杂度为O(n)、空间复杂度为O(1)的算法,该算法删除线性表所有值为x的数据元素。
输入:表长length,以及表中各元素的值,类型为int。
输出:删除所有值为x的数据元素后,表内的值依次输出。
优化目标:无
算法思想:用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),边扫描L边统计k,并将不等于x的元素向前移动k个位置,最后修改L的长度;
#include#include #define MAXSIZE 20 typedef struct{ int key; //关键字 }KeyType; typedef struct{ KeyType R[MAXSIZE+1]; //R[0]闲置 int length; //顺序表的长度 }SqList; void Del_X(SqList &L,int x){ int i,k; k = 1; for(i = 1;i<=L.length;i++){ if(L.R[i].key != x){ L.R[k].key = L.R[i].key; k++; } } L.length = k-1; } void ListInit(SqList &L){ int i,length,key; printf("请输入顺序表的长度(小于20):"); for(i = 1;i<=MAXSIZE;i++){ L.R[i].key = 0; } scanf("%d",&length); L.length = length; for(i = 1;i<=length;i++){ printf("请输入第%d个元素:",i); scanf("%d",&key); L.R[i].key = key; } } void PrintList(SqList L){ int i; printf("顺序表内容是:"); for(i = 1;i<=L.length;i++){ printf("%d ",L.R[i].key); } printf("n"); } int main(){ SqList L; ListInit(L); PrintList(L); int x; printf("请输入要删除元素x:"); scanf("%d",&x); Del_X(L,x); PrintList(L); return 0; }
题目:从有序顺序表中删除其值在给定值s与t之间(要求s 输入:表长length,以及表中各元素的值,类型为int。 输出:删除在s和t之间的数据元素后,表内的值依次输出。 优化目标:无 算法思想:先寻找值大于s的第一个元素,然后寻找值大于t的第一个元素,要将这段元素删除,只需要直接将后面的元素前移。 题目:从有序顺序表中删除其值在给定值s与t之间(包含s和t,要求s 输入:表长length,以及表中各元素的值,类型为int。 输出:删除在s和t之间(包含s和t)的数据元素后,表内的值依次输出。 优化目标:无 算法思想:从前向后扫描顺序表L,用k记录下元素值在s到t之间元素的个数。对于当前扫描的元素,若其值不在s到t之间,则前移k个位置;否则执行k++。由于这样每个不在s到t之间的元素仅移动一次。 今天做了几个顺序表的题,感觉顺序表的题相对来说比链表的题要好想一点,但是那个删除s到t之间的元素就没想到用k来去定位顺序表还存在的位置,所以还要多接触,明天还要继续做顺序表的题。#include
L.length){
printf("s错误!n");
exit(0);
}
for(j = i;j<=L.length&&L.R[j].key<=t;j++);
for(;j<=L.length;i++,j++){
L.R[i] = L.R[j];
}
L.length = i-1;
}
void ListInit(SqList &L){
int i,length,key;
printf("请输入顺序表的长度(小于20):");
for(i = 1;i<=MAXSIZE;i++){
L.R[i].key = 0;
}
scanf("%d",&length);
L.length = length;
for(i = 1;i<=length;i++){
printf("请输入第%d个元素:",i);
scanf("%d",&key);
L.R[i].key = key;
}
}
void PrintList(SqList L){
int i;
printf("顺序表内容是:");
for(i = 1;i<=L.length;i++){
printf("%d ",L.R[i].key);
}
printf("n");
}
int main(){
SqList L;
ListInit(L);
PrintList(L);
int s,t;
printf("请输入要删除元素下限s:");
scanf("%d",&s);
printf("请输入要删除元素上限t:");
scanf("%d",&t);
Del_s_t(L,s,t);
PrintList(L);
return 0;
}#include
t){
L.R[k].key = L.R[i].key;
k++;
}
}
L.length = k-1;
}
void ListInit(SqList &L){
int i,length,key;
printf("请输入顺序表的长度(小于20):");
for(i = 1;i<=MAXSIZE;i++){
L.R[i].key = 0;
}
scanf("%d",&length);
L.length = length;
for(i = 1;i<=length;i++){
printf("请输入第%d个元素:",i);
scanf("%d",&key);
L.R[i].key = key;
}
}
void PrintList(SqList L){
int i;
printf("顺序表内容是:");
for(i = 1;i<=L.length;i++){
printf("%d ",L.R[i].key);
}
printf("n");
}
int main(){
SqList L;
ListInit(L);
PrintList(L);
int s,t;
printf("请输入要删除元素下限s:");
scanf("%d",&s);
printf("请输入要删除元素上限t:");
scanf("%d",&t);
Del_s_t_include(L,s,t);
PrintList(L);
return 0;
}



