//稀疏矩阵乘法 用十字链表存储 C=A*B 输出C; Z1240 还出现超时
#include<stdio.h>
#include<stdlib.h>
typedef struct mnode
{
int row,col,v;
struct mnode *down,*right;
}MNode;
typedef struct
{
int mu,nu,tu;
MNode *rlink[10001],*clink[10001];
}CrossLink;
CrossLink *CreatCrossLink2( CrossLink *H,int i,int j,int v)//创建十字链表存储的稀疏矩阵 第2步
{
MNode *p,*q;
p=(MNode *)malloc(sizeof(MNode));
p->row=i;
p->col=j;
p->v=v;
q=H->rlink[i];
if(q==NULL||q->col>j) //插入 *p为第一个节点
{
p->right=q;
H->rlink[i]=p;
}
else// 寻找p在第i行的位置
{
while(q->right&&(q->right->col)<j)
q=q->right;
p->right=q->right;
q->right=p; //完成p在行链上的插入
}
//以下是将 p插入到列链表中去,且按行号有序
q=H->clink[j];
if(q==NULL||q->row>i)//插入 *p为第一个节点
{
p->down=q;
H->clink[j]=p;
}
else
{
while(q->down&&(q->down->row)<i)
q=q->down;
p->down=q->down;
q->down=p; //完成p在列链上的插入
}
return H;
}
CrossLink *CreatCrossLink1(CrossLink *H)//创建十字链表存储的稀疏矩阵 第1步
{
int i,j,k,v;
H=(CrossLink *)malloc(sizeof(CrossLink));
scanf("%d%d%d",&H->mu,&H->nu,&H->tu); //稀疏矩阵的行、列、非零元素的个数
for(k=1;k<=H->mu;k++)//初始化
H->rlink[k]=NULL;
for(k=1;k<=H->nu;k++)
H->clink[k]=NULL;
for(k=1;k<=H->tu;k++)
{
scanf("%d%d%d",&i,&j,&v);//非零元素的录入 行、列、非零元素的大小
CreatCrossLink2( H,i,j,v);
}
return H;
}
int main()
{ // freopen("1.txt","r",stdin);
CrossLink *A,*B,*C;
MNode *aq,*bq,*q;
int i,k,temp;
C=(CrossLink *)malloc(sizeof(CrossLink));
A=(CrossLink *)malloc(sizeof(CrossLink));
B=(CrossLink *)malloc(sizeof(CrossLink));
A=CreatCrossLink1(A);
B=CreatCrossLink1(B);
C->mu=A->mu;
C->nu=B->nu;
if(A->nu!=B->mu)
return 0;
else if(A->tu*B->tu==0)
{
printf("%d %d 0\n",C->mu,C->nu);
return 0;
}
else
{
for( k=1;k<=C->mu;k++)
C->rlink[k]=NULL;
for(k=1;k<=C->nu;k++)
C->clink[k]=NULL;
C->tu=0;
for( i=1;i<=(A->mu);i++)
{
q=A->rlink[i];// A矩阵中第i行的第一个元素
if(q)
{
for(int j=1;j<=B->nu;j++)
{
temp=0;
aq=q;
bq=B->clink[j]; // B矩阵中第j列的第一个元素
while(aq&&bq)
{
// printf("a.....i==%d j==%d v==%d\n",aq->row,aq->col,aq->v);
// printf("b1.....i==%d j==%d v==%d\n\n",bq->row,bq->col,bq->v);
if(aq->col==bq->row)// A矩阵元素aq所在的列与B矩阵元素bq所在的行相等
{
temp=temp+(aq->v)*(bq->v);
aq=aq->right; // 取A矩阵aq元素所在行的下一个元素
bq=bq->down; // 取B矩阵bq元素所在列的下一个元素
}
else if(aq->col<bq->row) // 取A矩阵aq元素所在行的下一个元素
aq=aq->right;
else // 取B矩阵bq元素所在列的下一个元素
bq=bq->down;
}//while
if(temp!=0)
{
(C->tu)++;
CreatCrossLink2( C,i,j,temp);
// printf("i==%d j==%d temp==%d\n",i,j,temp);
}
}//for j
}//if
}//for
if((C->tu)==0)
printf("%d %d 0\n",C->mu,C->nu);
else
{
printf("%d %d %d\n",C->mu,C->nu,C->tu);
for(i=1;i<=C->mu;i++)
{
q=C->rlink[i];
while(q)
{
printf("%d %d %d\n",q->row,q->col,q->v);
q=q->right;
}
}
}
}
return 0;
}
分享到:
相关推荐
用C++编写的稀疏矩阵乘法运算,稀疏矩阵采用十字链表存储及计算
十字链表存储稀疏矩阵算法,实现两个矩阵的乘法运算
十字链表实现稀疏矩阵的加法、减法、乘法、转置、求最值、插入、查看、删除等基本功能,菜单栏采用hash表存储稀疏矩阵,给每个矩阵存储一个名字,hash函数进行寻找。
用十字链表表示稀疏矩阵,可以实现矩阵的乘法
以前要做一个稀疏矩阵的题,要用十字链表实现加法和乘法运算,在网上一直都搜不到跟乘法有关的,正好课程设计要用就做了一个。是用两种不同方法实现的。
用十字链表实现稀疏矩阵加法运算、稀疏矩阵减法运算、稀疏矩阵乘法运算
采用十字链表表示稀疏矩阵,并实现矩阵的加法运算
以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相乘的运算。稀疏矩阵采用十字链表表示,而运算结果的矩阵则以通常的阵列形式列出。 测试用例见题集p136。 内容: 题目分析(ppt),完整工程文件...
问题描述: (1) 用行逻辑链接顺序表或十字链表分别实现稀疏矩阵的压缩存储。 (2) 编程实现矩阵的转置运算和乘法运算(运用行逻辑链接顺序表或十字 链表作为存储结构) 。 问题的实现: (1)矩阵的创建: 1:...
范例1-104 有向图的十字链表存储表示 335 ∷相关函数:CreateDG函数 1.7.4 无向图的邻接多重表存储表示 344 范例1-105 无向图的邻接多重表存储表示 344 ∷相关函数:CreateGraph函数 1.7.5 最小生成树 355 ...
范例1-104 有向图的十字链表存储表示 335 ∷相关函数:CreateDG函数 1.7.4 无向图的邻接多重表存储表示 344 范例1-105 无向图的邻接多重表存储表示 344 ∷相关函数:CreateGraph函数 1.7.5 最小生成树 355 ...
范例1-104 有向图的十字链表存储表示 335 ∷相关函数:CreateDG函数 1.7.4 无向图的邻接多重表存储表示 344 范例1-105 无向图的邻接多重表存储表示 344 ∷相关函数:CreateGraph函数 1.7.5 最小生成树 355 ...
4、用邻接矩阵或邻接图实现一个有向图的存储,并实现单源最短路径算法的实现(这个类的一个成员函数),并能输出该图的关键路径。 注:1、要用面向对象的方法设计代码; 2、一个图是一个类的实例; 3、类...