栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言练习-day17

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言练习-day17

题目:从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。空出的位置由最后的一个元素填补,若顺序表为空,则显示出错信息并退出运行。

输入:表长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的第一个元素,要将这段元素删除,只需要直接将后面的元素前移。

#include
#include

#define MAXSIZE 20

typedef struct{
	int key;  //关键字
}KeyType;

typedef struct{
	KeyType R[MAXSIZE+1];   //R[0]闲置
	int length;   //顺序表的长度
}SqList;


void Del_s_t(SqList &L,int s,int t){
	if(s>=t){
		printf("范围错误!");
		exit(0);
	}
	
	if(L.length == 0){
		printf("顺序表为空!");
		exit(0);
	}
	
	int i,j;
	for(i = 1;i<=L.length&&L.R[i].keyL.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;
}

题目:从有序顺序表中删除其值在给定值s与t之间(包含s和t,要求s

输入:表长length,以及表中各元素的值,类型为int。

输出:删除在s和t之间(包含s和t)的数据元素后,表内的值依次输出。

优化目标:无

算法思想:从前向后扫描顺序表L,用k记录下元素值在s到t之间元素的个数。对于当前扫描的元素,若其值不在s到t之间,则前移k个位置;否则执行k++。由于这样每个不在s到t之间的元素仅移动一次。

#include
#include

#define MAXSIZE 20

typedef struct{
	int key;  //关键字
}KeyType;

typedef struct{
	KeyType R[MAXSIZE+1];   //R[0]闲置
	int length;   //顺序表的长度
}SqList;


void Del_s_t_include(SqList &L,int s,int t){
	if(s>=t){
		printf("范围错误!");
		exit(0);
	}
	
	if(L.length == 0){
		printf("顺序表为空!");
		exit(0);
	}
	
	int i,k;
	k = 1;
	for(i = 1;i<=L.length;i++){
		if(L.R[i].keyt){
			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;
}

今天做了几个顺序表的题,感觉顺序表的题相对来说比链表的题要好想一点,但是那个删除s到t之间的元素就没想到用k来去定位顺序表还存在的位置,所以还要多接触,明天还要继续做顺序表的题。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767691.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号