求稀疏矩阵输出最简单的方法
能不能不用三个for循环,也就是执行 行数*列数*非零元的个数 次!求指导
[解决办法]
度娘谷歌吧
很多这样的介绍的
[解决办法]
[code=C/C++][/code]
/* 十字链表实现稀疏矩阵 */
#include<iostream.h>
#include <stdio.h>
#include<stdlib.h>
typedef int ElemType;
#define MaxRows 100
#define MaxColumns 100
struct CrossNode {
int row,col; // row(行号) col(列号)
ElemType val; //val(元素值)
CrossNode* down; //指向同一列下一个结点(down)
CrossNode* right; //指向同一行下一个结点(right)
};
struct CLMatrix {
int m,n,t; //行数(m) 列数(n) 非零个数(t)
CrossNode* rv[MaxRows+1]; /*行指针向量*/
CrossNode* cv[MaxColumns+1]; /*列指针向量*/
}M;
void InitCLMatrix(struct CLMatrix *M)
{
int i;
int j;
M->m=0;
M->n=0;
M->t=0;
for(i=1;i<MaxRows;i++)
M->rv[i]=NULL;
for(j=1;j<MaxColumns;j++)
M->cv[j]=NULL;
}
void InputCLMatrix(CLMatrix* M, int m, int n)
{
M->m = m;
M->n = n;
int row,col;
ElemType val;
int k=0;
cin>>row>>col>>val;
while(row!=0)
{
k++;
// 建立一个新结点
CrossNode *cp, *newptr;
newptr = new CrossNode;
newptr->row = row;
newptr->col = col;
newptr->val = val;
newptr->down = NULL;
newptr->right = NULL;
// 把新结点链接到所在行单链表的末尾
cp = M->rv[row];
if(cp==NULL) M->rv[row] = newptr;
else
{
while(cp->right!=NULL)
cp = cp->right;
cp->right = newptr;
}
// 把新结点链接到所在列单链表的末尾
cp = M->cv[row];
if(cp==NULL) M->cv[row] = newptr;
else
{
while(cp->down!=NULL)
cp = cp->down;
cp->down = newptr;
}
cin>>row>>col>>val;
}
M->t = k;
}
void OutputCLMatrix(CLMatrix* M)
{
CrossNode *cp;
int i;
cout<<"( ";
for(i=1;i <= M->m; i++)
{
cp=M->rv[i];
while(cp!=0)
{
cout<<"("<<cp->row<<",";
cout<<cp->col<<",";
cout<<cp->val<<")";
cout<<" ";
cp = cp->right;
}
}
cout<<")";
}
void main()
{
CLMatrix *M;
M=(CLMatrix *)malloc(sizeof(CLMatrix));
cout<<"输入M的行数、列数、非零元素个数:";
int m,n,t;
cin>>m>>n>>t;
cout<<"以(行数 列数 元素值)方式输入一个三元组并回车,以(0 0 0)结束所有三元组的输入: "<<endl;
InitCLMatrix(M);
InputCLMatrix(M,m,n);
cout<<"你输入的M矩阵的三元组是: "<<endl;
OutputCLMatrix(M);
}