真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

兩個稀疏矩陣的乘法算法的實(shí)現(xiàn)——十字鏈表矩陣相乘

十字鏈表矩陣相乘

  • 兩個十字鏈表的矩陣相乘。

    站在用戶的角度思考問題,與客戶深入溝通,找到奉節(jié)網(wǎng)站設(shè)計與奉節(jié)網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名申請、雅安服務(wù)器托管、企業(yè)郵箱。業(yè)務(wù)覆蓋奉節(jié)地區(qū)。

  • 矩陣的輸入

    • 先需要輸入矩陣的行數(shù)、列數(shù)、非0個數(shù)
    • 在輸入非零數(shù)的坐標(biāo)和數(shù)值

第一個矩陣:矩陣的顯示比較粗糙,自己有需求自己改一下吧。

第二個矩陣:

結(jié)果:

  • 結(jié)果輸出不是矩陣,自己需要可以自己改一下結(jié)果顯示形式,我就這樣顯示了。

這個代碼實(shí)在dev C++上實(shí)現(xiàn)的,這個看一下自己的環(huán)境,一般都沒什么問題。

#include 
#include 
#include 
#include 
#define ok 1
#define overflow 0
#define error -1
typedef int ElemType;
typedef int Status;
typedef struct OLNode
{
    int i,j;
    ElemType e;
    struct OLNode *right,*down;
}OLNode, *OLink;

typedef struct{
    OLink *rhead,*chead;
    int mu,nu,tu;
}CrossList;
Status CreateSMatrix_OL(CrossList &M)
{
    int m,n,t,c=0;
    int i,j,e;
    int count;
    OLink p,q;
    printf("稀疏矩陣的行數(shù)、列數(shù)、非零元個數(shù):\n");
    scanf("%d%d%d", &m, &n, &t);

    M.mu=m;
    M.nu=n;
    M.tu=t;
    if(m<1||n<1||t>m*n) {
	printf("該對象不符合矩陣要求");}
	else{
    if(!(M.rhead=(OLink *)malloc((m+1)*sizeof(OLink)))) exit(overflow);
    if(!(M.chead=(OLink *)malloc((n+1)*sizeof(OLink)))) exit(overflow);
    for(i=0;i<=m;i++) M.rhead[i]=NULL;
    for(j=0;j<=n;j++) M.chead[j]=NULL;
    printf("請依次輸入元素行數(shù)、列數(shù)、權(quán)值:\n");
    for(count=0; counti=i; p->j=j; p->e=e;
        if(M.rhead[i]==NULL||M.rhead[i]->j>j) {p->right=M.rhead[i]; M.rhead[i]=p;}
        else{
            for(q=M.rhead[i];(q->right)&&(q->right->jright);
            p->right=q->right; q->right=p;        //rhead是列數(shù)組 
        }
        if(M.chead[j]==NULL||M.chead[j]->i>i) {p->down=M.chead[j]; M.chead[j]=p;}
        else{
            for(q=M.chead[j];(q->down)&&q->down->idown);
            p->down=q->down; q->down=p;          //chead是行數(shù)組 
        }
    }
}
return ok;
}
Status Initalization_OL(OLink &l)
{
if(!(l=(OLNode *)malloc(sizeof(OLNode)))) exit(overflow);
}
Status Initalization_S(CrossList A,CrossList B,CrossList &M)//初始化矩陣c 
{   int m,n;
    int i,j;
    M.mu=A.mu;
    m=A.mu;
    M.nu=B.nu;
    n=B.nu;
	if(!(M.rhead=(OLink *)malloc((m+1)*sizeof(OLink)))) exit(overflow);
    if(!(M.chead=(OLink *)malloc((n+1)*sizeof(OLink)))) exit(overflow);
    for(i=0;i<=m;i++) M.rhead[i]=NULL;
    for(i=0;i<=n;i++) M.chead[i]=NULL;
    return ok;
}

Status CreateSMatrix(CrossList &M,OLink &l)
	{	
    	int i,j,e;
    	OLink p,q;
    	i=l->i;
    	j=l->j;
    	e=l->e;
        if(!(p=(OLNode *)malloc(sizeof(OLNode)))) exit(overflow);
        p->i=i; p->j=j; p->e=e;p->down=NULL;p->right=NULL;
        if(M.rhead[i]==NULL||M.rhead[i]->j>j) {p->right=M.rhead[i]; M.rhead[i]=p;}
        else{
            for(q=M.rhead[i];(q->right)&&(q->right->jright);
            p->right=q->right; q->right=p;        //rhead是列數(shù)組 
        }
        if(M.chead[j]==NULL||M.chead[j]->i>i) {p->down=M.chead[j]; M.chead[j]=p;}
        else{
            for(q=M.chead[j];(q->down)&&q->down->idown);
            p->down=q->down; q->down=p;          //chead是行數(shù)組 
        }

        return ok;
    }

int PrintSMatrix(CrossList M)
 {
    int i,j;
    OLink p;
    if(M.mu<1||M.nu<1){printf("矩陣為空矩陣或者是非正常矩陣\n"); 
	}
	else{
    for(j=1;j<=M.mu;j++)
	{
	 p=M.rhead[j];
    	while(p)
		{
		printf("第%d行%d列值為:%d\n",p->i,p->j,p->e);
		p=p->right;
    	}
	}
	}
    return ok;
 }

int MulA_B(CrossList A,CrossList B,CrossList &C)
{
    OLNode *q=NULL,*L=NULL;
    OLink S;
    int i,j,num;
    Initalization_OL(S);
    S->down=NULL;
    S->right=NULL;
    
    if(A.nu==B.mu){
    	Initalization_S(A,B,C);
    for(i=1;i<=C.mu;i++)
	   for(j=1;j<=C.nu;j++)
	   {num=0;
        q=A.rhead[i];
        L=B.chead[j];
while((q!=NULL)&&(L!=NULL))
{if(q->j==L->i){num+=q->e*L->e;
q=q->right;L=L->down;
}
else if(q->j>L->i)
    {
	for(;L!=NULL;L=L->down)
     {
	 if(q->j<=L->i) break;}}
  else
  {for(;q!=NULL;q=q->right)
      {
	  if(q->j>=L->i) break;
	   }}
}  printf("%d ",num); 
	if(num!=0)
	{
	S->i=i;
    S->j=j;
    S->e=num;
    CreateSMatrix(C,S);
	}
	else ;}
	}
	else{
      printf("\n矩陣無法相乘\n");
    }
}

int main()
{
    CrossList A,B,C;
    OLink p,q,l;
    int data;
    printf("請依次輸入第一個\n"); 
    CreateSMatrix_OL(A);
    printf("\n該矩陣是%d*%d的矩陣\n",A.mu,A.nu);
    PrintSMatrix(A);
    printf("\n請依次輸入第二個\n");
    CreateSMatrix_OL(B);
    printf("\n該矩陣是%d*%d的矩陣\n",B.mu,B.nu);
    PrintSMatrix(B);
    printf("\n矩陣相乘的結(jié)果:"); 
    MulA_B(A,B,C);
    printf("\n該矩陣是%d*%d的矩陣\n",C.mu,C.nu);
	PrintSMatrix(C);
	printf("有用點(diǎn)個推薦唄!");
	system("pause");
	return 0;
}

分享名稱:兩個稀疏矩陣的乘法算法的實(shí)現(xiàn)——十字鏈表矩陣相乘
轉(zhuǎn)載來源:http://weahome.cn/article/dsoipdg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部