Пример #1
0
void main()
{
	TSMatrix A, B;
	printf("创建矩阵A: ");
	CreateSMatrix(&A);
	PrintSMatrix(A);
	FastTransposeSMatrix(A, &B);
	printf("矩阵B(A的快速转置): ");
	PrintSMatrix(B);
	DestroySMatrix(&A);
	DestroySMatrix(&B);
}
Пример #2
0
 void SubtSMatrix(CrossList M,CrossList N,CrossList *Q)
 { /* 初始条件:稀疏矩阵M与N的行数和列数对应相等。操作结果:求稀疏矩阵的差Q=M-N */
   int i;
   OLink pq,pm,pn;
   if(M.mu!=N.mu||M.nu!=N.nu)
   {
     printf("两个矩阵不是同类型的,不能相减\n");
     exit(OVERFLOW);
   }
   (*Q).mu=M.mu; /* 初始化Q矩阵 */
   (*Q).nu=M.nu;
   (*Q).tu=0; /* Q矩阵元素个数的初值为0 */
   InitSMatrixList(Q); /* 初始化Q的表头指针向量 */
   for(i=1;i<=M.mu;i++) /* 按行的顺序相减 */
   {
     pm=M.rhead[i]; /* pm指向矩阵M的第i行的第1个结点 */
     pn=N.rhead[i]; /* pn指向矩阵N的第i行的第1个结点 */
     while(pm&&pn) /* pm和pn均不空 */
     {
       pq=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
       switch(comp(pm->j,pn->j))
       {
         case -1: *pq=*pm; /* M的列<N的列,将矩阵M的当前元素值赋给pq */
                  InsertAscend(Q,pq); /* 将结点pq按行列值升序插到矩阵Q中 */
                  pm=pm->right; /* 指针向后移 */
                  break;
	 case  0: *pq=*pm; /* M、N矩阵的列相等,元素值相减 */
                  pq->e-=pn->e;
                  if(pq->e!=0) /* 差为非零元素 */
                    InsertAscend(Q,pq); /* 将结点pq按行列值升序插到矩阵Q中 */
                  else
                    free(pq); /* 释放结点 */
                  pm=pm->right; /* 指针向后移 */
                  pn=pn->right;
                  break;
         case  1: *pq=*pn; /* M的列>N的列,将矩阵N的当前元素值赋给pq */
                  pq->e*=-1; /* 求反 */
                  InsertAscend(Q,pq); /* 将结点pq按行列值升序插到矩阵Q中 */
                  pn=pn->right; /* 指针向后移 */
       }
     }
     while(pm) /* pn=NULL */
     {
       pq=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
       *pq=*pm; /* M的列<N的列,将矩阵M的当前元素值赋给pq */
       InsertAscend(Q,pq); /* 将结点pq按行列值升序插到矩阵Q中 */
       pm=pm->right; /* 指针向后移 */
     }
     while(pn) /* pm=NULL */
     {
       pq=(OLink)malloc(sizeof(OLNode)); /* 生成矩阵Q的结点 */
       *pq=*pn; /* M的列>N的列,将矩阵N的当前元素值赋给pq */
       pq->e*=-1; /* 求反 */
       InsertAscend(Q,pq); /* 将结点pq按行列值升序插到矩阵Q中 */
       pn=pn->right; /* 指针向后移 */
     }
   }
   if((*Q).tu==0) /* Q矩阵元素个数为0 */
     DestroySMatrix(Q); /* 销毁矩阵Q */
 }
Пример #3
0
 /* main5-3.c 检验bo5-3.c的主程序(与main5-2.c很相像) */
 #include"c1.h"
 typedef int ElemType;
 #include"c5-3.h" /* 此行与main5-2.c不同 */
 #include"bo5-3.c" /* 此行与main5-2.c不同 */
 void main()
 {
   RLSMatrix A,B,C; /* 此行与main5-2.c不同 */
   printf("创建矩阵A: ");
   CreateSMatrix(&A);
   PrintSMatrix(A);
   printf("由矩阵A复制矩阵B:\n");
   CopySMatrix(A,&B);
   PrintSMatrix1(B);
   DestroySMatrix(&B);
   printf("销毁矩阵B后:\n");
   PrintSMatrix1(B);
   printf("创建矩阵B2:(与矩阵A的行、列数相同,行、列分别为%d,%d)\n",A.mu,A.nu);
   CreateSMatrix(&B);
   PrintSMatrix1(B);
   AddSMatrix(A,B,&C);
   printf("矩阵C1(A+B):\n");
   PrintSMatrix1(C);
   SubtSMatrix(A,B,&C);
   printf("矩阵C2(A-B):\n");
   PrintSMatrix1(C);
   TransposeSMatrix(A,&C);
   printf("矩阵C3(A的转置):\n");
   PrintSMatrix1(C);
   printf("创建矩阵A2:");
   CreateSMatrix(&A);
   PrintSMatrix1(A);
   printf("创建矩阵B3:(行数应与矩阵A2的列数相同=%d)\n",A.nu);
   CreateSMatrix(&B);
   PrintSMatrix1(B);
   MultSMatrix(A,B,&C);
   printf("矩阵C5(A×B):\n");
   PrintSMatrix1(C);
 }
