天勤2022数据结构(四)数组、矩阵与广义表
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、综合应用题
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
提示:以下是本篇文章正文内容,下面案例可供参考
一、综合应用题
设数组A[0,…,n-1]的n个元素中有多个零元素,设计一个算法,将A中所有的非零元素依次移动到A数组的前端
void move(int A[], int n){int i = -1, j, temp;for(j = 0; j<n; j++){if(A[j] != 0){i++;if(i != j){temp = A[i];A[i] = A[j];A[j] = temp;}}} }
关于浮点型数组 A[0,…,n-1],试设计实现下列运算的递归算法
求数组A中的最大值。
float findmax(float A[], int i, int j){if(i == j){return A[i];}return A[i] > findmax(A, i+1, j)? A[i]: findmax(A, i+1, j); }
求数组中n个数之和
float sum(float A[], int i, int j){if(i == j){return A[i];}return A[i] + sum(A[i], i+1, j); }
求数组中n个数的平均值
float avg(float A[], int i, int j){if(i == j){return A[i];}return (A[i] +(j-i) * avg(A, i+1, j)) / (j-i+1); }
试设计一个算法,将数组 A[0,…,n-1]中 所有奇数移到偶数之前。要求不另增加存储空间,且时间复杂度为O(n)
void divide(int A[], int n){int i = 0, j = n - 1, temp;while(i<j){while(i<j && A[i]%2 == 1){ 找第一个偶数i++;}while(i<j && A[j]%2 == 0){ 找最后一个奇数j--;}if(i<j){temp = A{i];A[i] = A{j];A[j] = temp;i++;j--;}} }
设有一元素为整数的线性表L,存放在一维数组A[0,…,n-1]中,设计一个算法,以A[n-1]为参考量,将该 数组分为左右两个部分 ,其中左半部分的元素值均小于等于A[n-1],右半部分的元素值均大于A[n-1],A[n-1]则位于这两部分之间要求结果仍存放在数组A中
快排划分
void divide(int A[], int n){int temp;int i = 0, j = n - 1;temp = A[i];A[i] = A[j];A[j] = temp;temp = A[i]; 相当与把n-1位置元素放到0位置上,仍以0位置元素为参考量while(i!=j){while(i<j && A[j]>temp) 后往前 找第一个比temp小的数j--;if(i<j){A[i] = A[j];i++;}while(i<j && A[i]<temp){ 前往后 找第一个比temp大的数j++if(i<j){A[j] = A[i];j--;}}A[i] = temp; }
设计一个算法,对给定的一个整型m×nm×nm×n矩阵A,统计这个矩阵中具有下列特征的元素个数并输出它们的坐标及数值:它们既是所在行中的最小值,又是所在列中的最小值;或者它们既是所在行中的最大值,又是所在列中的最大值。假设矩阵中元素各不相同,要求结果在处理过程中用输出语句输出
三重循环
第一重 第二重:行最小
第三重:列最小void printmin(int A[][maxSize], int m, int n){int i, j, k, min, minIndex;int flag;for(i = 0; i<m; i++){min = A[i][0];minIndex = 0;for(j = 0; j<n; j++){if(A[i][j] < min){min = A[i][j];minIndex = j;}flag = 1;for(k = 0; k<m; k++){if(min>A[k][minIndex]){flag = 0;break;}}if(flag)cout<<min<<",["<<i<<","<<minIndex<<"]"<<" ";}cout<<end;} }void printmax(int A[][maxSize], int m, int n){int i, j, k, max, maxIndex;int flag;for(i = 0; i<m; i++){max = A[i][0];maxIndex = 0;for(j = 0; j<n; j++){if(A[i][j] > max){max = A[i][j];maxIndex = j;}flag = 1;for(k = 0; k<m; k++){if(max<A[k][maxIndex]){flag = 0;break;}}if(flag)cout<<max<<",["<<i<<","<<maxIndex<<"]"<<" ";}cout<<end;} }
简要介绍稀疏矩阵的三元组存储结构特点,并实现稀疏矩阵的基本操作。
给定稀疏矩阵A(int型),创建其三元组存储结构B
三元组存储结构是一种顺序结构,是顺序表。表中每个结点对应稀疏矩阵的一个非零元素,其中包括3个字段,分别为该元素的值,行下标和列下标。
用第0行的第1个元素存储矩阵中非零元素的个数,第0行的第2个元素存储矩阵的行数,第0行的第3个元素存储矩阵的列数void create(int A[][maxSize], int m, int n, int B[][3]){int i, j;, k = 1;for(i = 0; i<m; i++){for(j = 0; j<n; j++){if(A[i][j] != 0){B[k][0] = A[i][j]; 值B[k][1] = i; 行标B[k][2] = j; 列标}}} }
查找给定元素x是否在矩阵中。
int search(int B[][3], int x){int i, t;t = B[0][0]; 非零元素个数i = 1;while(i<t && B[i][0]!=x){i++;}if(i<=t){return 1;}else{return 0;} }
假设稀疏矩阵A采用三元组表示,编写一个函数,计算其转置矩阵B,要求B也采用三元组表示。
两重循环 colSize×elemSizecolSize × elemSizecolSize×elemSize
void transpose(int A[][3], int B[][3]){B[0][0] = A[0][0];B[0][1] = A[0][2];B[0][2] = A[0][1];int index = 1;if(B[0][0]>0){for(int col = 0; col<B[0][1]; col++){for(int j = 1; j<=B[0][0]; j++){if(A[j][2] == col){B[index][0] = A[j][0];B[index][1] = A[j][2];B[index][2] = A[j][1];}}}} }
假设稀疏矩阵A和B(两矩阵行列数对应相等)都采用三元组表示,编写一个函数,计算C=A+B,要求C也采用三元组表示,所有矩阵均为int型。
注意 相加可能为0
void add(int A[][3], int B[][3], int C[][3]){int i=1, j=1, k=1, m;while(i<=A[0][0] && j<=B[0][0]){if(A[i][1] == B[j][1]){if(A[i][2] < B[j][2]){C[k][0] = A[i][0];C[k][1] = A[i][1];C[k][2] = A[i][2];k++;i++;}else if(A[i][2] > B[j][2]){C[k][0] = B[j][0];C[k][1] = B[j][1];C[k][2] = B[j][2];k++;j++;}else{m = A[i][0] + B[j][0];if(m!=0){C[k][0] = m;C[k][1] = A[j][1];C[k][2] = A[j][2];k++;}i++;j++;}}else if(A[i][1] < B[j][1]){C[k][0] = A[i][0];C[k][1] = A[i][1];C[k][2] = A[i][2];k++;i++;}else{C[k][0] = B[j][0];C[k][1] = B[j][1];C[k][2] = B[j][2];k++;j++;}}while(i<=A[0][0]){C[k][0] = A[i][0];C[k][1] = A[i][1];C[k][2] = A[i][2];k++;i++;}while(j<=B[0][0]){C[k][0] = B[j][0];C[k][1] = B[j][1];C[k][2] = B[j][2];k++;j++;}C[0][0] = k - 1;C[0][1] = A[0][1];C[0][2] = A[0][2]; }
假设稀疏矩阵A和B(分别为m×nm×nm×n和n×kn×kn×k矩阵)采用三元组表示,编写一个函数,计算C=A×BC=A×BC=A×B,要求CCC也是采用三元组表示的稀疏矩阵。
int getValue(int D[][maxSize], int i, int j){int k = 1;while(k<=D[0][0] && (D[k][1] != i || D[k][2] != j))k++;if(k<=D[0][0])return D[k][0];elsereturn 0; } void mul(int A[][3], int B[][3], int C[][3], int m, int n, int k){int i, j, l, p=1, s;for(i = 0; i<m; i++){for(j = 0; j<k; j++){s = 0;for(l = 0; l<n; l++){s += getValue(A, i, l) * getValue(B, l, j);if(s != 0){C[p][0] = s;C[p][1] = i;C[p][2] = j;p++;}}}}C[0][0] = p-1;C[0][1] = m;C[0][2] = k; }
总结
提示:这里对文章进行总结:
天勤2022数据结构(四)数组、矩阵与广义表相关推荐
- 天勤2022数据结构(六)图
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 天勤2022数据结构(六)图 前言 一.基础算法 例题 Prim算法 Kruskal算法 Dijkstra算法 Floyd算法 拓扑排 ...
- 2022天勤考研数据结构笔记 第2章 线性表
2022天勤考研数据结构笔记 第2章 线性表(更新中) 第2章 线性表 2.1 结构体定义 2.2 顺序表 2.3 单链表 2.4 双链表 2.5 循环链表 2.6 逆置问题(408重要考点) 第2章 ...
- “数组、矩阵与广义表”学习提纲
文章目录 前言 数组 多维数组的存储方式 矩阵 常见的特殊矩阵 对称矩阵的压缩存储计算 三角矩阵的压缩存储计算 三对角矩阵的压缩存储计算 稀疏矩阵的压缩存储方式 广义表 广义表的属性 广义表的存储方式 ...
- 数据结构(C语言)-广义表
广义表 一.广义表的定义和运算 1.广义表的定义 2.广义表的性质 二.广义表的存储 1.头尾表示法 2.孩子兄弟表示法 广义表是线性表的推广,也称为列表(Lists).线性表中的元素仅限于单个数据元 ...
- 18版考研数据结构天勤课后习题代码-数组、矩阵与广义表【完】
#include <iostream> using namespace std; #define maxSize 101 /* //把非零元素移动到数组前端 天勤P122(二)1 voi ...
- 第五章 数组、矩阵与广义表
- 数据结构:串、数组和广义表
串 线性结构:线性表.栈和队列.串与数组和广义表 串的逻辑结构和线性表极为相似,区别仅在于串的数据对象限定为字符集.在基本操作上,串和线性表有很大差别.线性表的基本操作主要以单个元素作为操作对象,如查 ...
- 数据结构串、数组和广义表
整本书的知识点,点击右方链接:整本书笔记知识点 文章目录 四.串.数组和广义表 4.1.串的定义 4.2.案例引入 4.3.串的类型定义.存储结构及其运算 4.3.1.串的抽象类型定义 4.3.2.串 ...
- 【Leetcode 专题五】数组和哈希表
目录 一.前言 二.解题思路和代码整理 2.1.数组重建 Leetcode283. 移动零 Leetcode27. 移除元素 Leetcode26. 删除有序数组中的重复项 2.2.数组双指针 Lee ...
- c语言数据结构大作业,数据结构大作业——树(和广义表)
数据结构大作业--树(和广义表) 以广义表形式输入一棵树,然后以合适的比例将这棵树展示出来 (如何构造一个广义表已经略去) 对于广义表化的树,我们采用的树节点类似二叉链表形式的存储. 首先设计结点内容 ...
最新文章
- SAP零售:补货 Vs 多步骤补货
- Django框架(22.Django中设置session以及session对象及方法)
- DDR3布线的那些事儿(二)
- 安卓dts音频解码_DTS音效、解码、编码概念剖析
- 如何判断当前请求的API类型
- Java实现将日志信息存到TXT中
- [Mac入门]如何在Mac下显示Finder中的所有文件
- 支付宝沙箱环境下模拟下单流程
- 软工作业PSP与单元测试训练 15100231
- 每日一句 i'm by disposition one of life's neutrals,a human Switzerland
- PIC16F887 实战编程 单片机编程 基础实验教程
- js获取chrome浏览器版本信息
- 顺序栈基本操作代码实现
- Cesium 之实现房屋模型拆解
- 如何使用虚拟机运行“小HomeKit”智汀家庭云
- 零基础如何学习自动化测试
- C++ scanf()函数
- Unity:SLG游戏画线模块
- 最小的可重现示例Minimal reproducible example
- 电脑常用软件,让你的电脑更加便捷的黑科技软件