三元组顺序表表示的稀疏矩阵的转置和加法运算的实现----《数据结构》

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>

#define MAXSIZE 225
#define N 9
typedef struct{
	int i,j;
	int e;
}Triple;

typedef struct{
	Triple data[MAXSIZE+1];
	int mu,nu,tu;
}TSMatrix;

int CreatSMatrix(TSMatrix &M){
	M.mu= N;
	M.nu = N;
	M.tu = 0;
	return 1;
}

void TransposeSMatrix(TSMatrix M,TSMatrix &T){
	T.mu = M.mu;
	T.nu = M.nu;
	T.tu = M.tu;
	int c=1;
	for(int i = 1;i<N;i++){
		for(int j = 1;j<N;j++){
			if(M.data[c].e!=0){
				T.data[c].e = M.data[c].e;
				T.data[c].i = M.data[c].j;
				T.data[c].j = M.data[c].i;
				c++;
			}
		}
	}
}
int InsertElem(TSMatrix *M,int row,int col,int e){
	int i,t,p;
	if(M->tu>=MAXSIZE){
		printf("\nError:Insert position is beyond the arrange.\n");
		return 0;
	}
	p=1;
	if(M->tu==0){
		M->data[p].i = row;
		M->data[p].j = col;
		M->data[p].e = e;
		M->tu++;
		return 1;
	}

for(t=1;t<=M->tu;t++)//寻找合适的插入位置
        if((row>=M->data[t].i)&&(col>=M->data[t].j))
                p++;
    if(row==M->data[t-1].i && col==M->data[t-1].j){//插入前,该元素已经存在
        M->data[t-1].e=e;
        return 1;
    }
    for(i=M->tu;i>=p;i--){//移动p之后的元素
        M->data[i+1].i=M->data[i].i;
        M->data[i+1].j=M->data[i].j;
        M->data[i+1].e=M->data[i].e;
    }
    //插入新元素
    M->data[p].i=row;
    M->data[p].j=col;
    M->data[p].e=e;
    M->tu++;
    return 1;  

}

void AddSMatrix(TSMatrix M,TSMatrix T,TSMatrix &W){
	int c=1;
	for(int i = 1;i<=W.mu;i++){
		for(int j = 1;j<=W.nu;j++){
			if(i==M.data[c].i&&j==M.data[c].j&&i==T.data[c].i&&j==T.data[c].j){

				W.data[c].e= M.data[c].e +T.data[c].e;
				W.data[c].i = i;
				W.data[c].j = j;
				W.tu++;
				c++;}
			else if(i==M.data[c].i&&j==M.data[c].j){
				W.data[c].e= M.data[c].e;
				W.data[c].i = i;
				W.data[c].j = j;
				W.tu++;
				c++;
			}else if(i==T.data[c].i&&j==T.data[c].j){
				W.data[c].e=T.data[c].e;
				W.data[c].i = i;
				W.data[c].j = j;
				W.tu++;
				c++;
			}
		}
	}
}
void PrintfSMatrix(TSMatrix *M){
	int i,j,p=1;
	if(M->tu==0){
		printf("0矩阵");
	    exit(0);
	}
	for(i=1;i<=M->mu;i++){
		for(j=1;j<=M->nu;j++){
			if(i==M->data[p].i&&j==M->data[p].j){
				printf("%d\t",M->data[p].e);
				p++;
			}else{
				printf("0\t");
			}
		}
		printf("\n");
	}
	printf("\n");
} 

int main(){
	TSMatrix M,T,W;
	CreatSMatrix(M);
	CreatSMatrix(T);
	CreatSMatrix(W);
	int r,c,e,n,x,p=1;
	printf("请输入非零元素的个数;");
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		printf("\请输入非零元素的行数列数及非零元素");
		scanf("%d %d %d",&r,&c,&e);
		InsertElem(&M,r,c,e);
	}

	for(int i=1;i<=M.mu;i++){
		for(int j=1;j<=M.nu;j++){
			if(i==M.data[p].i&&j==M.data[p].j){
				printf("%d\t",M.data[p].e);
				p++;
			}else{
				printf("0\t");
			}
		}
		printf("\n");
	}
	while(1){
		printf("1.转置  2.相加\n输入相应编号执行操作:");
		scanf("%d",&x);
		switch(x){
			case 1:
				TransposeSMatrix(M,T);
				PrintfSMatrix(&T);
				break;
			case 2:
				AddSMatrix(M,T,W);
				PrintfSMatrix(&W);
				exit(0);
		}
	}

	return 0;
}
时间: 2024-10-16 02:35:14

