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==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             else
155                 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     else
252     {
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             else
284                 aa=a->v;
285             ElemTp bb;
286             if(!b)
287                 bb=0;
288             else
289                 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     else
316     {
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 }

 

转载于:https://www.cnblogs.com/rzwei/p/4066440.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值