#include<iostream>
#include<malloc.h>
using namespace std;
#define M 4 //行数
#define N 4 //列数
typedef struct mtxn
{
int row;
int col;
struct mtxn *right,*down;
union
{
int value;
struct mtxn *link;
}tag;
}MatNode;
void print(MatNode *&lq);
void Create(MatNode *&lq);
void print1(MatNode *&lq);
int main()
{
MatNode *lp;
Create(lp);
print(lp);
print1(lp);
return 0;
}
void Create(MatNode *&lq)
{
MatNode *p,*s,*q,*p1,*q1,*tc;
int i=0;
int j;
char ch;
lq=(MatNode *)malloc(sizeof(MatNode));//总的头结点
lq->col=N;
lq->row=M;
lq->tag.link=lq;
p=lq;
while(i<N)//把行和列头结点初始化完毕(行和列共用一个头结点,行数与列数相同)
{
s=(MatNode *)malloc(sizeof(MatNode));
s->down=s;
s->right=s;
//s->tag.link=p->tag.link;
p->tag.link=s;
p=s;
i++;
}
p->tag.link=lq;
cout<<"按列初始化"<<endl;
i=1;
q=lq->tag.link;
tc=q;
while(q!=lq)//先按列进行初始化
{
cout<<"是否初始化第"<<i<<"列(y/n)"<<endl;
cin>>ch;
if(ch=='y'||ch=='Y')
{
cout<<"输入初始化的个数:";
cin>>j;
while(j--)
{
s=(MatNode *)malloc(sizeof(MatNode));
cout<<"请输入行号:";
cin>>s->row;
cout<<""<<"请输入列号:";
cin>>s->col;
cout<<""<<"请输入该位置的数值:";
cin>>s->tag.value;
tc->down=s;
tc=s;
}
tc->down=q;
}
q=q->tag.link;//初始化下一列
tc=q;
i++;
}
q1=lq->tag.link;
q=q1;
tc=q;
i=1;
p1=q1->down;
while(q!=lq)//再把属于同一行的元素连在一起
{
while(q1!=lq)
{
while(p1!=q1)
{
if(p1!=q1&&p1->row==i)//每一列至多一个满足
{
p1->right=tc->right;
tc->right=p1;
tc=p1;
break;
}
p1=p1->down;
}
q1=q1->tag.link;//开始扫描下一列
p1=q1->down;
}
q=q->tag.link;///开始链接下一行
tc=q;//指向下一行的开头
q1=lq->tag.link;//从第一列扫描满足条件的结点
p1=q1->down;
i++;//行号加1
}
}
void print(MatNode *&lq)//按列输出
{
MatNode *p=lq->tag.link,*q;
while(p!=lq)
{
q=p->down;
while(q!=p)
{
cout<<"row:"<<q->row<<""<<"col:"<<q->col<<""<<"value:"<<q->tag.value<<endl;
q=q->down;
}
p=p->tag.link;
}
}
void print1(MatNode *&lq)//按行输出
{
MatNode *p=lq->tag.link,*q;
while(p!=lq)
{
q=p->right;
while(q!=p)
{
cout<<"row:"<<q->row<<""<<"col:"<<q->col<<""<<"value:"<<q->tag.value<<endl;
q=q->right;
}
p=p->tag.link;
}
}
#include<malloc.h>
using namespace std;
#define M 4 //行数
#define N 4 //列数
typedef struct mtxn
{
int row;
int col;
struct mtxn *right,*down;
union
{
int value;
struct mtxn *link;
}tag;
}MatNode;
void print(MatNode *&lq);
void Create(MatNode *&lq);
void print1(MatNode *&lq);
int main()
{
MatNode *lp;
Create(lp);
print(lp);
print1(lp);
return 0;
}
void Create(MatNode *&lq)
{
MatNode *p,*s,*q,*p1,*q1,*tc;
int i=0;
int j;
char ch;
lq=(MatNode *)malloc(sizeof(MatNode));//总的头结点
lq->col=N;
lq->row=M;
lq->tag.link=lq;
p=lq;
while(i<N)//把行和列头结点初始化完毕(行和列共用一个头结点,行数与列数相同)
{
s=(MatNode *)malloc(sizeof(MatNode));
s->down=s;
s->right=s;
//s->tag.link=p->tag.link;
p->tag.link=s;
p=s;
i++;
}
p->tag.link=lq;
cout<<"按列初始化"<<endl;
i=1;
q=lq->tag.link;
tc=q;
while(q!=lq)//先按列进行初始化
{
cout<<"是否初始化第"<<i<<"列(y/n)"<<endl;
cin>>ch;
if(ch=='y'||ch=='Y')
{
cout<<"输入初始化的个数:";
cin>>j;
while(j--)
{
s=(MatNode *)malloc(sizeof(MatNode));
cout<<"请输入行号:";
cin>>s->row;
cout<<""<<"请输入列号:";
cin>>s->col;
cout<<""<<"请输入该位置的数值:";
cin>>s->tag.value;
tc->down=s;
tc=s;
}
tc->down=q;
}
q=q->tag.link;//初始化下一列
tc=q;
i++;
}
q1=lq->tag.link;
q=q1;
tc=q;
i=1;
p1=q1->down;
while(q!=lq)//再把属于同一行的元素连在一起
{
while(q1!=lq)
{
while(p1!=q1)
{
if(p1!=q1&&p1->row==i)//每一列至多一个满足
{
p1->right=tc->right;
tc->right=p1;
tc=p1;
break;
}
p1=p1->down;
}
q1=q1->tag.link;//开始扫描下一列
p1=q1->down;
}
q=q->tag.link;///开始链接下一行
tc=q;//指向下一行的开头
q1=lq->tag.link;//从第一列扫描满足条件的结点
p1=q1->down;
i++;//行号加1
}
}
void print(MatNode *&lq)//按列输出
{
MatNode *p=lq->tag.link,*q;
while(p!=lq)
{
q=p->down;
while(q!=p)
{
cout<<"row:"<<q->row<<""<<"col:"<<q->col<<""<<"value:"<<q->tag.value<<endl;
q=q->down;
}
p=p->tag.link;
}
}
void print1(MatNode *&lq)//按行输出
{
MatNode *p=lq->tag.link,*q;
while(p!=lq)
{
q=p->right;
while(q!=p)
{
cout<<"row:"<<q->row<<""<<"col:"<<q->col<<""<<"value:"<<q->tag.value<<endl;
q=q->right;
}
p=p->tag.link;
}
}