数据结构 习题 第五章 多维数组和广义表 (C语言描述)

2024-04-30 05:32

本文主要是介绍数据结构 习题 第五章 多维数组和广义表 (C语言描述),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在复习数据结构,所以想把平时上课做的习题做个总结,如果大家有遇到这方面的问题就可以参考一下了,废话不多说,直接开始吧。

1、单选题
稀疏矩阵一般的压缩存储方法有两种,即( D)
A. 二维数组和三维数组
B. 三元组表和散列
C. 散列和十字链表
D. 三元组表和十字链表

三元组表:将表示稀疏矩阵的非零元素的三元组表按行优先(或列优先)的顺序(跳过零元素),则得到一个其结点均是三元组的线性表,此线性表的顺序存储结构称为三元组表。
三元组表是稀疏矩阵的一种顺序存储结构。
(当非零元素的位置或个数经常发生变化时,三元组表不适合做稀疏矩阵的存储结构)
此时可采用链表做为存储结构更为恰当,如:十字链表

2、判断题
线性表可以看成是广义表的特例,如果广义表中的每个元素都是原子,则广义表便成为线性表.

正确
广义表(Lists):又称列表,是线性表的推广
线性表的元素仅限于原子项,原子是作为结构上不可分割的成分,它可以是一个数或一个结构,若放松对表元素的这种限制,容许它们具有其自身独立的类型结构,这就产生了广义表。
为了区分原子和广义表,书写时用大写字母表示广义表,小写字母表示原子。
一个表的“深度”是指表展开后所含括号的层数。

3、判断题
广义表是线性表的推广,是一类线性数据结构。

错误
广义表不仅是线性表的推广,也是树的推广。

4、填空题
二维数组A[10][20]采用行序为主方式存储,每一个元素点一个存储单元,且A[0][0]的存储地址是200,则A[6][12]的地址是▁▁▁。

答案(填空1):
332

数组中任一元素A[i][j]的存储位置可用下列公式计算:
LOC( A[i][j] ) = LOC ( A[0][0] ) + ( i×n+j ) × L
这是因为数组元素 A[i][j] 的前面有 i 行,每一行的元素个数为 n,在第 i 行中 A[i][j] 的前面还有 j 个数组元素。L 仍然是每个数据元素所占存储单元的个数。
LOC( A[6][12] )= LOC ( A[0][0] ) + (6*20+12)*1 = 200 + 132 = 332

5、单选题
设矩阵A是一个对称矩阵,为了节省存储空间。将其下三角部分按行序存放在一维数组SA[0…n(n+1)/2-1]中,对任一下三角部分元素aij(i≥j)。在一维数组SA的下标位置k的值是( A)
A. i * ( i + 1 ) / 2 + j
B. j * ( j + 1 ) / 2 + i - 1
C. i * ( i - 1 ) / 2 + j
D. j * ( j - 1 ) / 2 + i - 1

6、填空题
广义表(a,(a,b),d,e,((i,j),k))的长度是▁▁▁,深度是▁▁▁。
答案(填空1):
5
答案(填空2):
3

7、单选题
一个 n * n 的对称矩阵,如果以行或列为主序采用压缩存储,其容量为(B)。
A. ( n + 1 ) * ( n + 1 ) / 2
B. ( n + 1 ) * n / 2
C. n * n
D. n * n / 2

8、填空题
有一个10阶对称矩阵A,采用压缩存储方式(以行序为主存储,且A[0][0]=1)。则A[8][5]的地址是▁▁▁。
答案(填空1):
42

(1+8)*8/2+5+1=42

9、单选题
N是一个5×8的二维数组,当N按行优先方式存储时,表示该数组的第10个元素的是(B )
A. N[2][2]
B. N[1][1]
C. N[1][2]
D. N[2][1]

