数据结构学习(稀疏矩阵的实现,三元组)(二)

2014-11-24 08:58:10 · 作者: · 浏览: 3
行初始化。
dt = dm->head
;for (i = 0; i < count; i++){
dt->i = st->j;
dt->j = st->i;
dt->value = st->value;
sm++;
dt++;
}
sort_matrix (dm);

}

/*
*description: 对稀疏矩阵逆转了,
*paramtere:
* sm:源稀疏矩阵
* dm:目的稀疏矩阵
*/
void transpose_matrix (matrix *sm, matrix *dm){
int i, j;
triple *dt, *st;
init_matrix (dm, sm->row, sm->column, sm->count);//对目的稀疏矩阵进行初始化。
dt = dm->head;
for (i = 0; i < sm->column; i++){
st = sm->head;
for (j = 0; j < sm->count; j++){
if ( st->j == i){
dt->i = i;
dt->j = st->i;
dt->value = st->value;
dt++;
}
st++;
}
}

}

/*
*description:向稀疏矩阵中插入一个元素,将元素个数加一
*parameter:
* i,j,value:要插入元素位置的行、列、值
*/
void insert_matrix (matrix *m, int i, int j, int value){
m->count++;
if(1 == m->count)
m->head = (triple *) malloc (sizeof(triple));
else
m->head = (triple *) realloc (m->head, m->count * sizeof(triple));
(m->head)[m->count-1].i = i;
(m->head)[m->count-1].j = j;
(m->head)[m->count-1].value = value;
}


/*
*description:矩阵的乘法
*pararmeter:
* m1,m2:乘数和被乘数
* result:成绩结果
*/
void multi_matrix (matrix *m1, matrix *m2, matrix *result){
int tmp ; //保存临时计算的结果
int i, j; //i表示计算到m2矩阵的第几列了。
int use = 0; //表示m1正在计算当前行的第几个非零位置
triple *tp = m1->head;//m1中非零元素的首地址
triple *tp2 = m2->head;//m2中非零元素的首地址
init_matrix (result, 0, 0, 0);//初始化矩阵
if (m1->column != m2->row) return ;//无法做运算的,不满组运算条件
if ( m1->column > m1->count || m2->row > m2->count){
//有矩阵的成绩关系可以知,m1中的一行与m2中的一列做运算。
//如果m1中的非零个数不满足一行,m2中的非零个数不满足一列。没有做运算的必要
return ;
}
/*
*1.首先找本行中的一个m1中非零元素tp[usue],
*2.查找m2[tp[use].j][i]元素是否存,存在转到第3步,否则转到第4步
*3.计算两者的成绩加入到到tmp中。
*4.查找同行的下一个非零元素。如存在转到第2不,不存在转到第5步
*5.清空临时数据,进入下一个行,转到第1步。
*/
while ( tp < &tp[m1->count] ){//判断m1中是否还有未计算的元素,没有的话,计算结束
for (i = 0; i < m2->column; i++){//用来控制与m2中的第几列做运算
use = 0;//计算本行中的第一个非零元素
tmp = 0;//计算的结果
for (j = 0; j < m2->count; j++){//遍历m2中的所有元素,差找目标元素
if(tp2[j].j == i && tp2[j].i == tp[use].j ){
tmp += tp2[j].value * tp[use].value;
if( tp[use].j == m1->column){
break;
}
if (tp >= &((m1->head)[m1->count]) || tp[use].i != tp[use+1].i ) break;
use ++;
}
}
if (tmp > 0) insert_matrix (result ,i ,j ,tmp);
}
//转到下一行
while ( tp->i == tp[1].i){
tp++;
if ( tp >= &((m1->head)[m1->count]) ) return ;
}
tp++;
}
}

void destroy_matrix (matrix *m){
m->row = 0;
m->column = 0;
m->count = 0;
free (m->head);