三元组顺序表表示的稀疏矩阵的转置和加法运算的实现----《数据结构》的相关文章

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结

稀疏矩阵的三元组顺序表存储及矩阵相乘算法小结 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 一:稀疏矩阵的三元组顺序表数据结构 typedef int ElemType; typedef struct { intx, y;  //该非零元素的行下标和列下标 ElemTypee; //该非零元素的值 } Triple; typedef struct { Tripledata[MAXSIZE]; //非零元素三元组顺序表 intmu, nu, t

稀疏矩阵的三元组顺序表的C语言实现

对于没有排序功能的集合来说,都可以使用java.util.Collections.sort()方法进行排序,它除了集合对象以外,还需要提供一个比较器.如果列表中的元素全部都是相同的类型,并且这个类实现了Comparable接口,就可以简单的调用Collections.sort()方法,如果这个类没有实现comparable接口,那么可以创建一个比较器传递一个Comparator实例作为Sort()的第二个参数进行排序,另外,如果不想使用默认的分类顺序进行排序,同样也可以传递一个Comparato

稀疏矩阵的三元组顺序表存储结构表示及实现

#define MAX_SIZE 100 struct Triple { int i, j;//行下标,列下标 ElemType e;//非零元素值 }; struct TSMatrix { Triple data[MAX_SIZE + 1];//非零元三元组表,data[0]未用 int mu, nu, tu;//矩阵的行数,列数,非零元个数 }; int comp(int c1, int c2){//比较这个数c1和c2的大小关系 if (c1 < c2) return -1; if (c1

5-2-三元组顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 三元组顺序表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试数据下

5-3-行逻辑链接的顺序表(稀疏矩阵)-数组和广义表-第5章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第5章  数组和广义表 - 行逻辑链接的顺序表(稀疏矩阵) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c        相关测试

矩阵压缩存储之三元组顺序表

形态: 实现: /***************************************** 稀疏矩阵的三元组顺序表存储表示 by Rowandjj 2014/5/3 ******************************************/ #include<IOSTREAM> using namespace std; #define MAXSIZE 12500//非零元个数的最大值 typedef int ElemType; typedef struct _DATA_

C#顺序表

1 数据是外部世界的载体,能够被计算机处理加工.2数据元素是数据的基本单位,如,学生的姓名.性别.班级等等. 3数据对象是数据的一个集合,如 人类,狗类,等等属于数据对象,对象里又有数据元素 4数据类型,如整形,字符串,结构体等等, 5.数据结构通常分为4种,5.1集合 如HashSet<T>类主要是设计用来做高性能集运算的,(交集.并集.差集) 后续再谈HashSet<>. 5.2线性结构 数据元素从在一对一的关系 如 数组.list<>.Stack<>.

顺序表实验2

<数据结构> 实验报告 题目:_顺序表的实现 学号:___________ 姓名:___________ 东南大学计算机系 实验题目 一.    实验目的 1.    掌握顺序表的基本操作,实现顺序表的插入.删除.查找等基本运算. 二.    实验内容 1.                       完善顺序表的定义,并运用其实现线性表的操作. 2.                       (课上任务) 选题一:集合的交.并.差运算 [问题描述]         编制一个能演示执行集合的

(数据结构第五章)行逻辑链接的顺序表

/*******************行逻辑链接的顺序表*****************/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXSIZE 12500 /// 假设非零元个数最大值为12500 #define MAXRC 12500 ///假设的每行的个数的最大值12500 #define ERROR -1 typedef stru