矩阵的十字链表

矩阵的十字链表


矩阵的十字链表

“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{
   int i,j;   //行列坐标
   ElemType e;    //节点元素值
   struct Node *right,*down;   //下面(列)一个或右面(行)一个
}Node,*Link;
typedef struct{
   Link *rhead,*chead;   //行列的表头指针向量基址,也就是把所有的行列头再搞成两个链表,存放Link
   int mu,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;
    }
    else if(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;
    }
    else if(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;
      p->right=NULL;
      pm=pm->right;
      pn=pn->right;
    }
    else {
        pm=pm->right;
     pn=pn->right;
     continue;
    }
             //以上代码先找出p的i,j,e,然后再插入
    if((*L).rhead[i]==NULL)
     (*L).rhead[i]=pq=p;
    else{
        pq->right=p;
     pq=p;
    }
    if((*L).chead[p->j]==NULL)
     (*L).chead[p->j]=col[p->j]=p;
    else{
        col[p->j]->down=p;
     col[p->j]=p;
    }
   }
   while(pm){
       p=(Link)malloc(sizeof(Node));
    if(!p)
     exit(0);
    (*L).tu++;
    p->i=i;
    p->j=pm->j;
    p->e=pm->e;
    p->right=NULL;
    pm=pm->right;
    if((*L).rhead[i]==NULL)
     (*L).rhead[i]=pq=p;
    else{
        pq->right=p;
     pq=p;
    }
    if((*L).chead[p->j]==NULL)
     (*L).chead[p->j]=col[p->j]=p;
    else{
        col[p->j]->down=p;
     col[p->j]=p;
    }
   }
   while(pn){
       p=(Link)malloc(sizeof(Node));
    if(!p)
     exit(0);
    (*L).tu++;
    p->i=i;
    p->j=pn->j;
    p->e=pn->e;
    p->right=NULL;
    pn=pn->right;
    if((*L).rhead[i]==NULL)
     (*L).rhead[i]=pq=p;
    else{
        pq->right=p;
     pq=p;
    }
    if((*L).chead[p->j]==NULL)
     (*L).chead[p->j]=col[p->j]=p;
    else{
        col[p->j]->down=p;
     col[p->j]=p;
    }
   }
   }
   for(j=1;j<=M.nu;j++)
    if(col[j])
     col[j]->down=NULL;
    free(col);
    return OK;
}

Status MulMatrix(Matrix M,Matrix N,Matrix *L)
{
      int i,j;
   ElemType e;
   Link pm,pn,p,q;
      if(M.nu!=N.mu)
    exit(0);
   (*L).mu=M.mu;
   (*L).nu=N.nu;
   (*L).tu=0;
      (*L).chead=(Link*)malloc((M.mu+1)*sizeof(Link));
   if(!(*L).chead)
  exit(0);
      for(j=1;j<=M.mu;j++)
  (*L).chead[j]=NULL;              //一定要先对所有的十字链表初始化,表示成数组形式
   (*L).rhead=(Link*)malloc((N.nu+1)*sizeof(Link));
      if(!(*L).rhead)
      exit(0);
   for(j=1;j<=N.nu;j++)
    (*L).rhead[j]=NULL;

       for(i=1;i<=(*L).mu;i++)
     for(j=1;j<=(*L).nu;j++){
        q=N.chead[j];
     p=M.rhead[i];
     e=0;
     while(q&&p){
      printf("%d-----%d\n",p->j,q->i);
      if(p->j>q->i)
       q=q->down;
      else if(q->i>p->j)
       p=p->right;
      else { 
            e+=p->e*q->e;
         p=p->right;
         q=q->down;
      }
     }
     printf("%d,%d,%d*****\n",i,j,e);
     if(e!=0){
        (*L).tu++;
     pm=(Link)malloc(sizeof(Node));
     if(!pm)
      exit(0);
                 pm->i=i;
     pm->j=j;
     pm->e=e;
     pm->down=NULL;
     pm->right=NULL;
                 if((*L).rhead[i]==NULL)
       (*L).rhead[i]=pn=pm;
        else{
          pn->right=pm;
       pn=pm;
     }
        if((*L).chead[j]==NULL)
       (*L).chead[j]=pm;
        else{
          pn=(*L).chead[j];
       while(pn->down)
        pn=pn->down;
       pn->down=pm;
     }
     }
     }
     return OK;    
}

“main.h”

#include"a.h"
#include"b.h"

void main()
{
    Matrix M,N,L;
 InitMatrix(&M);
 InitMatrix(&N);
 InitMatrix(&L);
 CreateMatrix(&M);
 PrintMatrix(M);
   
 CreateMatrix(&N);
 PrintMatrix(N);
 AddMatrix(M,N,&L);
 PrintMatrix(L);
 MulMatrix(M,N,&L);
 PrintMatrix(L);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值