数组和广义表

来源:互联网 发布:免费刷会员软件 编辑:程序博客网 时间:2024/05/22 21:48

1.稀疏矩阵的转置

#include<stdio.h>  #include<stdlib.h>  #define MAXSIZE 100  #define Status int  typedef struct{int i, j;//非零元的行下标和列下标  int e;}Triple;typedef struct{Triple data[MAXSIZE + 1];//非零元的三元组表,data[0]未用  int mu, nu, tu;//矩阵中的行数,列数,非零元个数  }TSMatrix;void Creat(TSMatrix *M){printf("输入mu,nu,tu\n");scanf("%d %d %d", &M->mu, &M->nu, &M->tu);printf("输入%d个非零元以及行列下标\n", M->tu);for (int i = 1; i <= M->tu; i++)scanf("%d %d %d", &M->data[i].i, &M->data[i].j, &M->data[i].e);}void Print(TSMatrix *M)//以矩阵的形式输出三元组表示的稀疏矩阵  {int i, j, k;int a[10][10] = { 0 };for (k = 1; k <= M->tu; k++){//将稀疏矩阵的非零元素存入二维数组  i = M->data[k].i;j = M->data[k].j;a[i][j] = M->data[k].e;}for (i = 1; i <= M->mu; i++){//输出二维数组  for (j = 1; j <= M->nu; j++)printf("%4d ", a[i][j]);printf("\n");}}Status Transpose(TSMatrix *M, TSMatrix *T)//普通算法{int p, q, col;//将M的行列转换为T的列行  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++){//扫描整个三元组表找到与col形同的  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;}Status FastTransposeSMatrix(TSMatrix *M, TSMatrix *T)//快速转置算法{int col, t, p, q;int cpot[10], num[10];T->mu = M->nu; T->nu = M->mu; T->tu = M->tu;if (T->tu){for (col = 1; col <= M->nu; ++col)   num[col] = 0;for (t = 1; t <= M->tu; ++t) ++num[M->data[t].j];       //求M中每一列非零元个数    //求第 col列中第一个非零元在T.data中的序号    cpot[1] = 1;for (col = 2; col <= M->nu; ++col)  cpot[col] = cpot[col - 1] + num[col - 1];for (p = 1; p<=M->tu; ++p) {col = M->data[p].j;  q = cpot[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;++cpot[col];//与列数相同时有关}//for    }//if     return 1;}int main(){TSMatrix M, T;Creat(&M);Print(&M);FastTransposeSMatrix(&M, &T);//Transpose(&M, &T);printf("稀疏矩阵转置后\n");Print(&T);return 0;}











1 0
原创粉丝点击