首页 > 代码库 > Olink 十字链表的实现
Olink 十字链表的实现
1 /*////////////////////////////////// 2 BY WEI 3 2014-10-27 4 //////////////////////////////////*/ 5 #include <iostream> 6 #include <fstream> 7 #include <string> 8 #include <iomanip> 9 using namespace std; 10 typedef int ElemTp; 11 typedef struct OL 12 { 13 int i,j; 14 ElemTp v; 15 struct OL *right, *down; 16 }*OLink,OLNode; 17 18 OLink CreatOL(int m,int n) 19 { 20 OLink head=new OLNode; 21 head->i=m,head->j=n; 22 OLink q=head; 23 for(int i=0; i<m; i++) 24 { 25 OLink p=new OLNode; 26 p->right=p; 27 p->j=-1; 28 p->i=i; 29 q->down=p; 30 q=p; 31 } 32 q->down=head; 33 q=head; 34 for(int i=0; i<n; i++) 35 { 36 OLink p=new OLNode; 37 p->down=p; 38 p->j=i; 39 p->i=-1; 40 q->right=p; 41 q=p; 42 } 43 q->right=head; 44 q=head->right; 45 return head; 46 } 47 void DeleteOL(OLink head,int i,int j) 48 { 49 if(i<0||j<0||i>head->i-1||j>head->j-1) 50 return ; 51 OLink q,p; 52 p=head->right; 53 while(p!=head&&p->j!=j) 54 p=p->right; 55 q=p->down; 56 OLink q_down=p; 57 while(q!=p&&q->i!=i) 58 { 59 q=q->down; 60 q_down=q_down->down; 61 } 62 if(q==p) 63 return; 64 p=head->down; 65 while(p!=head&&p->i!=i) 66 p=p->down; 67 q=p->right; 68 OLink q_right=p; 69 while(q!=p&&q->j!=j) 70 { 71 q=q->right; 72 q_right=q_right->right; 73 } 74 if(q==p) 75 return ; 76 OLink temp=q_down->down; 77 q_down->down=q_down->down->down; 78 q_right->right=q_right->right->right; 79 delete temp; 80 } 81 82 bool InsertOL(OLink head,int i,int j,int value) 83 { 84 if(value=http://www.mamicode.com/=0) 85 { 86 DeleteOL(head,i,j); 87 return true; 88 } 89 DeleteOL(head,i,j); 90 int m=head->i,n=head->j; 91 if(i<0||j<0||i>m-1||j>n-1) 92 return false; 93 OLink p=head->right; 94 while(p->j!=j) 95 p=p->right; 96 OLink q=p->down; 97 OLink s=p; 98 while(q!=p&&q->i<i) 99 {100 q=q->down;101 s=s->down;102 }103 q=s;104 OLink temp=new OLNode;105 temp->i=i,temp->j=j,temp->v=value;106 OLink tt=q->down;107 q->down=temp;108 temp->down=tt;109 p=head->down;110 while(p->i!=i)111 p=p->down;112 q=p->right;113 s=p;114 while(q!=p&&q->j<j)115 {116 q=q->right;117 s=s->right;118 }119 q=s;120 tt=q->right;121 q->right=temp;122 temp->right=tt;123 return true;124 }125 void DisplayOL(OLink head)126 {127 OLink p=head->down;128 while(p!=head)129 {130 OLink q=p->right;131 while(q!=p)132 {133 cout<<setw(3)<<q->i<<" "<<setw(3)<<q->j<<" "<<setw(4)<<q->v<<endl;134 q=q->right;135 }136 p=p->down;137 }138 }139 void Show(OLink head)140 {141 OLink p=head->down;142 int i=0;143 while(i<head->i)144 {145 int j=0;146 OLink q=p->right;147 while(j<head->j)148 {149 if(q->j==j)150 {151 cout<<setw(3)<<q->v<<" ";152 q=q->right;153 }154 else155 cout<<" 0 ";156 j++;157 }158 p=p->down;159 i++;160 cout<<endl;161 }162 }163 OLink Read_Text(void)164 {165 string path;166 cout<<"please input path:";167 cin>>path;168 ifstream in(path);169 if(!in)170 {171 cout<<"Can not open file"<<endl;172 return NULL;173 }174 int m,n;175 in>>m>>n;176 OLink head=CreatOL(m,n);177 int i,j,value;178 while(in>>i>>j>>value)179 {180 InsertOL(head,i,j,value);181 }182 return head;183 }184 185 void DeleteOL(OLink head)186 {187 OLink p=head->down;188 while(p!=head)189 {190 OLink q=p->right;191 while(q!=p)192 {193 OLink t=q->right;194 delete q;195 q=t;196 }197 OLink t=p->down;198 delete p;199 p=t;200 }201 p=head->right;202 while(p!=head)203 {204 OLink t=p->right;205 delete p;206 p=t;207 }208 delete head;209 }210 OLink Locate(OLink head,int i,int j)211 {212 if(i<0||j<0||i>head->i-1||j>head->j-1)213 return NULL;214 OLink p=head->down;215 for(int k=0; k!=i; k++)216 {217 p=p->down;218 }219 OLink q=p->right;220 while(q!=p)221 {222 if(q->j==j)223 break;224 q=q->right;225 }226 if(q->i==i&&q->j==j)227 return q;228 return NULL;229 }230 void TransformOL(OLink head)231 {232 int m=head->i,n=head->j;233 if(m>n)234 {235 OLink p=head;236 while(p->right!=head)237 {238 p=p->right;239 }240 for(int i=1; i<=m-n; i++)241 {242 OLink q=new OLNode;243 q->j=n-1+i;244 q->i=-1;245 q->down=q;246 p->right=q;247 q->right=head;248 p=q;249 }250 }251 else252 {253 if(n>m)254 {255 OLink p=head;256 while(p->down!=head)257 {258 p=p->down;259 }260 for(int i=1; i<=n-m; i++)261 {262 OLink q=new OLNode;263 q->i=m-1+i;264 q->j=-1;265 q->right=q;266 p->down=q;267 q->down=head;268 p=q;269 }270 }271 }272 int mm=max(m,n);273 head->i=mm,head->j=mm;274 OLink p=head->down;275 for(int i=0; i<mm; i++)276 for(int j=0; j<i; j++)277 {278 OLink a=Locate(head,i,j);279 OLink b=Locate(head,j,i);280 ElemTp aa;281 if(!a)282 aa=0;283 else284 aa=a->v;285 ElemTp bb;286 if(!b)287 bb=0;288 else289 bb=b->v;290 InsertOL(head,i,j,bb);291 InsertOL(head,j,i,aa);292 }293 if(n>m)294 {295 p=head;296 for(int i=0; i<n; i++)297 p=p->right;298 OLink ttt=p;299 p=p->right;300 ttt->right=head;301 for(int i=0; i<m-n; i++)302 {303 OLink t=p->down;304 while(t->down!=p)305 {306 OLink tp=t->down;307 delete t;308 t=tp;309 }310 t=p->right;311 delete p;312 p=t;313 }314 }315 else316 {317 if(m>n)318 {319 p=head;320 for(int i=0; i<m; i++)321 p=p->down;322 OLink ttt=p;323 p=p->down;324 ttt->down=head;325 for(int i=0; i<n-m; i++)326 {327 OLink t=p->right;328 while(t!=p)329 {330 OLink tp=t->right;331 delete t;332 t=tp;333 }334 t=p->down;335 delete p;336 p=t;337 }338 }339 }340 head->i=n,head->j=m;341 }342 int main(int a[],char *arg)343 {344 OLink head=Read_Text();345 Show(head);346 cout<<"Transform"<<endl;347 TransformOL(head);348 Show(head);349 DeleteOL(head);350 return 0;351 }
Olink 十字链表的实现
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。