⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3-3.c

📁 含有大量数据结构的源代码 请大家漫漫品味
💻 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 + -