- 9
- 0
- 约4.53千字
- 约 6页
- 2017-12-27 发布于河南
- 举报
矩阵相加(十字链表)
矩阵相加(十字链表)
/* Note:Your choice is C IDE */
#include stdio.h
#include stdlib.h
#define LEN (OLink *)malloc((M-mu+1)*sizeof(OLink))
#define LDN (OLink *)malloc((M-nu+1)*sizeof(OLink))
#define LRN (struct OLNode *)malloc(sizeof(struct OLNode))
typedef struct OLNode
{
int i,j,e; //非0元的行数、列数、值
struct OLNode *right,*down; //非0元所在的行表、列表的后继链域
}*OLink;
typedef struct
{
OLink *rhead,*chead; //行表、列表的向量基址
int mu,nu,tu; //稀疏矩阵的行数、列数、非0元个数
}CrossList;
void CreateSMatrix_OL(CrossList *M) //创建稀疏矩阵(用十字链表表示)
{
OLink p,q;
int m,n,k;
q=LRN;
if(!q) printf(内存分配失败!\n);
printf(请输入矩阵的行数,列数,非零元个数:(用空格隔开,按回车结束,下同)\n);
scanf(%d%d%d,M-mu,M-nu,M-tu);
M-rhead=LEN;M-chead=LDN;
if((!M-rhead)||(!M-chead)) printf(内存分配失败!\n);
for(m=1;m=M-mu;++m) M-rhead[m]=NULL; //初始化行列头指针向量
for(n=1;n=M-nu;++n) M-chead[n]=NULL; //各行列链表为空链表
for(k=1;k=M-tu;++k)
{
p=LRN;
if(!p) printf(内存分配失败!\n);
printf(请输入第%d个非0元素的行数,列数,值:,k); //可任意次序输入非0元
scanf(%d%d%d,p-i,p-j,p-e);
if((M-rhead[p-i]==NULL)||(M-rhead[p-i]-jp-j))
{p-right=M-rhead[p-i];M-rhead[p-i]=p;}
else //查询在行表中的插入位置
{
for(q=M-rhead[p-i];(q-right!=NULL)(q-right-jp-j);q=q-right);
p-right=q-right;q-right=p; //完成行插入
}
if((M-chead[p-j]==NULL)||(M-chead[p-j]-ip-i))
{p-down=M-chead[p-j];M-chead[p-j]=p;}
else //查询在列表中的插入位置
{
for(q=M-chead[p-j];(q-down!=NULL)(q-down-ip-i);q=q-down);
p-down=q-down;q-down=p; //完成列插入
}
}
}
void Print_List(CrossList M) //输出十字链表所表示的稀疏矩阵
{
int i,k,n;
OLink p;
for(p=M.rhead[1],i=1;i=M.mu;++i,p=M.rhead[i])
{
for(k=1;k=M.nu;++k)
{
if(p!=NULL)
{
if(k==p-j) {n=p-e;p=p-right;}
else n=0;
}
else n=0;
printf(%6d,n);
}
printf(\n);
}
}
CrossList * AddCrossL
原创力文档

文档评论(0)