矩阵(十字链表)

 就做了创建,加法还有输出,减法与加法类似``

 

  1. #include<iostream>
  2. #include<malloc.h>
  3. using namespace std;
  4. #define OK 1
  5. #define ERROR 0
  6. #define OVERFLOW -2
  7. typedef int Status;
  8. typedef struct OLNode{
  9.         int i,j;
  10.         int e;
  11.         struct OLNode *right,*down;
  12.         }OLNode,*OLink;
  13. typedef struct{
  14.         OLink *rhead,*chead;
  15.         int mu,nu,tu;
  16.         }CrossList;
  17.         
  18. Status CreateSMatrix_OL(CrossList &M){
  19.       cin>>M.mu>>M.nu>>M.tu;
  20.       M.rhead=(OLink*)malloc((M.mu+1)*sizeof(OLink));
  21.       M.chead=(OLink*)malloc((M.nu+1)*sizeof(OLink));
  22.       if(!M.rhead||!M.chead) return ERROR;
  23.       int k=1,i,j,e;
  24.       OLink p,q;
  25.       for(;k<=M.mu;k++)
  26.               M.rhead[k]=NULL;
  27.       for(k=1;k<=M.nu;k++)
  28.               M.chead[k]=NULL;        
  29.       k=0;
  30.       while(k<M.tu)
  31.       {
  32.          cin>>i>>j>>e;
  33.          p=(OLink)malloc(sizeof(OLNode));
  34.          if (!p) return ERROR;
  35.          p->i=i;p->j=j;p->e=e;  p->down=NULL;  p->right=NULL;
  36.          if(M.rhead[i]==NULL||M.rhead[i]->j>j){
  37.           p->right=M.rhead[i];
  38.           M.rhead[i]=p;} 
  39.          else {
  40.              for(q=M.rhead[i];(q->right)&&(q->right->j<j);q=q->right);
  41.              p->right=q->right;q->right=p;}
  42.          if(M.chead[j]==NULL||M.chead[j]->i>i){
  43.           p->down=M.chead[j];
  44.           M.chead[j]=p;} 
  45.          else {
  46.              for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down);
  47.              p->down=q->down;q->down=p;}
  48.         k++;      }
  49.          return OK; }
  50. Status AddSMatrix_OL(CrossList &A,CrossList &B){
  51.        if(!(A.mu==B.mu&&A.nu==B.nu)) return ERROR;
  52.        OLink pa,pb,pre,pp;
  53.        for(int row=1;row<=A.mu;row++)
  54.        for(pre=NULL,pa=A.rhead[row],pb=B.rhead[row];pb;)
  55.        {
  56.               if(pa==NULL||pa->j>pb->j){
  57.                                         if(!pre) 
  58.                                              {A.rhead[row]=pb;pb->right=pa;pa=pb;}
  59.                                         else 
  60.                                              {pre->right=pb; pb->right=pa;}                        
  61.                                         
  62.                                         if(!A.chead[pb->j]||A.chead[pb->j]->i>pb->i) { pb->down=A.chead[pb->j];A.chead[pb->j]=pb;}
  63.                                         else {
  64.                                              for(pp=A.chead[pb->j];(pp->down)&&(pp->down->i<pb->i);pp=pp->down);
  65.                                              pb->down=pp->down;pp->down=pb;}
  66.                                       if(!pa){ pre=pa;pa=pa->right;}
  67.                                                 pb=pb->right;   }
  68.              else if(pa->j < pb->j)   {pre=pa;pa=pa->right;}
  69.              else  {
  70.                                     int sum=pa->e+pb->e;
  71.                                     if(sum) {pa->e=sum;pre=pa;}
  72.                                     else {
  73.                                          pre->right=pa->right;
  74.                                          for(pp=A.chead[pa->j];pp->down&&(pp->down->i)<pa->j;pp=pp->down);
  75.                                             pp->down=pa->down;
  76.                                          }
  77.                                          pa=pa->right;
  78.                                          pb=pb->right;        }
  79.        }
  80.        return OK;
  81.        }
  82. void Print(CrossList A)
  83. {
  84.      int col;
  85.      for(int row=1;row<=A.mu;row++)
  86.      {
  87.             col=1;
  88.             for(OLink pa=A.rhead[row];pa;pa=pa->right)
  89.             { while(col<pa->j)
  90.                  {
  91.                     cout<<"0"<<" ";
  92.                     col++; } 
  93.             cout<<pa->e<<" ";col++;}
  94.             
  95.             while(col<=A.nu)
  96.             {
  97.             cout<<"0"<<" ";
  98.             col++;}
  99.             cout<<endl;    
  100.             }
  101. }
  102. int main()
  103. {
  104.    CrossList A,B;
  105.    
  106.    CreateSMatrix_OL(A);
  107.    Print(A);
  108.    
  109.    CreateSMatrix_OL(B);
  110.    Print(B);
  111.    
  112.    AddSMatrix_OL(A,B);
  113.    Print(A);
  114.    
  115.    return 0;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Java实现稀疏矩阵十字链表储存的示例代码: ```java //定义节点类 class OLNode { int row, col; int val; OLNode right, down; } //定义十字链表类 class CrossList { int rows, cols, nums; OLNode[] rowHeads, colHeads; //构造函数 public CrossList(int[][] matrix) { rows = matrix.length; cols = matrix[0].length; rowHeads = new OLNode[rows]; colHeads = new OLNode[cols]; //初始化行列头节点 for (int i = 0; i < rows; i++) { rowHeads[i] = new OLNode(); rowHeads[i].row = i; rowHeads[i].right = rowHeads[i]; } for (int j = 0; j < cols; j++) { colHeads[j] = new OLNode(); colHeads[j].col = j; colHeads[j].down = colHeads[j]; } //遍历矩阵,创建节点并插入十字链表 for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { if (matrix[i][j] != 0) { OLNode node = new OLNode(); node.row = i; node.col = j; node.val = matrix[i][j]; //插入行链表 OLNode p = rowHeads[i]; while (p.right != rowHeads[i] && p.right.col < j) { p = p.right; } node.right = p.right; p.right = node; //插入列链表 p = colHeads[j]; while (p.down != colHeads[j] && p.down.row < i) { p = p.down; } node.down = p.down; p.down = node; nums++; } } } } //打印十字链表 public void print() { for (int i = 0; i < rows; i++) { OLNode p = rowHeads[i].right; for (int j = 0; j < cols; j++) { if (p != rowHeads[i] && p.col == j) { System.out.print(p.val + " "); p = p.right; } else { System.out.print("0 "); } } System.out.println(); } } } //测试代码 public class Main { public static void main(String[] args) { int[][] matrix = {{1, 0, 0, 0}, {0, 2, 0, 0}, {0, 0, 3, 0}, {0, 0, 0, 4}}; CrossList crossList = new CrossList(matrix); crossList.print(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值