编程数据结构与算法题_数据结构算法题

7f8a65ddc0d33bbfb67423ec4d5df4c6.png

考研资料链接处:

https://github.com/HachiLin/GRE-Review​github.com https://www.cnblogs.com/monkeycode/p/12774129.html#commentform​www.cnblogs.com

编程题:

2021版王道《数据结构》编程题汇总_shazi4399的博客-CSDN博客​blog.csdn.net
eecd61abe84bdf9c812bd45aa08e8cf9.png
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<memory.h>
#include<string.h>
//1.从顺序表中删除具有最小值的元素(假设唯一)并由函数返回被删元素的值。
//空出的位置由最后一个元素填补,若顺序表为空则显示出错信息并退出运行。
//算法思想:搜索整个顺序表,查找最小值元素并记住其位置,搜索结束后用最后一个元素填空出的原最小值元素的位置。
bool Del_Min(sqList &L,ElemType &value){
	if(L.length==0)
		return false;
	value = L.data[0];	//默认第一个元素为最小值
	int index = 0;		//默认最小值为第一个下标的元素 
	for(int i=0;i<L.length;i++){
		if(L.data[i] < value){
			value = L.data[i];
			index = i; 
		}
	} 
	L.data[index] = L.data[L.length-1];
	L.length--;
	return true;
}
//2.设计一个高效算法,将顺序表L的所有元素逆置,要求算法的空间复杂度为O(1)。
//算法思想:扫描顺序表L的前半部分元素,对于元素L.data[i](0<=i<L.1 ength/2),
//将其与后半部分的对应元素L.data[L.1 ength-i-1]进行交换。
void Reverse(Sqlist &L){
	ElemType temp = 0;
	for(int i=0;i<L.length/2;i++){
		temp = L.data[i];
		L.data[i] = L.data[L.length-1-i];
		L.data[L.length-1-i] = temp;
	}
}
//3.对长度为n的顺序表L,编写一个时间复杂度为O(m)、空间复杂度为O(1)的算法,该算法删除线性表中所有值为x的数据元素。
//解法一:用k记录顺序表L中不等于x的元素个数(即需要保存的元素个数),边扫描L边统计k,
//并将不等于x的元素向前移动k个位置,最后修改L的长度
void del_x_1(Sqlist &L,Elemtype x){
	int k = 0;
	for(int i=0;i<L.length;i++){
		if(L.data[i] != x){
			L.data[k] = L.data[i];
			k++;
		}
	}
	L.length = k;
}
//4.从有序顺序表中删除其值在给定值s与t之间(要求s<t)的所有元素,如果s或t不合理或顺序表为空,则显示出错信息并退出运行。
//注意:本题与上一题的区别。因为是有序表,所以删除的元素必然是相连的整体。
//算法思想:先寻找值大于等于s的第一个元素(第一个删除的元素),然后寻找值大于t的第个元素(最后一个删除的元素的下一个元素),
//要将这段元素删除,只需直接将后面的元素前移
bool fun4(SqList &L,ElemType s,ElemType t){
	if(s>=t || L.length==0)
		return false;
	for(int i=0; i<L.length&&L.data[i]<s ;i++);//找到第一个≥s的下标
	if(i>L.length)
		return true;	//全部都小于s,不用移动
	for(int j=i; j<L.length&&L.data[j]<=t ;j++);//找到第一个>t的数
	for(i,j ; j<L.length ;i++,j++){
		L.data[i] = L.data[j];
	}
	L.length = i;
	return true;
}
//5.从顺序表中删除其值在给定值s与t之间(包含s和t,要求s<t)的所有元素,如果s或t不合理或顺序表为空,则显示出错信息并退出运行
//算法思想:从前向后扫描顺序表L,用k记录下元素值在s到t之间元素的个数(初始时k=0).对于当前扫描的元素,若其值不在s到t之间,
//则前移k个位置;否则执行k++.由于这样每个不在s到t之间的元素仅移动一次,所以算法效率高.
bool fun5(SqList &L,ElemType s,ElemType t){
	if(s>=t || L.length==0)
		return false;
	int k = 0;
	for(int i=0;i<L.length;i++){
		if(L.data[i]>s && L.data[i]<t)
			L.data[k++] = L.data[i];
	}
	L.length = k;
	return true;
}
//6.从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不同
//算法思想:注意是有序顺序表,值相同的元素一定在连续的位置上,用类似于直接插入排序的思想,初始时将第一个元素视为非重复的有序表.
//之后依次判断后面的元素是否与前面非重复有序表的最后一个元素相同,1 1 2 3 3 4 5 6 6
//若相同则继续向后判断,若不同则插入到前面的非重复有序表的最后,直至判断到表尾为止.
void fun6(SqList &L){
	int k=1;
	for(int i=1;i<L.length;i++){
		if(L.data[i]!=L.data[i-1])
			L.data[k++] = L.data[i];
	}
	L.length = k;
}
//7.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。
//算法思想:首先,按顺序不断取下两个顺序表表头较小的结点存入新的顺序表中.然后,看哪个表还有剩余,将剩下的部分加到新的顺序表后面.
bool Merga(SqList La,SqList Lb,SqList &Lc){
	int lenA = La.length;
	int LenB = Lb.length;
	int i=0,j=0,k=0;
	while(i<lenA && j<lenB){//找到第一个大于Lb的下标 
		if(La.data[i] <= Lb.data[j])  Lc.data[k++] = La.data[i++];
		else Lc.data[k++] = Lb.data[i++];	
	}
	while(i<lenA) Lc.data[k++] = La.data[i++];
        while(i<lenB) Lc.data[k++] = Lb.data[j++];
	Lc.length = k;
	return true;
} 
//8.已知在一维数组A[m+n]中依次存放两个线性表(a1,a2,a3,…,am)和(b1,b2,b3,…,bn)。
//试编写一个函数,将数组中两个顺序表的位置互换,即将(b1,b2b3,…,bn)放在(a1,a2a3,…,an的前面。
//算法思想:先将数组A[m+n]中的全部元素(a1,a2a3…,am,b1,b2b3;…,bn)原地逆置为(bnbn-1, n2,",D1,m,m-1,am-2, a1),
//再对前n个元素和后m个元素分别使用逆置算法,即可得到(b,b2, b3,…,bn、a1,a2,a3,…,an),从而实现顺序表的位置互换.
#include<stdio.h>
typedef int DataType;
void Reverse(DataType A[],int left, int right, int arraysize){
	//逆转(a1eft, aleft+1, aleft+2… aright)为( aright, aright-1,…, aleft)
	if (left>=right || right>=arraysize)
		return ;
	DataType temp = 0;
	int mid=(left+right)/2;
	for(int i=0;i<=mid-left;i++){
		temp = A[left+i]; 
		A[left+i] = A[right-i]; 
		A[right-i] = temp;
	}
}
void Exchange(DataType A[],int m, int n, int arraysize){
	/*数组A[m+n]中,从0到m-1存放顺序表(a1,a2,a3,…,am),从m到m+n-1存放顺序表
	(b1,b2,b3…,bn),算法将这两个表的位置互换*/ 
	Reverse(A, 0, m+
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问的解决,有助于将理论知识应用于实践中,增强问解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问的能力,并为未来的职业生涯奠定坚实的基础。
对于计算机专业的学生而言,参加各类比赛能够带来多方面的益处,具体包括但不限于以下几点: 技能提升: 参与比赛促使学生深入学习和掌握计算机领域的专业知识与技能,如编程语言、算法设计、软件工程、网络安全等。 比赛通常涉及实际问的解决,有助于将理论知识应用于实践中,增强问解决能力。 实践经验: 大多数比赛都要求参赛者设计并实现解决方案,这提供了宝贵的动手操作机会,有助于积累项目经验。 实践经验对于计算机专业的学生尤为重要,因为雇主往往更青睐有实际项目背景的候选人。 团队合作: 许多比赛鼓励团队协作,这有助于培养学生的团队精神、沟通技巧和领导能力。 团队合作还能促进学生之间的知识共享和思维碰撞,有助于形成更全面的解决方案。 职业发展: 获奖经历可以显著增强简历的吸引力,为求职或继续深造提供有力支持。 某些比赛可能直接与企业合作,提供实习、工作机会或奖学金,为学生的职业生涯打开更多门路。 网络拓展: 比赛是结识同行业人才的好机会,可以帮助学生建立行业联系,这对于未来的职业发展非常重要。 奖金与荣誉: 许多比赛提供奖金或奖品,这不仅能给予学生经济上的奖励,还能增强其成就感和自信心。 荣誉证书或奖状可以证明学生的成就,对个人品牌建设有积极作用。 创新与研究: 参加比赛可以激发学生的创新思维,推动科研项目的开展,有时甚至能促成学术论文的发表。 个人成长: 在准备和参加比赛的过程中,学生将面临压力与挑战,这有助于培养良好的心理素质和抗压能力。 自我挑战和克服困难的经历对个人成长有着深远的影响。 综上所述,参加计算机领域的比赛对于学生来说是一个全面发展的平台,不仅可以提升专业技能,还能增强团队协作、沟通、解决问的能力,并为未来的职业生涯奠定坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值