十字链表实现稀疏矩阵相加
接着上篇继续写的,思路是自己想的,其实也挺简单的
欢迎指出错误
这一次还是从相应的文件中读取数据,测试时请在相应目录放入相应文件(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的世界是简单的