orthogonal list

#include <iostream>
#include <fstream>
#define Rownum 4
#define Colnum 4
int a[4][4]={{1,3,0,3},
{4,0,3,2},
{5,0,2,1},
{3,3,1,4}};
using namespace std;

typedef struct node
{
   int data; //the data on each node
   node*right;
    node*down;//define the direction vector 
    node*next;
   int col;
   int row;
}*crosslist;

crosslist p[5];
void initialization( )
{
      p[0]=new node;
 crosslist q=new node;
 p[0]->data=0;
 p[0]->row= Rownum;
 p[0]->col=Colnum;
 p[0]->next=p[0];
 p[0]->right= p[0];
 p[0]->down=p[0];
 q= p[0];
 for(int i=1;i<=4;i++)
 {       
  p[i]=new node;
  p[i]->col=0;
  p[i]->row=0;
  p[i]->data=0;
  p[i]->next=q->next;
  q->next=p[i];
  q=p[i];
  p[i]->right=p[i];
  p[i]->down=p[i];
}

}

void buildlist(crosslist pnew)//start the cross linklist
{   
     
     int m, n;
     m= pnew->col;
     n=pnew->row;
     crosslist p1=p[n];
     
     while (p1->right!=p[n]&&p1->right->col<m)
     
       { p1=p1->right;
       }
      pnew->right=p1->right;
      p1->right=pnew;
      
      
       crosslist p2=p[m];
      while(p2->down!=p[m]&&p2->down->row<n)
     {
      p2=p2->down;
      }
      pnew->down=p2->down;
      p2->down=pnew;
      
      }
void getval( )//insert value into the down and the right linklist
{     
      crosslist p0,q;
      

       
      int i,j;
     for(i=0;i<=3;i++)
      {for(j=0;j<=3;j++)
        {
           if(a[i][j]!=0)
        {   p0=new node;
            p0->row=i;
            p0->col=j;
            p0->data=a[i][j];
          
            p0->right=p0;
            p0->down=p0;
              buildlist(p0);
            }
        }
        }
}


void output()//print the value by collum
{   int i,m,n,k;
     crosslist p3;
     
  for(i=1;i<=4;i++)
  {  
   p3=p[i];
  while(p3->down!=p[i])
  {    m=p3->down->data;
       n=p3->down->row;
       k=p3->down->col;
    cout<<m<<","<<n<<","<<k<<endl;
    cout<<endl;
       p3=p3->down;
       }
}
}

int main()
{
    initialization( );
    getval();
     output();
     system("pause");
     return 0;
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值