📄 3-3.c
字号:
#include "stdio.h"
#define MAX_TERMS 101
typedef struct {
int col;
int row;
int value;
} term;
term a[MAX_TERMS];
int COMPARE(int coef1,int coef2)
{
if(coef1<coef2)
return -1;
else if(coef1==coef2)
return 0;
else
return 1;
}
void transpose (term a[], term b[])
{
/* b 和a转置 */
int n, i, j, currentb;
n = a[ 0 ].value; /* 元素总数*/
b[0].row = a[0].col ;
b[0].col = a[0].row ;
b[0].value =n;
if (n > 0) { /*非零矩阵*/
currentb = 1;
for ( i =0; i < a[0].col; i++)
for ( j = 1; j <=n; j++)
if (a[j].col == i) {
b[currentb].row =a[j].col;
b[currentb].col =a[j].row;
b[currentb].value =a[j].value;
currentb++;
}
}
}
void storesum (term d [], int *totald, int row, int column, int *sum)
{ /*如果 *sum != 0, 则按照行标列标存储 */
if (*sum )
if ( *totald < MAX_TERMS) {
d [++*totald ].row = row;
d [ *totald].col = column;
d [*totald ].value = * sum;
*sum = 0;
}
else {
printf("Number of term in product exceeds %d \n",MAX_TERMS);
exit (1);
}
}
void Mult (term a[], term b[], term d[])
{ /* d=a×b*/
int i, j, column, totalb = b[ 0].value, totald = 0;
int rows_a = a [0].row, cols_a = a[0].col, totala = a[0].value;
int cols_b = b[0].col;
int row_being = 1, row = a [1].row, sum = 0;
term new_b[MAX_TERMS];
if ( cols_a != b[ 0 ].row ) {
printf("Incompatible matrices \n ");
exit(1);
}
transpose( b, new_b);
a [totala +1].row = rows_a;
new_b[totalb+1].row = cols_b;
new_b[totalb+1 ].col = 0;
for ( i =1; i <= totala; ) {
column = new_b [1].row;
for ( j =1; j <= totalb +1; ) { /* a的行和b的列相乘 */
if (a[ i ].row != row ) {
storesum ( d, &totald, row, column, &sum );
i = row_being;
for ( ; new_b[ j ].row == column; j++)
;
column = new_b[ j ].row;
}
else if (new_b[j].row != column ) {
storesum (d, &totald, row, column, &sum);
i= row_being;
column = new_b[j].row;
}
else switch (COMPARE ( a[ i ].col, new_b[ j ].col)) {
case -1:
i ++ ; /* a的下一个数据 */
break;
case 0 :
sum += ( a[ i++ ].value * new_b[ j++ ].value );
break;
case 1 :
j++; /*b的下一个数据 */
}
}
for ( ; a[ i ].row == row; i++ )
;
row_being = i; row = a [ i ].row;
} /*结束 */
d [ 0 ].row = rows_a;
d [ 0 ].col = cols_b;
d [ 0 ].value = totald;
}
void main()
{
term a[MAX_TERMS],b[MAX_TERMS],d[MAX_TERMS];
Mult(a,b,d);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -