简介:三元组,意思是一个结构体里,有三个变量,存储矩阵信息。而三元组顺序存储,则是用顺序表,存储三元组,里面包含,三元组类型的一维数组,存储非零元素;总的行数和列数。总的非零元素数,其中三元组类型的一维数组中第一个位置,存储总行数和总列数以及总的非零元素数。
思路:
- 定义三元组,用来表示一个格子的信息,该格子信息包含,它的行和列的位置,以及元素值,
- 定义一个三元组顺序表,里面有一个三元组类型的一维数组,用来存储非零元素,其中该数组第一个位置,存储总的行数和列数以及总的非零元素个数。
- 随后我们直接赋值一个二维数组稀疏矩阵,然后给该数组存进三元组顺序表中。
- 存的时候,我们需要对二维数组,进行遍历,检测到非零元素的时候,给三元组顺序表中的一维数组进行赋值,给对应的行数,列数,元素值赋值过去。此外非零元素个数++;
- 具体看代码就懂了。
代码如下:
#include #define Max 36#include //创建三元组typedef struct Triples//这个为三元组表示,表示一个格子的内容,记录了改格子的坐标和值 {int hang,lie;int val;//坐标下的值}Triples;//三元组顺序存储typedef struct TriplesList{Triples *data;//给每个三元组格子,用顺序表表示。 int hangs,lies;//总列数和行数 int count;//总的非零元素个数 }TriplesList; //打印稀疏矩阵void PrintNozero(int data[6][6],int hang,int lie){int i,j,count;for(i=0;i<hang;i++){for(j=0;jdata=(Triples*)malloc(sizeof(Triples)*100);t->count=0;t->hangs=0;t->lies=0;}//创建三元组顺序表,并检测稀疏矩阵非零元素信息,存进顺序表void CreatTriplesList(TriplesList *t,int a[6][6],int hang,int lie){t->hangs=hang;t->lies=lie; int i,j,k=1;t->data[0].hang=t->hangs; t->data[0].lie=t->lies;for(i=0;i<hang;i++){for(j=0;jcount++;//给非零元素存储在三元组顺序表中 t->data[k].val=a[i][j];t->data[k].hang=i;t->data[k].lie=j;k=k+1;}}}t->data[0].val=t->count;}//打印三元组void PrintTripelsList(TriplesList t){int i;printf("非零元素分别在\n");for(i=0;i<=t.count;i++){if(i==0)printf("此稀疏矩阵共%d行%d列,非零元素为%d个\n",t.data[i].hang,t.data[i].lie,t.data[i].val);elseprintf("%d行%d列为%d\n",t.data[i].hang,t.data[i].lie,t.data[i].val);}printf("\n");} int main(){int data[6][6]={0,0,-3,0,0,15,12,0,0,0,18,0,9,0,0,24,0,0,0,0,0,0,0,-7,0,0,0,0,0,0,0,0,14,0,0,0};//打印稀疏矩阵PrintNozero(data,6,6);//创建三元组顺序表TriplesList t;//初始化顺序表InitTriplesList(&t);//给三元组顺序表赋值CreatTriplesList(&t,data,6,6); //打印PrintTripelsList(t);return 0;}