十字链表压缩矩阵有问题

uu们麻烦看看为什么我的代码编译出来会是这样,为什么在前面的循环打印的时候是没有问题的,但是之后会无法显示呢?
我这个代码是直接把矩阵压缩了
我在前面的循环中利用w遍历rheadi并没有问题
但是后面的循环就不行了
为什么呢

#include<iostream>
using namespace std;
typedef struct Node
{
    int row,col;
    int item;
    Node *right,*down;
}Node;
class CrossList
{public:
    CrossList(int m,int n);
    ~CrossList();
    void InitS();
private:
    Node *rhead,*chead;//行,列链表数组基地址
    int rows,cols,num;
};
CrossList::CrossList(int m,int n)
{
    rows=m;cols=n;num=0;
}
CrossList::~CrossList()
{
    delete [] rhead;
    delete [] chead;
}
void CrossList::InitS()
{
    int m=0,n=0,num=0;
    int a[rows][cols];
  int f1[rows],f2[cols];
  f1[0]=0;f2[0]=0;
  cout<<"请输入矩阵"<<endl;
  for(int i=0;i<rows;i++)
   {
       for(int j=0;j<cols;j++)
         {
             cin>>a[i][j];
             if(a[i][j]!=0)
             {
                 f1[i]=1;f2[j]=1;
                 num++;
             }
         }
   }
    for(int i=0;i<rows;i++)
   {
       if(f1[i]!=0)
         {m++;f1[i]=0;}
   }
    for(int i=0;i<cols;i++)
   {
        if(f2[i]!=0)
          {n++;f2[i]=0;}
   }
   rhead=new Node[m];
   chead=new Node[n];
   int k=0;
   for(int i=0;i<rows;i++)
   {
       for(int j=0;j<cols;j++)
         {
             if(a[i][j]!=0)
             {
                 Node t[num],*p,*q;
                 t[k].row=i;t[k].col=j;
                 t[k].item=a[i][j];
                 t[k].right=NULL;
                 t[k].down=NULL;
                 p=rhead+i;
                 q=chead+j;
                 if(f1[i]==0)
                    {*p=t[k];f1[i]=1;}
                 else
                 {
                     while(p->right!=NULL)
                       p=p->right;
                     p->right=t+k;
                     p=p->right;
                     //Node *w=rhead+i;
                     //while(w!=NULL)
                      //{cout<<w->row<<" "<<w->col<<" "<<w->item<<endl;w=w->right;}
                 }
                 if(f2[j]==0)
                    {*q=t[k];f2[j]=1;}
                 else
                 {
                     while(q->down!=NULL)
                       q=q->down;
                     q->down=t+k;
                 }
                 k++;
             }
        }
   }
   for(int i=0;i<num;i++)
    {
         Node *w=rhead+i;
        for(int j=0;j<cols&&w!=NULL;j++)
      {
            cout<<w->row<<" "<<w->col<<" "<<w->item<<endl;
            w=w->right;
        }
    }
   cout<<"压缩结果如上"<<endl;
}
int main()
{
    int m,n;
    cout<<"请输入创建矩阵行数:";
    cin>>m;
    cout<<"请输入创建矩阵列数:";
    cin>>n;
    CrossList c1(m,n);
    int i,j;
    c1.InitS();
    return 0;
}