【数据结构实验四】数组

版权申明:

本实验的实验目的,实验内容,实验要求归东北大学所有,未经许可禁止转载。


实验四 数组

实验目的

掌握利用三元组实现稀疏矩阵的顺序存储;掌握三元组的基本操作,实现矩阵的转置。

实验内容

1. 通过结构体声明三元组类型和稀疏矩阵类型;

2. 实现矩阵的创建和输出;

3. 编写矩阵转置函数;

4. 在主函数中声明一个稀疏矩阵,转置后并输出。

源码:

#define MAXSIZE 12500
#include "stdafx.h"
#include <iostream>
using namespace std;

typedef int ElemType;
typedef int Status;

/***********类型定义***********/
typedef struct{
	int i, j;  //该非零元的行下标和列下标
	ElemType e;  //非零元的值
}Triple;

typedef struct{
	Triple data[MAXSIZE + 1];  //三元组的最大范围
	int mu, nu, tu;  //三元组的行、列、值
}TSMatrix;

/***********创建三元组***********/
void CreateSMatrix(TSMatrix &M, int mu, int nu, int tu){
	M.mu = mu;
	M.nu = nu;
	M.tu = tu;
	int k ;
	M.data[0].e = 0;
	cout << "行数:" << mu << " 列数:" << nu << endl;
	cout << "请输入:" << tu << " 个三元组(i j elem):" << endl;
	for(k = 1; k <= tu; k++){
		cin >> M.data[k].i >> M.data[k].j >> M.data[k].e;
	}
}

/***********显示三元组***********/
void PrintSMatrix(TSMatrix M){
	cout << endl;
	cout << "稀疏矩阵为: " << endl;
	int i, j, p;
	p = 1;
	for(i = 1; i <= M.mu; i++){
		for(j = 1; j <= M.nu; j++){
			if(M.data[p].i == i && M.data[p].j == j){
				cout << M.data[p].i << " " << M.data[p].j << " " << M.data[p].e << endl;
				p++;
			}
		}
	}
	cout << endl;
}

/***********矩阵转置***********/
Status TransposeSMatrix(TSMatrix M, TSMatrix &T){
	cout << "##########矩阵转置##########" << endl;
	int col, q, p;
	T.mu = M.nu;
	T.nu = M.mu;
	T.tu = M.tu;
	if(T.tu){
		q = 1;
		for(col = 1; col <= M.nu; ++col){
			for(p = 1; p <= M.tu; ++p){
				if(M.data[p].j == col){
					T.data[q].i = M.data[p].j;
					T.data[q].j = M.data[p].i;
					T.data[q].e = M.data[p].e;
					++q;
				}
			}
		}
	}
	return OK;
}

/***********主函数***********/
int main()
{
	TSMatrix A, B;
	CreateSMatrix(A, 4, 4, 5);
	PrintSMatrix(A);
	TransposeSMatrix(A, B);
	PrintSMatrix(B);
	return 0;
}
注意一下,显示三元组函数那边其实没有必要比较i和j,直接循环p其实就ok了,这个bug后来也没改,毕竟这样程序也可以用==、


运行结果:


一、填空题(每空1分,共20分) 1. 不包含任何字符(长度为0)的串 称为空串; 由一个或多个空格(仅由空格符)组成的串 称为空白串。 (对应严题集4.1①,简答题:简述空串和空格串的区别) 2. 设S=“A;/document/Mary.doc”,则strlen(s)= 20 , “/”的字符定位的位置为 3 。 4. 子串的定位运算称为串的模式匹配; 被匹配的主串 称为目标串, 子串 称为模式。 5. 设目标T=”abccdcdccbaa”,模式P=“cdcc”,则第 6 次匹配成功。 6. 若n为主串长,m为子串长,则串的古典(朴素)匹配算法最坏的情况下需要比较字符的总次数为 (n-m+1)*m 。 7. 假设有二维数组A6×8,每个元素用相邻的6个字节存储,存储器按字节编址。已知A的起始存储位置(基地址)为1000,则数组A的体积(存储量)为 288 B ;末尾元素A57的第一个字节地址为 1282 ;若按行存储时,元素A14的第一个字节地址为 (8+4)×6+1000=1192 ;若按列存储时,元素A47的第一个字节地址为 (6×7+4)×6+1000)=1276 。 8. 〖00年计算机系考研题〗设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 9188 。 答:考虑0行0列,(58列×61行+32行)×2字节+基址2048=9188?? 9. 三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素 的 行下标 、 列下标 和 元素值 。 10.求下列广义表操作的结果: (1) GetHead【((a,b),(c,d))】=== (a, b) ; //头元素不必加括号 (2) GetHead【GetTail【((a,b),(c,d))】】=== (c,d) ; …………………………
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值