主题:关于十字链表的疑问
以下是一个实现建立十字链表并按照其行方式打印程序代码:
typedef struct matnode
{
int row,col;
struct matnode *right,*down'
union
{
int val;
struct matnode *next;
}tag;
}MType;
MType *createmat()
{
int m,n,t,s,r,c,v;
MType *h[100],*p,*q;
printf("row m,cpl n,Not 0 t:");
scnf("%d,%d,%d,&m,&n,&t");
p=(MType *)malloc(sizeof(MType));
h[0]=p;
p->row=m;
p->col=n;
s=m>n?m:n;
for(i=1;i<=s;i++)
{
p=(MType *)malloc(sizeof(MType));
h[i]=p;
h[i-1]->tag.nest=p;
p->row=p->col=0;
p->down=p->right;
}
h[s]->tag.next=h[0];
for(i=1;i<=t;i++)
{
printf("\t第%d个元素(行号r,列号c,值v):",i);
scnf("%d,%d,%d,&r,&c,&v");
p=(MType *)malloc(sizeof(MType));
p->row=r;
p->col=c;
p->tag.val=v;
q=h[r];
while(q->right!h[r]&&q->right->col<c)
q=q->right;
p->right=q->right;
q->right=p;
q=h[c];
while(q->right!=h[c]&&q->down->row<r)
q=q->down;
p->down=q->down;
p->down=p;
}
return(h[o]);
}
void prmat(MType *hm)
{
MType *p,*q;
printf("\n按行表输入矩阵元素:\n");
printf("row=%d col=%d\n,hm->row,hm->col");
p=hm->tag.next;
while(p!=hm)
{
q=p->right;
while(p!=q)
{
printf("\t%d,%d,%d\n",q->row,q->col,q->tag.val);
q=q->right;
}
p=p->tag.next;
}
}
main()
{
MType *hm;
hm=createmat();
prmat(hm);
}
我有两个疑问想请教大家。
第一:
for(i=1;i<=s;i++)
{
p=(MType *)malloc(sizeof(MType));
h[i]=p;
h[i-1]->tag.nest=p;
p->row=p->col=0;
p->down=p->right;
}
h[s]->tag.next=h[0];
这一段代码实现的是生成表头指针数组,按常规来说,应该生成行与列的表头指针数组,但是这一段程序似乎只能生成列?
第二:
q=h[r];
while(q->right!h[r]&&q->right->col<c)
q=q->right;
p->right=q->right;
q->right=p;
q=h[c];
这一段程序是将新生成的结点p插入r行的尾部吗?
typedef struct matnode
{
int row,col;
struct matnode *right,*down'
union
{
int val;
struct matnode *next;
}tag;
}MType;
MType *createmat()
{
int m,n,t,s,r,c,v;
MType *h[100],*p,*q;
printf("row m,cpl n,Not 0 t:");
scnf("%d,%d,%d,&m,&n,&t");
p=(MType *)malloc(sizeof(MType));
h[0]=p;
p->row=m;
p->col=n;
s=m>n?m:n;
for(i=1;i<=s;i++)
{
p=(MType *)malloc(sizeof(MType));
h[i]=p;
h[i-1]->tag.nest=p;
p->row=p->col=0;
p->down=p->right;
}
h[s]->tag.next=h[0];
for(i=1;i<=t;i++)
{
printf("\t第%d个元素(行号r,列号c,值v):",i);
scnf("%d,%d,%d,&r,&c,&v");
p=(MType *)malloc(sizeof(MType));
p->row=r;
p->col=c;
p->tag.val=v;
q=h[r];
while(q->right!h[r]&&q->right->col<c)
q=q->right;
p->right=q->right;
q->right=p;
q=h[c];
while(q->right!=h[c]&&q->down->row<r)
q=q->down;
p->down=q->down;
p->down=p;
}
return(h[o]);
}
void prmat(MType *hm)
{
MType *p,*q;
printf("\n按行表输入矩阵元素:\n");
printf("row=%d col=%d\n,hm->row,hm->col");
p=hm->tag.next;
while(p!=hm)
{
q=p->right;
while(p!=q)
{
printf("\t%d,%d,%d\n",q->row,q->col,q->tag.val);
q=q->right;
}
p=p->tag.next;
}
}
main()
{
MType *hm;
hm=createmat();
prmat(hm);
}
我有两个疑问想请教大家。
第一:
for(i=1;i<=s;i++)
{
p=(MType *)malloc(sizeof(MType));
h[i]=p;
h[i-1]->tag.nest=p;
p->row=p->col=0;
p->down=p->right;
}
h[s]->tag.next=h[0];
这一段代码实现的是生成表头指针数组,按常规来说,应该生成行与列的表头指针数组,但是这一段程序似乎只能生成列?
第二:
q=h[r];
while(q->right!h[r]&&q->right->col<c)
q=q->right;
p->right=q->right;
q->right=p;
q=h[c];
这一段程序是将新生成的结点p插入r行的尾部吗?