数组本身就是一种数据结构,他是对线性表的一种扩充数组主要用于对矩阵的压缩和表示
一.特殊矩阵的压缩
二.稀疏矩阵的压缩
1.三元组表示法:
#include<stdio.h> #define MAXSIZE 1000 typedef int ElemType; //定义一种结构体记录每个压缩后的非零点在原矩阵中的行下标和列下标,以及数据 typedef struct Node{ int row,col; ElemType data; }Triple; //定义一种结构体:新的压缩矩阵,包含所有原矩阵非零点的数组, //原矩阵的行数,列数,新压缩矩阵非零点的个数 typedef struct YS{ Triple data[MAXSIZE+1];//data[0]抛弃不用 int m,n,len; }TSMatrix;
三元组表示法下的稀疏矩阵转置
#include<stdio.h> #define MAXSIZE 1000 typedef int ElemType; //定义一种结构体记录每个压缩后的非零点在原矩阵中的行下标和列下标,以及数据 typedef struct Node{ int row,col; ElemType data; }Triple; //定义一种结构体:新的压缩矩阵,包含所有原矩阵非零点的数组, //原矩阵的行数,列数,新压缩矩阵非零点的个数 typedef struct YS{ Triple data[MAXSIZE+1];//data[0]抛弃不用 int m,n,len; }TSMatrix; //矩阵转置 :列序递增转置法 void TransposTSMatrix(TSMatrix A,TSMatrix B) { int i,j=1,k; if(B.len>0) { for(k=1;k<A.n;k++) for(i=1;i<A.len;i++) if(A.data[i].col==k) { B.data[j].row=A.data[i].col; B.data[j].col=A.data[i].row; B.data[j].data=A.data[i].data; j++; } } } //一次定位快速转置法 void FastTransportTSMatrix(TSMatrix* A,TSMatrix* B) { int col,t,p,q; int num[MAXSIZE],postion[MAXSIZE];//num[i]记载A中第i列中非零元素个数, //postion[i]中记载A中第i列中下一个非零元素在三元组表B中的正确存放位置 B->len=A->len; B->n=A->m; B->m=A->n; if(B->len) { //初始化每列中的非零元素个数为0 for(col=1;col<=A->len;i++) num[col]=0; //计算出A每列中非零元素的个数 for(t=1;t<=A->len;t++) num[A->data[t]->col]++; //第一列中第一个非零元素在B中的位置 potion[1]=1; //计算出每列中第一个非零元素在三元组表B中的正确存放位置 for(col=2;col<=A->n;col++) postion[col]=postion[col-1]+num[col-1]; //依次将A中每一个元素按照列序转置 for(p=1;p<=A->len;p++) { col=A->data[p]->col;q=postion[col]; B->data[q]->col=A->data[p]->row; B->data[q]->row=A->data[p]->col; B->data[q]->data=A->data[p]->data; postion[col]++; } } }
二.稀疏矩阵的链式存储结构:十字链表
建立十字链表
#include<stdio.h> typedef ElemType int; typedef struct OLNode { int row,col; ElemType value; struct OLNode* right,*down; }OLNode,*OLink; typedef struct TS { //行链表,列链表的头指针向量 OLink row_head,col_head; int m,n,len;//稀疏矩阵的行数,列数,非零元素的个数 }CrossList;
时间: 2024-12-14 18:13:06