建立十字链表
第一次看的时候没看懂这里,几个月后回来温习,彻底搞懂了!
完整思路:http://blog.csdn.net/zhuyi2654715/article/details/6729783
大神讲的非常清楚,一下子就看懂了!
下面贴上自己写的代码,代码纯手写,没有参考别人或者书上,可能有瑕疵,欢迎指出!
注意,由于我是从相应的文件中读取数据,测试时请在相应目录放入相应文件(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 int Display(CrossList M) 100 { 101 int k; 102 OLink p; 103 for(k=1;k<=M.mu;k++) 104 { 105 p=M.rhead[k]; 106 while(p) 107 { 108 cout<<"("<<k<<","<<p->j<<") "<<"e="<<p->e<<endl; 109 p=p->right; 110 } 111 } 112 cout<<endl; 113 return 0; 114 } 115 int main() 116 { 117 freopen( "input.txt", "r", stdin );//从input.txt中读取数据 118 CrossList M1,M2; 119 CreateSMatrix_OL(M1); 120 CreateSMatrix_OL(M2); 121 Display(M1); 122 Display(M2); 123 fclose(stdin); 124 return 0; 125 }
只有0和1的世界是简单的