Пример #4
0
 void main()
 {
   CrossList A,B,C;
   InitSMatrix(A); // CrossList类型的变量在初次使用之前必须初始化
   InitSMatrix(B);
   printf("创建矩阵A: ");
   CreateSMatrix(A);
   PrintSMatrix(A);
   printf("由矩阵A复制矩阵B: ");
   CopySMatrix(A,B);
   PrintSMatrix(B);
   DestroySMatrix(B); // CrossList类型的变量在再次使用之前必须先销毁
   printf("销毁矩阵B后,矩阵B为:\n");
   PrintSMatrix1(B);
   printf("创建矩阵B2:(与矩阵A的行、列数相同,行、列分别为%d,%d)\n",A.mu,A.nu);
   CreateSMatrix(B);
   PrintSMatrix1(B);
   printf("矩阵C1(A+B):\n");
   AddSMatrix(A,B,C);
   PrintSMatrix1(C);
   DestroySMatrix(C);
   printf("矩阵C2(A-B):\n");
   SubtSMatrix(A,B,C);
   PrintSMatrix1(C);
   DestroySMatrix(C);
   printf("矩阵C3(A的转置):\n");
   TransposeSMatrix(A,C);
   PrintSMatrix1(C);
   DestroySMatrix(A);
   DestroySMatrix(B);
   DestroySMatrix(C);
   printf("创建矩阵A2: ");
   CreateSMatrix(A);
   PrintSMatrix1(A);
   printf("创建矩阵B3:(行数应与矩阵A2的列数相同=%d)\n",A.nu);
   CreateSMatrix(B);
   PrintSMatrix1(B);
   printf("矩阵C5(A×B):\n");
   MultSMatrix(A,B,C);
   PrintSMatrix1(C);
   DestroySMatrix(A);
   DestroySMatrix(B);
   DestroySMatrix(C);
 }
Пример #5
0
 void CreateSMatrix(CrossList *M)
 { /* 创建稀疏矩阵M,采用十字链表存储表示。算法5.4改 */
   int i,k;
   OLink p;
   if((*M).rhead)
     DestroySMatrix(M);
   printf("请输入稀疏矩阵的行数 列数 非零元个数: ");
   scanf("%d%d%d",&(*M).mu,&(*M).nu,&i);
   InitSMatrixList(M); /* 初始化M的表头指针向量 */
   printf("请按任意次序输入%d个非零元的行 列 元素值:\n",(*M).tu);
   for(k=0;k<i;k++)
   {
     p=(OLink)malloc(sizeof(OLNode)); /* 生成结点 */
     if(!p)
       exit(OVERFLOW);
     scanf("%d%d%d",&p->i,&p->j,&p->e); /* 给结点的3个成员赋值 */
     InsertAscend(M,p); /* 将结点p按行列值升序插到矩阵M中 */
   }
 }
Пример #6
0
 void MultSMatrix(CrossList M,CrossList N,CrossList *Q)
 { /* 初始条件:稀疏矩阵M的列数等于N的行数。操作结果:求稀疏矩阵乘积Q=M×N */
   int i,j,e;
   OLink pq,pm,pn;
   InitSMatrix(Q);
   (*Q).mu=M.mu;
   (*Q).nu=N.nu;
   (*Q).tu=0;
   InitSMatrixList(Q); /* 初始化Q的表头指针向量 */
   for(i=1;i<=(*Q).mu;i++)
     for(j=1;j<=(*Q).nu;j++)
     {
       pm=M.rhead[i];
       pn=N.chead[j];
       e=0;
       while(pm&&pn)
         switch(comp(pn->i,pm->j))
         {
           case -1: pn=pn->down; /* 列指针后移 */
                    break;
           case  0: e+=pm->e*pn->e; /* 乘积累加 */
                    pn=pn->down; /* 行列指针均后移 */
                    pm=pm->right;
                    break;
           case  1: pm=pm->right; /* 行指针后移 */
         }
       if(e) /* 值不为0 */
       {
         pq=(OLink)malloc(sizeof(OLNode)); /* 生成结点 */
         if(!pq) /* 生成结点失败 */
           exit(OVERFLOW);
         pq->i=i; /* 给结点赋值 */
         pq->j=j;
         pq->e=e;
         InsertAscend(Q,pq); /* 将结点pq按行列值升序插到矩阵Q中 */
       }
     }
     if((*Q).tu==0) /* Q矩阵元素个数为0 */
       DestroySMatrix(Q); /* 销毁矩阵Q */
 }
Пример #7
0
 void CopySMatrix(CrossList M,CrossList *T)
 { /* 初始条件:稀疏矩阵M存在。操作结果:由稀疏矩阵M复制得到T */
   int i;
   OLink p,q;
   if((*T).rhead) /* 矩阵T存在 */
     DestroySMatrix(T);
   (*T).mu=M.mu;
   (*T).nu=M.nu;
   InitSMatrixList(T); /* 初始化T的表头指针向量 */
   for(i=1;i<=M.mu;i++) /* 按行复制 */
   {
     p=M.rhead[i]; /* p指向i行链表头 */
     while(p) /* 没到行尾 */
     {
       q=(OLNode*)malloc(sizeof(OLNode)); /* 生成结点q */
       if(!q)
         exit(OVERFLOW);
       *q=*p; /* 给结点q赋值 */
       InsertAscend(T,q); /* 将结点q按行列值升序插到矩阵T中 */
       p=p->right;
     }
   }
 }