运行软件以及环境
C-free5.0专业版 OR MS VS C++ 2010学习版
1.问题1
问题描述: 从顺序表中删除具有最小值的元素(假设只有一个),由函数返回被删除的元素的值,空出的位置原则上由最后一个元素填补。若顺序表是空表则显示错误信息并且退出运行。
代码展示以及注释
#include <stdio.h>
#include <stdlib.h>
#define maxsize 50
#define testsize 30
//建立顺序表结构类型
typedef struct{
int data[maxsize];
int length;
}SqList;
//初始化表
bool InitList(SqList &L){
L.length=0;
for(int i=0;i<maxsize;i++){
L.data[i]=0;
}
return true;
}
//填表
bool GiveElem(SqList &L){
for(int i=0;i<testsize;i++){
L.data[i]=1000-5*i;
L.length++;
}
return true;
}
//删除元素函数,删除的值返回给e
bool DeleteMinElem(SqList &L,int &e){
if(L.length==0)//判断表空
return false;
if(L.length==1){//单元素表判断
e=L.data[0];
L.length--;
return true;
}
e=L.data[0];
int p;//用p记录要删除元素所在数组下标
for(int i=0;i<L.length;i++){
if(e>L.data[i]){//遍历表找最小值
e=L.data[i];
p=i;
}
}
if(p==L.length-1){//删除元素刚好是最后一个元素时的处理
L.length--;
}
else{
L.data[p]=L.data[L.length-1];//一般化处理
L.length--;
}
return true;
}
//打印表
void Print(SqList L){
for(int i=0;i<L.length;i++)
printf("data[%d]=%d\n",i,L.data[i]);
}
//主函数测试
int main(){
SqList L;
int e;
InitList(L);
GiveElem(L);
DeleteMinElem(L,e);
printf("The Element which was deleted:%d\n",e);
Print(L);
system("pause");
return 0;
}
运行结果
The Element which was deleted:855
data[0]=1000
data[1]=995
data[2]=990
data[3]=985
data[4]=980
data[5]=975
data[6]=970
data[7]=965
data[8]=960
data[9]=955
data[10]=950
data[11]=945
data[12]=940
data[13]=935
data[14]=930
data[15]=925
data[16]=920
data[17]=915
data[18]=910
data[19]=905
data[20]=900
data[21]=895
data[22]=890
data[23]=885
data[24]=880
data[25]=875
data[26]=870
data[27]=865
data[28]=860
请按任意键继续. . .
2.问题2
问题描述: 逆置顺序表L的所有元素,要求算法原地工作。
代码展示以及注释
注释掉的代码为常规解决办法,空间复杂度为O(n)
算法原地工作是指算法所需要的辅助空间为常量,即O(1)
#include <stdio.h>
#include <stdlib.h>
#define maxsize 50
#define testsize 30
//建立顺序表结构类型
typedef struct{
int data[maxsize];
int length;
}SqList;
//初始化
bool InitList(SqList &L){
L.length=0;
for(int i=0;i<maxsize;i++){
L.data[i]=0;
}
return true;
}
//填表
bool GiveElem(SqList &L){
for(int i=0;i<testsize;i++){
L.data[i]=1000-5*i;
L.length++;
}
return true;
}
//空间复杂度为O(n)的算法
/*
bool ReverseList(SqList &L,SqList &Q){
for(int i=0;i<L.length;i++){
Q.data[L.length-i-1]=L.data[i];
Q.length++;
}
return true;
}
*/
//原地工作算法
bool Reverse(SqList &L){
int temp;//辅助空间
for(int i=0;i<L.length/2;i++){//中分逆置算法
temp=L.data[i];
L.data[i]=L.data[L.length-i-1];
L.data[L.length-i-1]=temp;
}
return true;
}
//打印表
void Print(SqList L){
for(int i=0;i<L.length;i++)
printf("data[%d]=%d\n",i,L.data[i]);
}
//主函数测试
int main(){
SqList L,Q;
InitList(L);
//InitList(Q);
GiveElem(L);
//ReverseList(L,Q);
//Print(Q);
printf("Original List:\n");
Print(L);
Reverse(L);
printf("Now the List:\n");
Print(L);
system("pause");
return 0;
}
运行结果
Original List:
data[0]=1000
data[1]=995
data[2]=990
data[3]=985
data[4]=980
data[5]=975
data[6]=970
data[7]=965
data[8]=960
data[9]=955
data[10]=950
data[11]=945
data[12]=940
data[13]=935
data[14]=930
data[15]=925
data[16]=920
data[17]=915
data[18]=910
data[19]=905
data[20]=900
data[21]=895
data[22]=890
data[23]=885
data[24]=880
data[25]=875
data[26]=870
data[27]=865
data[28]=860
data[29]=855
Now the List:
data[0]=855
data[1]=860
data[2]=865
data[3]=870
data[4]=875
data[5]=880
data[6]=885
data[7]=890
data[8]=895
data[9]=900
data[10]=905
data[11]=910
data[12]=915
data[13]=920
data[14]=925
data[15]=930
data[16]=935
data[17]=940
data[18]=945
data[19]=950
data[20]=955
data[21]=960
data[22]=965
data[23]=970
data[24]=975
data[25]=980
data[26]=985
data[27]=990
data[28]=995
data[29]=1000
请按任意键继续. . .
3.问题3
问题描述: 在长度为n的顺序表L中删除所有值为给定值的元素,要求时间复杂度为O(n)且算法原地工作。
代码展示以及注释
#include <stdio.h>
#include <stdlib.h>
#define maxsize 50
#define testsize 30
//建立顺序表结构类型
typedef struct{
int data[maxsize];
int length;
}SqList;
//初始化
bool InitList(SqList &L){
L.length=0;
for(int i=0;i<maxsize;i++){
L.data[i]=0;
}
return true;
}
//填表
bool GiveElem(SqList &L){
for(int i=0;i<testsize;i++){
L.data[i]=(i+10)%3;
L.length++;
}
return true;
}
//方法1,辅助空间a表示非e元素的数量
bool DeleteElem_x1(SqList &L,int e){
int a=0;
for(int i=0;i<L.length;i++){
if(L.data[i]!=e){
L.data[a]=L.data[i];
a++;
}
}
L.length=a;
return true;
}
//方法2,辅助空间a表示e元素的数量
bool DeleteElem_x2(SqList &L,int e){
int a=0;
for(int i=0;i<L.length;i++){
if(L.data[i]==e)
a++;
else
L.data[i-a]=L.data[i];
}
L.length-=a;
return true;
}
//打印表
void Print(SqList L){
for(int i=0;i<L.length;i++)
printf("data[%d]=%d\n",i,L.data[i]);
}
//对两种方法测试
int main(){
SqList L;
int e;
InitList(L);
GiveElem(L);
DeleteElem_x1(L,0);
DeleteElem_x2(L,1);
Print(L);
system("pause");
return 0;
}
运行结果
第一次打印表(未执行方法)
data[0]=1
data[1]=2
data[2]=0
data[3]=1
data[4]=2
data[5]=0
data[6]=1
data[7]=2
data[8]=0
data[9]=1
data[10]=2
data[11]=0
data[12]=1
data[13]=2
data[14]=0
data[15]=1
data[16]=2
data[17]=0
data[18]=1
data[19]=2
data[20]=0
data[21]=1
data[22]=2
data[23]=0
data[24]=1
data[25]=2
data[26]=0
data[27]=1
data[28]=2
data[29]=0
请按任意键继续. . .
第二次打印表(执行方法1)
data[0]=1
data[1]=2
data[2]=1
data[3]=2
data[4]=1
data[5]=2
data[6]=1
data[7]=2
data[8]=1
data[9]=2
data[10]=1
data[11]=2
data[12]=1
data[13]=2
data[14]=1
data[15]=2
data[16]=1
data[17]=2
data[18]=1
data[19]=2
请按任意键继续. . .
第三次打印表(执行方法2)
data[0]=2
data[1]=2
data[2]=2
data[3]=2
data[4]=2
data[5]=2
data[6]=2
data[7]=2
data[8]=2
data[9]=2
请按任意键继续. . .
代码最终运行结果
data[0]=2
data[1]=2
data[2]=2
data[3]=2
data[4]=2
data[5]=2
data[6]=2
data[7]=2
data[8]=2
data[9]=2
请按任意键继续. . .