矩阵的十字链表

来源:互联网 发布:windows程序设计.chm 编辑:程序博客网 时间:2024/04/29 08:26

矩阵的十字链表


矩阵的十字链表

“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;
     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);
    returnOK;
}

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;
    }
    }
    }
    returnOK;    
}

“main.h”

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

void main()
{
    MatrixM,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
原创粉丝点击