1*8+1=9,N[1][1] 前面有九个元素,它是第十个元素。
下面补充一些关于对称矩阵的内容:

  • 对于一个n阶对称矩阵,第i行(0≤i<n)只需要存储i+1个元素,元素总数为:
    ∑ i = 0 n − 1 ( i + 1 ) = n ( n + 1 ) / 2 \sum_{i=0}^{n-1}(i+1)=\mathrm{n}(\mathrm{n}+1) / 2 i=0n1(i+1)=n(n+1)/2
  • 若i≥j,则A[i][j]在下三角矩阵中,A[i][j] 之前的i行一共有1+2+…+ i =i×(i+1)/2个元素,在第i行上,A[i][j] 之前有j个元素,因此有:
    k=i×(i+1)/2+j
  • 若i<j,则A[i][j]在上三角矩阵中。因为A[i][j] = A[j][i] ,所以只要交换上述对应关系式中的i和j即可得到:
    k=j×(j+1)/2+i
  • 若令I=max(i,j),J=min(i,j),得到:k=I×(I+1)/2+J (0≤k<n×(n+1)/2 )
    因此:
    LOC( A[i][j] ) = LOC( SA[k] ) = LOC( SA[0] ) + k×d
    = LOC(SA[0])+[I×(I+1)/2+J] ×d
  1. 设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为8,每个元素占一个地址空间,则a54的地址为( 21

注意,这题是a11为第一元素,而不是a00为第一元素,所以:
4*(4+1)/ 2 + 3 + 8 = 21

  1. 设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a00为第一元素,其存储地址为8,每个元素占一个地址空间,则a45的地址为( 27

这里a45是所在位置是上三角矩阵,所以为了方便运算,我们要把它转化为下三角矩阵,转化方法请看上面。
所以变成下三角矩阵以后,使用a54 进行计算:
5*(5+1)/ 2 + 4 + 8 = 15 + 4 + 8 =27

  • 补充:

  • L 表示 每个数据元素所占存储单元的个数。

  • 一维数组中任一元素 A[i] 的存储位置为:
    LOC( A[i] )= LOC (A [0]) + i * L (从0下标开始)
    LOC( A[i] )= LOC (A [1]) + ( i - 1 ) * L (从1下标开始)

  • 二维数组 A[m][n]:
    以行序为主序: LOC( A[i][j] )= LOC (A [0][0]) + ( i * n + j ) * L
    以列序为主序: LOC( A[i][j] )= LOC (A [0][0]) + ( j * m + i ) * L

我把我目前写的关于数据结构 题目的链接全部汇总整理在下面,有需要的小伙伴自己点击哈。

  • 数据结构 习题 第一章 概论
  • 数据结构 习题 第二章 线性表 (C语言描述)
  • 数据结构 习题 第三章 栈和队列 (C语言描述)
  • 数据结构 习题 第四章 串 (C语言描述)
  • 数据结构 习题 第五章 多维数组和广义表(C语言描述)
  • 数据结构 习题 综合复习

实验:

  • 数据结构 实验一 顺序表的操作
  • 数据结构 实验二 链表的基本操作
  • 数据结构 实验三 栈的基本运算
  • 数据结构 实验四 二叉树的操作
  • 数据结构实验五-马踏棋盘
  • 数据结构-顺序表的排序操作-冒泡排序

因为最近还在准备别的考试,所以目前就先更新这么多哈,后面有时间的话,还会再写一篇关于数据结构实验的题目,欢迎大家关注呦!

如果大家觉得对你们有帮助的话,可以点个赞再走吗,嘿嘿。
笔者使用的教材是高等教育出版社唐策善、李龙澍、黄刘生编著的《数据结构——用C语言描述》。
因为都是我自己打字,或者我的答案,可能会有错误的地方,如果有的话,欢迎大家指出。

这篇关于数据结构 习题 第五章 多维数组和广义表 (C语言描述)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948022

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

hdu2241(二分+合并数组)

题意:判断是否存在a+b+c = x,a,b,c分别属于集合A,B,C 如果用暴力会超时,所以这里用到了数组合并,将b,c数组合并成d,d数组存的是b,c数组元素的和,然后对d数组进行二分就可以了 代码如下(附注释): #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<que