行逻辑联接的顺序表实现矩阵转置及乘法

来源:互联网 发布:淘宝摄影师 编辑:程序博客网 时间:2024/06/11 01:08
//程序没有写对输入的排序的部分,所以输入的时候要按行列一次输入//例如:(1 1 1)(1 2 1)(1 3 1)(2 3 1)(3 1 1)。。。# include <stdio.h># include <malloc.h># include <stdlib.h># define MAXSIZE 10typedef struct Node{int x, y, z;}* PTRIPLE, TRIPLE;typedef union{TRIPLE data[MAXSIZE + 1];int nu, mu, tu;}TSMATRIX;void create (TSMATRIX * pT){printf("请输入矩阵行、列及有效元素个数(格式:%%d %%d %%d):");scanf("%d %d %d", &pT->data[0].x, &pT->data[0].y, &pT->data[0].z);printf("\n--------------------\n");for (int i = 1; i <= pT->data[0].z; ++i){printf("输入第%d个元素的行、列、值(格式:%%d %%d %%d):", i);scanf("%d %d %d", &pT->data[i].x, &pT->data[i].y, &pT->data[i].z);if (pT->data[i].x > pT->data[0].x || pT->data[i].y > pT->data[0].y){printf("输入有误!重新输入!\n");--i;}while (getchar() != '\n');}return;}void transpose (TSMATRIX * pT1, TSMATRIX * pT2)//求转置{pT2->data[0].x = pT1->data[0].y;pT2->data[0].y = pT1->data[0].x;pT2->data[0].z = pT1->data[0].z;int i, j;int cPot[MAXSIZE + 1] = {0};for (i = 1; i <= pT1->data[0].z; ++i)//对每一列的元素个数进行统计{for (j = 1; j <= pT1->data[0].y; ++j){if (pT1->data[i].y == j){++cPot[j];break;}}}for (i = 1; i <= MAXSIZE; ++i){printf("=%d", cPot[i]);}printf("=\n\n");int r = 1;int s = MAXSIZE;while (cPot[r] == 0)//取得第一个有元素的列{++r;}while (cPot[s] == 0)//取得倒数第一个有元素的列{--s;}int a = cPot[r];cPot[r] = 1;int x;for (i = r + 1; i <= s; ++i)//求得cpot的核心算法{x = cPot[i];cPot[i] = cPot[i - 1] + a;a = x;}for (i = 1; i <= MAXSIZE; ++i){printf("=%d", cPot[i]);}printf("=\n\n");for (i = 1; i <= pT1->data[0].z; ++i)//根据cpot求得转置矩阵{int x = cPot[pT1->data[i].y];pT2->data[x].x = pT1->data[i].y;pT2->data[x].y = pT1->data[i].x;pT2->data[x].z = pT1->data[i].z;++cPot[pT1->data[i].y];}return;}void traverse (TSMATRIX * pT)//遍历各元素{int i;for (i = 1; i <= pT->data[0].z; ++i){printf("(%d,%d,%d)  ", pT->data[i].x, pT->data[i].y, pT->data[i].z);}printf("\n");return;}void print (TSMATRIX * pT)//打印矩阵{printf("\n****************\n");int k = 1;bool change = true;for (int i = 1; i <= pT->data[0].x; ++i){for (int j = 1; j <= pT->data[0].y; ++j){change = true;for (k; k <= pT->data[0].z;){if (pT->data[k].x == i && pT->data[k].y == j){printf("%2d ", pT->data[k].z);++k;change = false;}break;}if (change){printf("%2d ", 0);}}printf("\n");}printf("****************\n\n");return;}int main(void){TSMATRIX ts1;TSMATRIX ts2;create(&ts1);traverse(&ts1);print(&ts1);printf("\n~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~\n");transpose(&ts1, &ts2);traverse(&ts2);print(&ts2);TSMATRIX ts3;multiply(&ts1, &ts2, &ts3);return 0;}

0 0
原创粉丝点击