【线性表】常见问题的解题代码(1)

运行软件以及环境

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
请按任意键继续. . .
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值