简介:三元组,意思是一个结构体里,有三个变量,存储矩阵信息。而三元组顺序存储,则是用顺序表,存储三元组,里面包含,三元组类型的一维数组,存储非零元素;总的行数和列数。总的非零元素数,其中三元组类型的一维数组中第一个位置,存储总行数和总列数以及总的非零元素数。
思路:
- 定义三元组,用来表示一个格子的信息,该格子信息包含,它的行和列的位置,以及元素值,
- 定义一个三元组顺序表,里面有一个三元组类型的一维数组,用来存储非零元素,其中该数组第一个位置,存储总的行数和列数以及总的非零元素个数。
- 随后我们直接赋值一个二维数组稀疏矩阵,然后给该数组存进三元组顺序表中。
- 存的时候,我们需要对二维数组,进行遍历,检测到非零元素的时候,给三元组顺序表中的一维数组进行赋值,给对应的行数,列数,元素值赋值过去。此外非零元素个数++;
- 具体看代码就懂了。
代码如下:
#include <stdio.h>
#define Max 36
#include <malloc.h>
//创建三元组
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;j<lie;j++)
{
printf("%d ",data[i][j]);
}
printf("\n");
}
}
//初始化三元组一维数组
void InitTriplesList(TriplesList *t)
{
t->data=(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;j<lie;j++)
{
if(a[i][j]!=0) //检测到非零,存进去。
{ t->count++;//给非零元素存储在三元组顺序表中
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);
else
printf("%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;
}