/*C语言数据结构 *普通算法实现稀疏矩阵装置 */ /*测试数据:mu:6 nu:6 tu:8 矩阵如下: 0 12 9 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 14 0 0 24 0 0 0 0 18 0 0 0 0 15 0 0 -7 0 0 三元组表示: 1 2 12 1 3 9 3 1 -3 3 6 14 4 3 24 5 2 18 6 1 15 6 4 -7 */ #include<stdio.h> #define N 10 //三元组 typedef struct { int i;//行下标 int j;//列下标 int e;//元素数值 }Triple; //原数组 typedef struct { Triple data[N+1]; int mu,nu,tu; }TS; //打印元素数值 void Print(TS m){ int k; for(k=1;k<=m.tu;k++){ printf("%-2d %-2d %-2d\n",m.data[k].i,m.data[k].j,m.data[k].e); } } //转置数组 void Trans(TS m,TS *t){ int p,q,col;//p:m数组的三元组下标 q: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++){//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++;//每找到一个就要向后移动一个 } } } } } main(){ TS M,T; int k;//循环变量 printf("请你输入数组行数 列数 非零元素个数:"); scanf("%d %d %d",&M.mu,&M.nu,&M.tu); printf("请你输入行下标 列下标 元素数值:\n"); for(k=1;k<=M.tu;k++){ scanf("%d %d %d",&M.data[k].i,&M.data[k].j,&M.data[k].e); } printf("数组转置之前为:\n"); Print(M); Trans(M,&T); printf("数组转置之后为:\n"); Print(T); }
/*C语言数据结构 *改进算法实现稀疏矩阵装置 */ /*测试数据:mu:6 nu:6 tu:8 矩阵如下: 0 12 9 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 14 0 0 24 0 0 0 0 18 0 0 0 0 15 0 0 -7 0 0 三元组形式: 1 2 12 1 3 9 3 1 -3 3 6 14 4 3 24 5 2 18 6 1 15 6 4 -7 */ #include<stdio.h> #define N 10 //三元组 typedef struct { int i;//行下标 int j;//列下标 int e;//元素数值 }Triple; //原数组 typedef struct { Triple data[N+1];//下标从1开始 int mu,nu,tu; }TS; //打印元素数值 void Print(TS m){ int k; for(k=1;k<=m.tu;k++){ printf("%-2d %-2d %-2d\n",m.data[k].i,m.data[k].j,m.data[k].e); } } //转置数组 void Trans(TS m,TS *t){ int p,q;//p:m数组的三元组下标 q:t数组的三元组下标 int col;//列数 int k;//循环变量 int num[N];//统计m每一列非零元素个数 int cpot[N]; // 转置后下标位置 t->mu = m.nu; t->nu = m.mu; t->tu = m.tu; if(t->tu){//非零元素存在 for(col=1;col<=m.nu;col++)//统计之前赋值0 num[col] = 0; for(k=1;k<=m.tu;k++)//统计每一列非零元素个数 ++num[m.data[k].j]; 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]; } } } main(){ TS M,T; int k;//循环变量 printf("请你输入数组行数 列数 非零元素个数:"); scanf("%d %d %d",&M.mu,&M.nu,&M.tu); printf("请你输入行下标 列下标 元素数值:\n"); for(k=1;k<=M.tu;k++){ scanf("%d %d %d",&M.data[k].i,&M.data[k].j,&M.data[k].e); } printf("数组转置之前为:\n"); Print(M); Trans(M,&T); printf("数组转置之后为:\n"); Print(T); }