zoukankan      html  css  js  c++  java
  • 十字链表实现稀疏矩阵相加

    接着上篇继续写的,思路是自己想的,其实也挺简单的

    欢迎指出错误

    这一次还是从相应的文件中读取数据,测试时请在相应目录放入相应文件(input.txt)

    测试数据和上篇一样:

    4 6 5

    1 2 3
    2 2 2
    2 4 5
    4 1 9
    4 6 1

    4 6 4

    1 3 7
    2 2 6
    2 4 -5
    3 2 4

    运行没有错误!

      1 #include <iostream>
      2 #include <malloc.h>
      3 #include <stdio.h>
      4 
      5 using namespace std;
      6 
      7 typedef struct OLNode
      8 {
      9     int i,j;
     10     int e;
     11     struct OLNode *right,*down;
     12 }OLNode,*OLink;
     13 
     14 typedef struct
     15 {
     16     OLink *rhead,*chead;
     17     int mu,nu,tu;
     18 }CrossList;
     19 
     20 int CreateSMatrix_OL(CrossList &M)
     21 {
     22     int i,j,k,e;
     23     OLink p,q,q1;
     24     cout<<"请分别输入该矩阵的行数,列数,所含非零元的个数:"<<endl;
     25     cin>>M.mu>>M.nu>>M.tu;
     26     if(!M.mu||!M.nu||!M.tu||M.mu*M.mu<M.tu) return 0;
     27     M.rhead=(OLink *)malloc((M.mu+1)*sizeof(OLink));//默认从第一行和第一列开始
     28     if(!M.rhead) return 0;
     29     M.chead=(OLink *)malloc((M.nu+1)*sizeof(OLink));
     30     if(!M.chead) return 0;
     31     for(k=1;k<=M.mu;k++) M.rhead[k]=NULL;
     32     for(k=1;k<=M.nu;k++) M.chead[k]=NULL;
     33     for(k=0;k<M.tu;k++)
     34     {
     35         cout<<"请输入当前元素在矩阵中的行号,列号,元素值:"<<endl;
     36         cin>>i>>j>>e;
     37         if(i<1||i>M.mu||j<1||j>M.nu||0==e) {cout<<"该元素输入错误!"; continue;}
     38         p=(OLink)malloc(sizeof(OLNode));
     39         p->i=i;
     40         p->j=j;
     41         p->e=e;
     42         //判断横行插入的位置
     43         if(!M.rhead[i]||M.rhead[i]->j>j)
     44         {
     45             p->right=M.rhead[i];
     46             M.rhead[i]=p;
     47         }
     48         else
     49         {
     50             q=M.rhead[i];
     51             q1=q->right;
     52             if(!q1) { q->right=p;p->right=NULL;}
     53             else
     54             {
     55                 while(q1->j<j)
     56                 {
     57                     q=q->right;
     58                     q1=q1->right;
     59                     if(!q1) break;
     60                 }
     61                 if(q1)
     62                 {
     63                     q->right=p;
     64                     p->right=q1;
     65                 }
     66                 else { q->right=p;p->right=NULL;}
     67             }
     68         }
     69         //判断纵行插入的位置
     70         if(!M.chead[j]||M.chead[j]->i>i)
     71         {
     72             p->down=M.chead[j];
     73             M.chead[j]=p;
     74         }
     75         else
     76         {
     77             q=M.chead[j];
     78             q1=q->down;
     79             if(!q1) { q->down=p;p->down=NULL;}
     80             else
     81             {
     82                 while(q1->i<i)
     83                 {
     84                     q=q->down;
     85                     q1=q1->down;
     86                     if(!q1) break;
     87                 }
     88                 if(q1)
     89                 {
     90                     q->down=p;
     91                     p->down=q1;
     92                 }
     93                 else { q->down=p;p->down=NULL;}
     94             }
     95         }
     96     }
     97     return 0;
     98 }
     99 
    100 
    101 int Display(CrossList M)
    102 {
    103     int k;
    104     OLink p;
    105     for(k=1;k<=M.mu;k++)
    106     {
    107         p=M.rhead[k];
    108         while(p)
    109         {
    110             cout<<"("<<k<<","<<p->j<<")  "<<"e="<<p->e<<endl;
    111             p=p->right;
    112         }
    113     }
    114     cout<<endl;
    115     return 0;
    116 }
    117 
    118 int Insert(CrossList M,OLink p)//把p所指向的节点插入到十字链表中
    119 {
    120     int i,j,e;
    121     OLink q,q1;
    122     i=p->i;
    123     j=p->j;
    124     e=p->e;
    125     if(i<1||i>M.mu||j<1||j>M.nu||0==e) cout<<"该元素插入错误!";
    126     if(!M.rhead[i]||M.rhead[i]->j>j)
    127     {
    128         p->right=M.rhead[i];
    129         M.rhead[i]=p;
    130     }
    131     else
    132     {
    133         q=M.rhead[i];
    134         q1=q->right;
    135         if(!q1) { q->right=p;p->right=NULL;}
    136         else
    137         {
    138             while(q1->j<j)
    139             {
    140                 q=q->right;
    141                 q1=q1->right;
    142                 if(!q1) break;
    143             }
    144             if(q1)
    145             {
    146                 q->right=p;
    147                 p->right=q1;
    148             }
    149             else { q->right=p;p->right=NULL;}
    150         }
    151     }
    152     //判断纵行插入的位置
    153     if(!M.chead[j]||M.chead[j]->i>i)
    154     {
    155         p->down=M.chead[j];
    156         M.chead[j]=p;
    157     }
    158     else
    159     {
    160         q=M.chead[j];
    161         q1=q->down;
    162         if(!q1) { q->down=p;p->down=NULL;}
    163         else
    164         {
    165             while(q1->i<i)
    166             {
    167                 q=q->down;
    168                 q1=q1->down;
    169                 if(!q1) break;
    170             }
    171             if(q1)
    172             {
    173                 q->down=p;
    174                 p->down=q1;
    175             }
    176             else { q->down=p;p->down=NULL;}
    177         }
    178     }
    179     return 0;
    180 }
    181 
    182 
    183 int Delete(CrossList M,OLink p)//把p所指向的节点从十字链表中删除
    184 {
    185     int i,j;
    186     OLink q,q1;
    187     i=p->i;
    188     j=p->j;
    189     q=M.rhead[i];
    190     q1=q->right;
    191     if(j==q->j)
    192     {
    193         M.rhead[i]->right=q->right;
    194         free(q);
    195     }
    196     else
    197     {
    198         while(q1->j!=j)
    199         {
    200             q=q->right;
    201             q1=q1->right;
    202         }
    203         q->right=q1->right;
    204         free(q1);
    205     }
    206     return 0;
    207 }
    208 
    209 
    210 OLink IsExist(CrossList M,OLink p)//判断p所指向的节点是否存在于M十字链表中
    211 {
    212     int i,j;
    213     OLink q;
    214     i=p->i;
    215     j=p->j;
    216     q=M.rhead[i];
    217     while(q)
    218     {
    219         if(j==q->j)  return q;
    220         else q=q->right;
    221     }
    222     return 0;
    223 }
    224 
    225 
    226 int SMatrix_Add(CrossList &M1,CrossList M2)
    227 {
    228     int k;
    229     OLink p,pr=NULL;
    230     if(M1.mu!=M2.mu||M1.nu!=M2.nu) return 0;
    231     for(k=1;k<=M2.mu;k++)//按M2逐行进行
    232     {
    233         p=M2.rhead[k];
    234         while(p)//每行用指针逐个后移
    235         {
    236             pr=IsExist(M1,p);
    237             if(!pr) Insert(M1,p);//如果p所指向的节点在M1中不存在,则直接插入M1
    238             else
    239             {
    240                 pr->e+=p->e;
    241                 if(!pr->e) Delete(M1,pr);
    242             }
    243             Display(M1);
    244             p=p->right;
    245         }
    246     }
    247     return 0;
    248 }
    249 
    250 
    251 int main()
    252 {
    253     freopen( "input.txt", "r", stdin );//从input.txt中读取数据
    254     CrossList M1,M2;
    255     CreateSMatrix_OL(M1);
    256     CreateSMatrix_OL(M2);
    257     Display(M1);
    258     Display(M2);
    259     SMatrix_Add(M1,M2);
    260     Display(M1);
    261     fclose(stdin);
    262     return 0;
    263 }
    只有0和1的世界是简单的
  • 相关阅读:
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    Can you answer these queries? HDU
    Count the Colors ZOJ
    Balanced Lineup POJ
  • 原文地址:https://www.cnblogs.com/nullxjx/p/6014110.html
Copyright © 2011-2022 走看看