【数据结构】第一章课后练习题——绪论

选择判断题

1、从逻辑上分可以把数据结构分为线性结构、非线性结构两大类。
2、数据结构中的逻辑结构说明数据元素之间的顺序关系,它依赖于数据的存储结构。:逻辑结构说明的是逻辑元素之间的联系(关系),严格说不应当是顺序关系。

简答题

1、根据数据元素之间的不同逻辑关系,通常将其划分为哪几类结构?

①集合结构:数据元素之间的关系是“属于同一个集合”
②线性结构:数据元素之间存在着一对一的关系。
③树型结构:数据元素之间存在着一对多的关系。
④图形结构:数据元素之间存在着多对多的关系。

2、请描述线性结构中数据元素与数据元素之间的关系特点。

线性结构的特点是数据元素之间是一种线性关系,数据元素“一个接一个的排列”。在线性结构中,有且仅有一个元素被称为“第一个”,除第一个元素之外其他元素均有唯一一个“前驱”;有且仅有一个元素被称为“最后一个”,除了最后一个元素之外其他元素有唯一一个“后继”。

3、请描述树型结构中数据元素与数据元素之间的关系特点。

树形存储结构,就是数据元素与元素之间存在着一对多关系的数据结构。在树形存储结构中,树的根结点没有前驱结点,其余的每一个节点有且仅有一个前驱结点,除了叶子节点没有后继节点之外,其它结点的后继节点可以有一个或多个。

4、常用的存储结构有哪几种?各自的特点是什么?

①顺序存储:把逻辑上相邻的元素存储在物理位置相邻的存储单元中。顺序存储结构是一种基本的存储表示方法,通常借助于程序设计语言中的数组来实现。
②链式存储:对逻辑上相邻的元素不要求物理位置也相邻的存储单元,元素间的逻辑关系通过附加的指针域来表示。
③索引存储:通过建立索引表存储结点信息的方法,其中索引表一般存储结点关键字和一个地址信息,可以通过该地址找到结点的其他信息。
④散列存储:根据结点的关键字直接计算出该节点的存储地址的方法。

5、简述算法和程序的区别。

一个算法若用程序设计语言来描述,则它就是一个程序。算法的含义与程序十分相似,但又有区别。一个程序不一定满足有穷性。例如,操作系统,只要整个系统不遭到破坏,它将永远不会停止,即使没有作业需要处理,它仍然处于动态等待中。因此,操作系统不是一个算法。另一方面,程序中的指令必须是机器可以执行的,而算法中的指令则没有这个限制。算法代表了对问题的解,而程序则是算法在计算机上的特定的实现。

6、试举一个数据结构的例子,叙述其逻辑结构、存储结构、运算3方面的内容。

比如学生成绩表,逻辑结构是线性结构,可以顺序存储,也可以链式存储,运算可以有插入、删除、查找。

7、运算是数据结构的一个重要方面。试举例说明两个数据结构的逻辑结构和存储方式完全相同,只是对于运算的定义不同,使得两个结构具有显著不同的特性。

比如顺序栈和循环队列,二者的逻辑结构都是线性结构,都采用顺序存储的方式存储,但它们运算不同,栈限定元素的插入和删除在栈顶进行,队列限定元素在队尾插入,队头删除,从而他们是不同的数据结构。

算法设计题

1、计算一元n次多项式的值,在这里插入图片描述
,输入x,n,a0,a1,…,an,输出多项式P(x,n)的值。设计算法求解,请选择合适的输入、输出格式,要求算法具有比较好的时间性能。

在这里插入图片描述
2、若一个人第一个月工资是1500,以后每一年的工资都在原基础上增加10%,那么第n年他的工资是多少?请分别用递归和递推的方法编写实现。
①递归的方法:
第n年的工资=第n-1年的工资*(1+10)%,当n>1时
第n年的工资=1500,当n=1时
②递推的方法:
第1年的工资=1500
第2年的工资=第1年的工资 *(1+10%),
第3年的工资=第2年的工资 *(1+10%),
依次类推…
③算法:

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
double fun;
printf("请输入第几年:\n");
cin>>n;
cout<<"这一年每月的工资为"<<fun1(n)<<"元"<<endl;
}
//方法一 递归
double fun1(int n)
{
if(n==1)
	return 1500;
else
	return fun(n-1)+fun(n-1)*0.1;
}
//方法二 递推
double fun2(int n)
{
double sum=1500;
for(int i=0;i<n;i++){
sum*=1.1;
}
return sum;
}

