“a.h”
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct Node{
inti,j; //行列坐标
ElemTypee; //节点元素值
struct Node*right,*down; //下面(列)一个或右面(行)一个
}Node,*Link;
typedef struct{
Link*rhead,*chead; //行列的表头指针向量基址,也就是把所有的行列头再搞成两个链表,存放Link
intmu,nu,tu; //行数,列数,元素总个数
}Matrix;
“b.h”
Status InitMatrix(Matrix *M)
{
(*M).chead=NULL;
(*M).rhead=NULL;
return OK;
}
Status DestroyMatrix(Matrix *M)
{
int i;
Link q,p;
for(i=1;i<=(*M).mu;i++){ //care
p=*((*M).chead+i);
while(p){
q=p->right;
free(p);
p=q;
}
}
free((*M).chead);
free((*M).rhead);
(*M).chead=(*M).rhead=NULL;
(*M).mu=(*M).nu=(*M).tu=0;
return OK;
}
Status CreateMatrix(Matrix *M)
{
int i;
int m,n,t;
ElemType e;
Link p,q;
if((*M).chead)
DestroyMatrix(M);
printf("输入矩阵的行数,列数,非零总数 ");
scanf("%d %d%d",&m,&n,&t);
(*M).mu=m;(*M).nu=n;(*M).tu=t;
(*M).chead=(Link*)malloc(m*sizeof(Link));
if(!(*M).chead)
exit(0);
for(i=1;i<=m;i++)
(*M).chead[i]=NULL; //一定要先对所有的十字链表初始化,表示成数组形式
(*M).rhead=(Link*)malloc(n*sizeof(Link));
if(!(*M).rhead)
exit(0);
for(i=1;i<=n;i++)
(*M).rhead[i]=NULL;
for(i=0;i<(*M).tu;i++){
printf("输入行坐标 列坐标 元素值 ");
scanf("%d %d%d",&m,&n,&e);
p=(Link)malloc(sizeof(Node));
p->i=m;p->j=n;p->e=e;
q=(*M).rhead[m];
if(q==NULL||q->j>n){ //插在第一个
p->right=q;
(*M).rhead[m]=p; //care
}
else{ //插入节点 care
for(;q->right&&q->right->jright);
p->right=q->right;
q->right=p;
}
q=(*M).chead[n];
if(q==NULL||q->i>m){
p->down=q;
(*M).chead[n]=p;
}
else{
for(;q->down&&q->down->idown);
p->down=q->down;
q->down=p;
}
}
return OK;
}
Status PrintMatrix(Matrix M)
{
int i,j;
Link p;
printf("mu=%d,nu=%d,tu=%d\n",M.mu,M.nu,M.tu);
printf("选择如何打印 1:按行打印,2,:按列打印");
scanf("%d",&i);
switch(i){
case 1:
for(j=1;j<=M.mu;j++){
p=M.chead[j];
while(p){
printf(" %d ",p->e);
p=p->down;
}
}
break;
case 2:
for(j=1;j<=M.nu;j++){
p=M.rhead[j];
while(p){
printf(" %d ",p->e);
p=p->right;
}
}
}
printf("\n");
return OK;
}
Status CopyMatrix(Matrix *M,Matrix N)
{
int i,j;
Link p,q,p1,q1;
if((*M).chead)
DestroyMatrix(M);
(*M).mu=N.mu;
(*M).nu=N.nu;
(*M).tu=N.tu;
(*M).chead=(Link*)malloc(N.mu*sizeof(Link));
if(!(*M).chead)
exit(0);
for(j=1;j<=N.mu;j++)
(*M).chead[j]=NULL; //一定要先对所有的十字链表初始化,表示成数组形式
(*M).rhead=(Link*)malloc(N.nu*sizeof(Link));
if(!(*M).rhead)
exit(0);
for(j=1;j<=N.nu;j++)
(*M).rhead[j]=NULL;
for(i=1;i<=N.mu;i++){
q=N.chead[i];
while(q){
p=(Link)malloc(sizeof(Node));
if(!p)
exit(0);
p->e=q->e;
p->i=q->i;
p->j=q->j;
if(!(*M).chead[i]) //行插入
(*M).chead[i]=p;
else
p1->down=p;
p1=p;
if(!(*M).rhead[q->j]) //插在第一个
(*M).rhead[q->j]=p; //care
else{ //插入节点 care
q1=(*M).rhead[q->j];
while(q1)
q1=q1->right;
q1->right=p;
p->right=NULL;
q1=p;
}
q=q->down;
}
p->down=NULL;
}
return OK;
}
Status AddMatrix(Matrix M,Matrix N,Matrix *L)
{
int i,j;
Link pm,pn,p,pq;
Link *col;
if(M.mu!=N.mu||M.nu!=N.nu)
exit(0);
(*L).mu=M.mu;
(*L).nu=M.nu;
(*L).tu=0;
(*L).chead=(Link*)malloc((M.mu+1)*sizeof(Link));
if(!(*L).chead)
exit(0);
for(j=1;j<=N.mu;j++)
(*L).chead[j]=NULL; //一定要先对所有的十字链表初始化,表示成数组形式
(*L).rhead=(Link*)malloc((M.nu+1)*sizeof(Link));
if(!(*L).rhead)
exit(0);
for(j=1;j<=N.nu;j++)
(*L).rhead[j]=NULL;
col=(Link*)malloc((M.nu+1)*sizeof(Link)); //指向列的最后节点数组
if(!col)
exit(0);
for(j=1;j<=M.nu;j++)
col[j]=NULL;
for(i=1;i<=M.nu;i++){
pm=M.rhead[i];
pn=N.rhead[i];
while(pm&&pn){
if(pm->jj){
p=(Link)malloc(sizeof(Node));
if(!p)
exit(0);
(*L).tu++;
p->e=pm->e;
p->i=i;
p->j=pm->j;
p->right=NULL;
pm=pm->right;
}
elseif(pm->j>pn->j){
p=(Link)malloc(sizeof(Node));
if(!p)
exit(0);
(*L).tu++;
p->e=pn->e;
p->i=i;
p->j=pn->j;
p->right=NULL;
pn=pn->right;
}
elseif(pm->e+pn->e){
p=(Link)malloc(sizeof(Node));
if(!p)
exit(0);
(*L).tu++;
p->i=i;
p->j=pm->j;
p->e=pn->e+pn->e;