十字链表实现稀疏矩阵相加

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

欢迎指出错误

这一次还是从相应的文件中读取数据,测试时请在相应目录放入相应文件(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 }

 

posted @ 2016-10-30 21:28  nullxjx  阅读(3257)  评论(2编辑  收藏  举报