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


    选择判断题

    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
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

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

    #include
    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);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

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

    #include
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

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

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

    #include
    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; 
    	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
  • 相关阅读:
    app自动化测试——capability 配置参数解析
    【hcie-cloud】【2】华为云Stack解决方案介绍、缩略语整理 【下】
    vscode使用delve调试golang程序
    文件和目录
    c语言练习题79:设计停⻋系统
    SpringBoot MVC使用Gson,序列化LocalDate,LocalDateTime
    C ++ 类 | 类与函数(Function)_5
    空调原理与结构、制冷剂类型及相关先进技术
    HBRD-212/5电源监视继电器
    基于51单片机十字路口交通灯仿真紧急+黄灯5s
  • 原文地址:https://blog.csdn.net/manerzi/article/details/127667350