3、编写递归算法,计算xy的值。
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int F(int x,int y);
int main()
{
	int x,y;
	cout<<"请依次输入x,y的值并以空格键隔开"<<endl;
	cin>>x>>y;
	cout<<"F="<<F(x,y);
	return 0;
 } 
 
 int F(int x,int y)
 {
 	if(y==0)
 	{
 		return 1;
	 }
	if(y%2==0)
	{
		return F(x*x,y/2);
	}
	return x*F(x,y-1);
 }

4、编写算法实现在长度为n的有序整数数组中插入元素x,并分别计算在最好和最坏情况下各语句的执行次数。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int i,n,x,a[100];
	cout<<"输入总个数:"<<endl;//确定数组中的元素个数 
	cin>>n;
	cout<<"输入"<<n<<"个数,注意要升序:"<<endl;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];//将输入的n个数存入数组中 
	 } 
	cout<<"输入要插入的数"<<endl;
	cin>>x;
	i=n-1;
	while(i>=0&&x<a[i])
	{
		a[i+1]=a[i];
		i--;
	}
	i++;
	a[i]=x;
	for(int i=0;i<n+1;i++)
	{
		cout<<a[i];//输出插入后的数组
	}
	return 0;
}

最好情况下执行次数:1次
最坏情况下执行次数:n次

5、编写程序测试在最坏情况下,插入排序(n=0,250,500,750,1000)所用的时间。

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int a=clock();//从这里开始计时
	int n[10000];
	int i,j,k,q;
	int temp;
	
	cout<<"请输入q的个数:";//q的取值0,250,500,750,1000
	cin>>q;
	for(i=0;i<q;i++)
	{
		n[i]=rand();
		printf("%6d",n[i]);
	 } 
	printf("数组排序前效果如下\n");
	for(i=0;i<=q;i++)
	{
		cout<<n[i];
	 } 
	cout<<endl;
	
	for(i=1;i<=q;i++)
	{
		for(j=i-1;j>=0;j--)
		{
			if(n[j]<n[i])
			break;
		}
		if(j!=i-1)
		{
			temp=n[i];
			for(k=i;k>=j+1;k--)
			{
				n[k]=n[k-1];
			}
			n[j+1]=temp;
		}
	}
	cout<<"数组排序后效果如下"<<endl;
	for(i=0;i<=q;i++)
	{
		cout<<n[i];
	 } 
	 cout<<endl;
	 int b=clock();//到这里结束
	 int c=b-a;//算出来的单位是毫秒
	 cout<<"运行时间是"<<c<<"秒";
	 return 0; 
	
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第一章 绪论作业答案(共50分) 一、分析如下程序中 (1)~ (10)各语句的频度。(每个1分,共10分) Ex( ) { int i , j , t ; (1) for( i=1 ; i<10 ; i++) //n = (2) printf(“\n %d” , i ); //n = (3) for(i=1; i<=2; i++) //n = (4) printf(“\n”); //n = (5) for(i=1; i<=9; i++) //n = { (6) for(j=1; j <= i ; j++) //n = { (7) t = i * j ; //n = (8) printf(“]”,t); //n = } (9) for(j=1; j 0) { if(x > 100) {x -= 10 ; y -- ;} else x ++ ; } 问if 语句执行了多少次?(2分) y--执行了多少次?(2分) x ++执行了多少次?(2分) 三、回答问题(共25分) 书中16页的起泡排序如下: void bubble_sort(int a[],int n){ //将a中整数序列重新排列成自小至大有序的整数序列。 for(i=n-1,change=TRUE;i>=1&&change;--i){ change=FALSE; for(j=0;ja[j+1]{a[j]<-->a[j+1];change=TRUE; } } }//bubble_sort 1.(共15分)分析该算法的最佳情况 ,最坏情况和平均情况下各自的时间复杂度(给出分析思路与过程)。 (1) 最佳情况的时间复杂度分析(5分): (2) 最坏情况的时间复杂度分析(5分): (3) 平均情况的时间复杂度分析(5分): 2.(共10分)比较与C语言书中的起泡排序异同,并从时空效率角度说明谁更优。 四、完成如下选择题(每3分,共9分)。 1. 设f为原操作,则如下算法的时间复杂度是( )。 for (i = 1; i*i=1;i--) for(j=1;jA[j+1]) A[j]与A[j+1]对换; 其中n为正整数,则算法在最坏情况下的时间复杂度为( )。 A.O(n) B.O(nlog2n) C. O(n3) D. O(n2)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值