实验目的
采用三元组表存储表示,求稀疏矩阵M转置函数T
实验内容
编程序并上机调试运行。
采用三元组表存储表示,求稀疏矩阵M转置函数T
编写程序
//采用三元组表存储表示,求稀疏矩阵M转置函数T
#include
#define MAXSIZE 100
typedef struct
{
int i,j;
int e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
//创建稀疏矩阵M
CreateSMatrix(TSMatrix *M)
{
int i,m,n,e,k;
printf(
scanf(
(*M).data[0].i=0;
printf(
for(i=1;i
{
do
{
printf(
scanf(
k=0;
if(m(*M).mu||n(*M).nu)
k=1;
if(m
k=1;
}while(k);
(*M).data[i].i=m;
(*M).data[i].j=n;
(*M).data[i].e=e;
}
printf(
return 1;
}
//输出稀疏矩阵M
void PrintSMatrix(TSMatrix M)
{
int i;
printf(
for(i=1;i
printf(
printf(
printf(
}
//求稀疏矩阵M的转置矩阵T
void TransposeSMatrix(TSMatrix M,TSMatrix *T)
{
int p,q,col;
(*T).mu=M.nu;
(*T).nu=M.mu;
(*T).tu=M.tu;
if((*T).tu)
{
q=1;
for(col=1;col
for(p=1;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 1;
}
//打印矩阵函数,以通常形式输出矩阵
void print(TSMatrix A)
{
int k=1,a,b;
int M[MAXSIZE][MAXSIZE];
printf(
printf(
for(a=0;a
{
for(b=0;b
M[a][b]=0;
}
while(k
{
M[A.data[k].i-1][A.data[k].j-1]=A.data[k].e;
k++;
}
for(a=0;a
{
printf(
for(b=0;b
printf(
printf(
}
printf(
printf(
}
//主函数
int main()
{
TSMatrix M,T;
printf(
CreateSMatrix(&M);
printf(
PrintSMatrix(M);
print(M);
TransposeSMatrix(M,&T);
printf(
PrintSMatrix(T);
print(T);
printf(
getchar();
return 0;
}
运行程序:
程序解析:
1.首先是将程序的开头写好,定义非零元个数最多为
100.
定义非零元的行下标,列下标,和非零元素为int型。由mu,nu,tu分别代表矩阵的行数,列数和非零元个数。
2.创建稀疏矩阵M。
创建一个稀疏矩阵,用scanf进行用户输入行数,列数及非零元个数。当i小于等于非零元个数时,进行以下的for循环,执行内循环的循环语句。当k不为0时,重复执行输入非零元素的行列值以及其值,若超出行数或列数或非零元个数,则跳出循环。加入外循环,执行外循环的三个语句,直到,i等于非零个数,跳出外循环。
3.输出稀疏矩阵
M
用PrintSMatrix函数输出稀疏矩阵,从i等于1循环执行到i等于非零元个数,使非零元的行列数一个一个输出。
4.求稀疏矩阵的转置矩阵。
用TransposeSMatrix函数实现稀疏矩阵M转置为矩阵T。让T的行等于M的列,T的列等于M的行。非零元素相等。当非零元素不等于零时,就执行if语句,if语句中两个for循环和一个if循环实现了MT矩阵行列的对调,按列序求转置。最后返回1.
5.打印函数,输出非零元素对应的位置
这里定义一个M的数组,当a小于行数数,执行内循环,使b的列数不断增加,赋值为0,在执行外循环,b变为1,执行内循环,在赋值为0,然后再跳出内循环,执行外循环,如此直到,a等于行数则跳出外循环。执行下面的while语句。当k
6.建立main函数。
Main函数直接调用各个函数,在M的后面打印出其普通排列,T后面也打印出其普通排列。
实验目的
采用三元组表存储表示,求稀疏矩阵M转置函数T
实验内容
编程序并上机调试运行。
采用三元组表存储表示,求稀疏矩阵M转置函数T
编写程序
//采用三元组表存储表示,求稀疏矩阵M转置函数T
#include
#define MAXSIZE 100
typedef struct
{
int i,j;
int e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
//创建稀疏矩阵M
CreateSMatrix(TSMatrix *M)
{
int i,m,n,e,k;
printf(
scanf(
(*M).data[0].i=0;
printf(
for(i=1;i
{
do
{
printf(
scanf(
k=0;
if(m(*M).mu||n(*M).nu)
k=1;
if(m
k=1;
}while(k);
(*M).data[i].i=m;
(*M).data[i].j=n;
(*M).data[i].e=e;
}
printf(
return 1;
}
//输出稀疏矩阵M
void PrintSMatrix(TSMatrix M)
{
int i;
printf(
for(i=1;i
printf(
printf(
printf(
}
//求稀疏矩阵M的转置矩阵T
void TransposeSMatrix(TSMatrix M,TSMatrix *T)
{
int p,q,col;
(*T).mu=M.nu;
(*T).nu=M.mu;
(*T).tu=M.tu;
if((*T).tu)
{
q=1;
for(col=1;col
for(p=1;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 1;
}
//打印矩阵函数,以通常形式输出矩阵
void print(TSMatrix A)
{
int k=1,a,b;
int M[MAXSIZE][MAXSIZE];
printf(
printf(
for(a=0;a
{
for(b=0;b
M[a][b]=0;
}
while(k
{
M[A.data[k].i-1][A.data[k].j-1]=A.data[k].e;
k++;
}
for(a=0;a
{
printf(
for(b=0;b
printf(
printf(
}
printf(
printf(
}
//主函数
int main()
{
TSMatrix M,T;
printf(
CreateSMatrix(&M);
printf(
PrintSMatrix(M);
print(M);
TransposeSMatrix(M,&T);
printf(
PrintSMatrix(T);
print(T);
printf(
getchar();
return 0;
}
运行程序:
程序解析:
1.首先是将程序的开头写好,定义非零元个数最多为
100.
定义非零元的行下标,列下标,和非零元素为int型。由mu,nu,tu分别代表矩阵的行数,列数和非零元个数。
2.创建稀疏矩阵M。
创建一个稀疏矩阵,用scanf进行用户输入行数,列数及非零元个数。当i小于等于非零元个数时,进行以下的for循环,执行内循环的循环语句。当k不为0时,重复执行输入非零元素的行列值以及其值,若超出行数或列数或非零元个数,则跳出循环。加入外循环,执行外循环的三个语句,直到,i等于非零个数,跳出外循环。
3.输出稀疏矩阵
M
用PrintSMatrix函数输出稀疏矩阵,从i等于1循环执行到i等于非零元个数,使非零元的行列数一个一个输出。
4.求稀疏矩阵的转置矩阵。
用TransposeSMatrix函数实现稀疏矩阵M转置为矩阵T。让T的行等于M的列,T的列等于M的行。非零元素相等。当非零元素不等于零时,就执行if语句,if语句中两个for循环和一个if循环实现了MT矩阵行列的对调,按列序求转置。最后返回1.
5.打印函数,输出非零元素对应的位置
这里定义一个M的数组,当a小于行数数,执行内循环,使b的列数不断增加,赋值为0,在执行外循环,b变为1,执行内循环,在赋值为0,然后再跳出内循环,执行外循环,如此直到,a等于行数则跳出外循环。执行下面的while语句。当k
6.建立main函数。
Main函数直接调用各个函数,在M的后面打印出其普通排列,T后面也打印出其普通排列。