提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、综合应用题
  • 总结

前言

提示:这里可以添加本文要记录的大概内容:


提示:以下是本篇文章正文内容,下面案例可供参考

一、综合应用题

  1. 设数组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;}}}
    }
    
  2. 关于浮点型数组 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);
      }
      
  3. 试设计一个算法,将数组 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--;}}
    }
    
  4. 设有一元素为整数的线性表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;
    }
    
  5. 设计一个算法,对给定的一个整型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;}
    }
    
  6. 简要介绍稀疏矩阵的三元组存储结构特点,并实现稀疏矩阵的基本操作。

    1. 给定稀疏矩阵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;         列标}}}
      }
      
    2. 查找给定元素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;}
      }
      
  7. 假设稀疏矩阵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];}}}}
    }
    
  8. 假设稀疏矩阵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];
    }
    
  9. 假设稀疏矩阵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数据结构(四)数组、矩阵与广义表相关推荐

  1. 天勤2022数据结构(六)图

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 天勤2022数据结构(六)图 前言 一.基础算法 例题 Prim算法 Kruskal算法 Dijkstra算法 Floyd算法 拓扑排 ...

  2. 2022天勤考研数据结构笔记 第2章 线性表

    2022天勤考研数据结构笔记 第2章 线性表(更新中) 第2章 线性表 2.1 结构体定义 2.2 顺序表 2.3 单链表 2.4 双链表 2.5 循环链表 2.6 逆置问题(408重要考点) 第2章 ...

  3. “数组、矩阵与广义表”学习提纲

    文章目录 前言 数组 多维数组的存储方式 矩阵 常见的特殊矩阵 对称矩阵的压缩存储计算 三角矩阵的压缩存储计算 三对角矩阵的压缩存储计算 稀疏矩阵的压缩存储方式 广义表 广义表的属性 广义表的存储方式 ...

  4. 数据结构(C语言)-广义表

    广义表 一.广义表的定义和运算 1.广义表的定义 2.广义表的性质 二.广义表的存储 1.头尾表示法 2.孩子兄弟表示法 广义表是线性表的推广,也称为列表(Lists).线性表中的元素仅限于单个数据元 ...

  5. 18版考研数据结构天勤课后习题代码-数组、矩阵与广义表【完】

    #include <iostream> using namespace std; #define maxSize 101 /* //把非零元素移动到数组前端  天勤P122(二)1 voi ...

  6. 第五章 数组、矩阵与广义表

  7. 数据结构:串、数组和广义表

    串 线性结构:线性表.栈和队列.串与数组和广义表 串的逻辑结构和线性表极为相似,区别仅在于串的数据对象限定为字符集.在基本操作上,串和线性表有很大差别.线性表的基本操作主要以单个元素作为操作对象,如查 ...

  8. 数据结构串、数组和广义表

    整本书的知识点,点击右方链接:整本书笔记知识点 文章目录 四.串.数组和广义表 4.1.串的定义 4.2.案例引入 4.3.串的类型定义.存储结构及其运算 4.3.1.串的抽象类型定义 4.3.2.串 ...

  9. 【Leetcode 专题五】数组和哈希表

    目录 一.前言 二.解题思路和代码整理 2.1.数组重建 Leetcode283. 移动零 Leetcode27. 移除元素 Leetcode26. 删除有序数组中的重复项 2.2.数组双指针 Lee ...

  10. c语言数据结构大作业,数据结构大作业——树(和广义表)

    数据结构大作业--树(和广义表) 以广义表形式输入一棵树,然后以合适的比例将这棵树展示出来 (如何构造一个广义表已经略去) 对于广义表化的树,我们采用的树节点类似二叉链表形式的存储. 首先设计结点内容 ...

最新文章

  1. mysql 不join的原因
  2. java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题
  3. oracle 查看监听命令_linux下使用Oracle常用命令
  4. cnetos7 mysql5.6 utf8设置_CentOS7下安装MySQL 5.6修改字符集为utf8并开放端口允许远程访问...
  5. AI圣经《深度学习》作者斩获2018年图灵奖,100 万奖励!
  6. SpringCloud观后感
  7. sap模块介绍_一分钟掌握SAP小知识-系统基本操作
  8. 找找看XSS漏洞!!!
  9. xcode 重新来过openssl项目历程
  10. 使用Gogs搭建Git服务器
  11. UHF-RFID基础知识
  12. 网站中应用QQ一键登录,详细讲解和范例
  13. 网站smtp服务器,SMTP服务器
  14. C语言的C11 标准有哪些改进的地方?C11 为何不如 C++11 流行?
  15. Layered Architecture 分层架构(完整翻译)
  16. 数字签名/数字证书/对称/非对称加密/CA 等概念明晰
  17. C++捕获全屏(截全屏)
  18. GIS 二次开发概述 (整理)
  19. 电商项目商品详情页架构设计
  20. struts2 common-fileupload上传文件大小限制 - hanxin830311 - JavaEye技术网站

热门文章

  1. 调试Python代码
  2. 鸟哥Linux 私房菜
  3. 计算机毕业设计之流浪宠物管理系统
  4. 敏感词过滤算法的实现
  5. 借助Bilibili Evolved批量下载b站视频
  6. Centos7 tomcat优化
  7. Mysql常用命令笔记
  8. ios 手势返回监听方法
  9. Linux文件压缩解压命令
  10. linux快捷键停止抓包命令,【linux命令】Linux抓包命令tcpdump以及常见抓包使用方法...